From 93d7baa82ca0811370a19a3a4cd5f65d6e7a908f Mon Sep 17 00:00:00 2001 From: Serkan Korkmaz <77464572+serkor1@users.noreply.github.com> Date: Sat, 1 Jun 2024 00:15:34 +0200 Subject: [PATCH] Version `1.3.1` (#12) See https://github.com/serkor1/cryptoQuotes/blob/main/NEWS.md for more details. --- .Rbuildignore | 2 + .github/workflows/R-CMD-check.yaml | 4 +- .github/workflows/pkgdown.yaml | 4 +- .github/workflows/test-coverage.yaml | 27 +- DESCRIPTION | 7 +- NAMESPACE | 12 +- NEWS.Rmd | 336 +++++ NEWS.md | 369 ++++-- R/ATOM.R | 32 +- R/BTC.R | 30 +- R/DOGE.R | 31 +- R/FGIndex.R | 30 +- R/FUN.R | 57 +- R/api_binance.R | 71 +- R/api_bitmart.R | 82 +- R/api_bybit.R | 73 +- R/api_kraken.R | 182 +-- R/api_kucoin.R | 100 +- R/availableExchanges.R | 78 -- R/availableIntervals.R | 92 -- R/availableTickers.R | 74 -- R/available_exchanges.R | 60 +- R/available_intervals.R | 43 +- R/available_tickers.R | 34 +- R/chart.R | 499 +++---- R/chart_bollingerbands.R | 248 ++-- R/chart_donchian.R | 182 +++ R/chart_event.R | 217 ++-- R/chart_fgi.R | 174 ++- R/chart_indicators.R | 219 ---- R/chart_lsr.R | 174 +-- R/chart_ma.R | 1151 ++++++++--------- R/chart_macd.R | 242 ++-- R/chart_quote.R | 327 +++-- R/chart_rsi.R | 254 ++-- R/chart_smi.R | 203 +++ R/chart_volume.R | 123 +- R/cryptoQuotes-package.R | 2 - R/getFNG.R | 144 --- R/getLSRatio.R | 181 --- R/getQuote.R | 187 --- R/get_fgi.R | 71 +- R/get_fundingrate.R | 63 +- R/get_lsratio.R | 95 +- R/get_openinterest.R | 111 +- R/get_quote.R | 131 +- R/helper.R | 666 ++++++++-- R/pkg_startup.R | 256 ---- R/sysdata.rda | Bin 0 -> 5271 bytes R/utils.R | 22 +- R/zzz.R | 24 +- README.Rmd | 271 +++- README.md | 529 ++++++-- _pkgdown.yml | 96 +- codemeta.json | 266 ++++ cran-comments.md | 26 +- data-raw/ATOM.R | 3 +- data-raw/BTC.R | 2 +- data-raw/DOGE.R | 1 + data-raw/control_data.R | 70 + data/ATOM.rda | Bin 2559 -> 3161 bytes data/BTC.rda | Bin 2007 -> 1959 bytes data/DOGE.rda | Bin 2534 -> 1699 bytes data/FGIndex.rda | Bin 1876 -> 1860 bytes man/ATOM.Rd | 42 +- man/BTC.Rd | 42 +- man/DOGE.Rd | 42 +- man/FGIndex.Rd | 36 +- man/GET.Rd | 32 +- man/add_event.Rd | 90 +- man/alma.Rd | 89 +- man/assert.Rd | 122 +- man/availableExchanges.Rd | 61 - man/availableIntervals.Rd | 75 -- man/availableTickers.Rd | 62 - man/available_exchanges.Rd | 51 +- man/available_intervals.Rd | 67 +- man/available_tickers.Rd | 35 +- man/bollinger_bands.Rd | 85 +- man/calibrate_window.Rd | 34 +- man/chart.Rd | 113 +- man/chart_layout.Rd | 47 + man/convert_date.Rd | 1 + man/default_dates.Rd | 13 +- man/dema.Rd | 91 +- man/donchian_channel.Rd | 90 ++ man/ema.Rd | 92 +- man/evwma.Rd | 87 +- man/examples/devtools_flatten.R | 6 - man/examples/scr_FGIndex.R | 5 - man/examples/scr_FUN.R | 30 +- man/examples/scr_GET.R | 31 +- man/examples/scr_LSR.R | 44 +- man/examples/scr_MAindicator.R | 13 + man/examples/scr_addEvents.R | 39 +- man/examples/scr_assert.R | 114 +- man/examples/scr_availableExchanges.R | 18 +- man/examples/scr_availableIntervals.R | 14 +- man/examples/scr_availableTickers.R | 12 +- man/examples/scr_chartFGIndex.R | 34 + man/examples/scr_chartLSR.R | 37 + man/examples/scr_charting.R | 45 +- man/examples/scr_getFundingrate.R | 13 +- man/examples/scr_getOpeninterest.R | 12 +- man/examples/scr_getQuote.R | 42 +- man/examples/scr_klinechart.R | 14 + man/examples/scr_ohlcchart.R | 14 + man/examples/scr_plinechart.R | 14 + man/fetch.Rd | 35 +- man/fgi.Rd | 76 +- man/figures/NEWS-unnamed-chunk-2-1.png | Bin 0 -> 55095 bytes man/figures/NEWS-unnamed-chunk-4-1.png | Bin 0 -> 52705 bytes man/figures/NEWS-unnamed-chunk-5-1.png | Bin 0 -> 66875 bytes .../README-chartquote(deficiency)-1.png | Bin 0 -> 131573 bytes .../README-chartquote(deficieny)-1.png | Bin 0 -> 72655 bytes man/figures/README-chartquote-1.png | Bin 97406 -> 132952 bytes man/figures/README-unnamed-chunk-3-1.png | Bin 0 -> 86298 bytes man/flatten.Rd | 7 +- man/getFGIndex.Rd | 83 -- man/getLSRatio.Rd | 124 -- man/getQuote.Rd | 105 -- man/get_fgindex.Rd | 74 +- man/get_fundingrate.Rd | 50 +- man/get_lsratio.Rd | 112 +- man/get_openinterest.Rd | 66 +- man/get_quote.Rd | 104 +- man/hma.Rd | 87 +- man/is.date.Rd | 6 +- man/kline.Rd | 65 +- man/lsr.Rd | 62 +- man/macd.Rd | 87 +- man/ohlc.Rd | 65 +- man/pline.Rd | 48 + man/remove_bound.Rd | 37 +- man/rsi.Rd | 96 +- man/sma.Rd | 87 +- man/smi.Rd | 128 ++ man/split_window.Rd | 42 +- man/volume.Rd | 70 +- man/vwap.Rd | 98 +- man/wma.Rd | 88 +- man/zlema.Rd | 88 +- pkgdown/extra.css | 73 -- pkgdown/extra.js | 10 - pkgdown/index.Rmd | 148 +++ pkgdown/index.md | 312 +++++ tests/testthat/test-FGIndex.R | 41 + tests/testthat/test-FUN.R | 6 + tests/testthat/test-availableTickers.R | 8 +- tests/testthat/test-charting.R | 93 +- tests/testthat/test-getFNG.R | 7 +- tests/testthat/test-getFundingrate.R | 10 +- tests/testthat/test-getLSRatio.R | 2 +- tests/testthat/test-getOpeninterest.R | 20 +- tests/testthat/test-getQuote.R | 9 +- tests/testthat/test-infer_interval.R | 107 ++ tests/testthat/test-is-date.R | 48 + tests/testthat/test-kraken.R | 237 ++++ .../{00-introduction.Rmd => 01-article.Rmd} | 96 +- .../{02-charting.Rmd => 02-article.Rmd} | 26 +- .../{03-timezones.Rmd => 03-article.Rmd} | 17 +- .../{04-converting.Rmd => 04-article.Rmd} | 42 +- .../{05-quantmod.Rmd => 05-article.Rmd} | 43 +- vignettes/cryptoQuotes.Rmd | 233 ++-- vignettes/custom_indicators.Rmd | 413 ++++++ vignettes/usecase.Rmd | 154 +++ 166 files changed, 8882 insertions(+), 6373 deletions(-) create mode 100644 NEWS.Rmd delete mode 100644 R/availableExchanges.R delete mode 100644 R/availableIntervals.R delete mode 100644 R/availableTickers.R create mode 100644 R/chart_donchian.R delete mode 100644 R/chart_indicators.R create mode 100644 R/chart_smi.R delete mode 100644 R/getFNG.R delete mode 100644 R/getLSRatio.R delete mode 100644 R/getQuote.R delete mode 100644 R/pkg_startup.R create mode 100644 R/sysdata.rda create mode 100644 codemeta.json create mode 100644 data-raw/control_data.R delete mode 100644 man/availableExchanges.Rd delete mode 100644 man/availableIntervals.Rd delete mode 100644 man/availableTickers.Rd create mode 100644 man/chart_layout.Rd create mode 100644 man/donchian_channel.Rd create mode 100644 man/examples/scr_MAindicator.R create mode 100644 man/examples/scr_chartFGIndex.R create mode 100644 man/examples/scr_chartLSR.R create mode 100644 man/examples/scr_klinechart.R create mode 100644 man/examples/scr_ohlcchart.R create mode 100644 man/examples/scr_plinechart.R create mode 100644 man/figures/NEWS-unnamed-chunk-2-1.png create mode 100644 man/figures/NEWS-unnamed-chunk-4-1.png create mode 100644 man/figures/NEWS-unnamed-chunk-5-1.png create mode 100644 man/figures/README-chartquote(deficiency)-1.png create mode 100644 man/figures/README-chartquote(deficieny)-1.png create mode 100644 man/figures/README-unnamed-chunk-3-1.png delete mode 100644 man/getFGIndex.Rd delete mode 100644 man/getLSRatio.Rd delete mode 100644 man/getQuote.Rd create mode 100644 man/pline.Rd create mode 100644 man/smi.Rd create mode 100644 pkgdown/index.Rmd create mode 100644 pkgdown/index.md create mode 100644 tests/testthat/test-FGIndex.R create mode 100644 tests/testthat/test-infer_interval.R create mode 100644 tests/testthat/test-is-date.R create mode 100644 tests/testthat/test-kraken.R rename vignettes/articles/{00-introduction.Rmd => 01-article.Rmd} (67%) rename vignettes/articles/{02-charting.Rmd => 02-article.Rmd} (92%) rename vignettes/articles/{03-timezones.Rmd => 03-article.Rmd} (89%) rename vignettes/articles/{04-converting.Rmd => 04-article.Rmd} (84%) rename vignettes/articles/{05-quantmod.Rmd => 05-article.Rmd} (76%) create mode 100644 vignettes/custom_indicators.Rmd create mode 100644 vignettes/usecase.Rmd diff --git a/.Rbuildignore b/.Rbuildignore index 841cad5c..9b396e4b 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -15,3 +15,5 @@ playground ^CRAN-SUBMISSION$ ^CODE_OF_CONDUCT\.md$ ^data-raw$ +^codemeta\.json$ +NEWS.Rmd diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 9ea78877..24a7f327 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -2,9 +2,9 @@ # Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: - branches: [main, master, development] + branches: [main, master, development, documentation] pull_request: - branches: [main, master, development] + branches: [main, master, development, documentation] name: R-CMD-check diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index ed7650c7..9947233b 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -2,9 +2,9 @@ # Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: - branches: [main, master] + branches: [development] pull_request: - branches: [main, master] + branches: [development] release: types: [published] workflow_dispatch: diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 10579745..cfe937b6 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -2,12 +2,14 @@ # Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: - branches: [main, master, development, major-update] + branches: [development] pull_request: - branches: [main, master, development, major-update] + branches: [development] name: test-coverage +permissions: read-all + jobs: test-coverage: runs-on: ubuntu-latest @@ -15,7 +17,7 @@ jobs: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-r@v2 with: @@ -23,28 +25,37 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: - extra-packages: any::covr + extra-packages: any::covr, any::xml2 needs: coverage - name: Test coverage run: | - covr::codecov( + cov <- covr::package_coverage( quiet = FALSE, clean = FALSE, - install_path = file.path(Sys.getenv("RUNNER_TEMP"), "package") + install_path = file.path(normalizePath(Sys.getenv("RUNNER_TEMP"), winslash = "/"), "package") ) + covr::to_cobertura(cov) shell: Rscript {0} + - uses: codecov/codecov-action@v4 + with: + fail_ci_if_error: ${{ github.event_name != 'pull_request' && true || false }} + file: ./cobertura.xml + plugin: noop + disable_search: true + token: ${{ secrets.CODECOV_TOKEN }} + - name: Show testthat output if: always() run: | ## -------------------------------------------------------------------- - find ${{ runner.temp }}/package -name 'testthat.Rout*' -exec cat '{}' \; || true + find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \; || true shell: bash - name: Upload test results if: failure() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: coverage-test-failures path: ${{ runner.temp }}/package diff --git a/DESCRIPTION b/DESCRIPTION index e36138d4..d5a607f9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: cryptoQuotes Title: A Streamlined Access to Cryptocurrency OHLC-V Market Data and Sentiment Indicators -Version: 1.3.0 +Version: 1.3.1 Authors@R: c( person("Serkan", "Korkmaz", , "serkor1@duck.com", role = c("cre", "aut", "ctb", "cph"), comment = c(ORCID = "0000-0002-5052-0982")), @@ -25,13 +25,10 @@ Suggests: Config/testthat/edition: 3 Imports: cli (>= 3.6.2), - conflicted (>= 1.2.0), - curl (>= 5.2.0), + curl (>= 5.2.1), jsonlite (>= 1.8.8), lifecycle (>= 1.0.4), - paletteer (>= 1.6.0), plotly (>= 4.10.4), - rlang (>= 1.1.3), TTR (>= 0.24.4), utils, xts (>= 0.13.2), diff --git a/NAMESPACE b/NAMESPACE index b85b35d4..423df79e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,10 +1,6 @@ # Generated by roxygen2: do not edit by hand -export(add_event) export(alma) -export(availableExchanges) -export(availableIntervals) -export(availableTickers) export(available_exchanges) export(available_intervals) export(available_tickers) @@ -12,12 +8,10 @@ export(bollinger_bands) export(calibrate_window) export(chart) export(dema) +export(donchian_channel) export(ema) export(evwma) export(fgi) -export(getFGIndex) -export(getLSRatio) -export(getQuote) export(get_fgindex) export(get_fundingrate) export(get_lsratio) @@ -28,9 +22,11 @@ export(kline) export(lsr) export(macd) export(ohlc) +export(pline) export(remove_bound) export(rsi) export(sma) +export(smi) export(split_window) export(volume) export(vwap) @@ -43,7 +39,5 @@ importFrom(plotly,add_annotations) importFrom(plotly,layout) importFrom(plotly,plot_ly) importFrom(plotly,subplot) -importFrom(rlang,abort) -importFrom(rlang,trace_back) importFrom(xts,as.xts) importFrom(zoo,as.zoo) diff --git a/NEWS.Rmd b/NEWS.Rmd new file mode 100644 index 00000000..34518eb3 --- /dev/null +++ b/NEWS.Rmd @@ -0,0 +1,336 @@ +--- +output: github_document +always_allow_html: true +--- + + +```{r setup, include = FALSE} +# set options +Sys.setenv(OPENSSL_CONF="/dev/null") + +knitr::opts_chunk$set( + collapse = FALSE, + comment = "#>", + fig.path = "man/figures/NEWS-", + message = FALSE, + warning = FALSE, + dpi = 120, + fig.align = 'center' +) +``` + +```{r, include=FALSE, echo=FALSE} +library(cryptoQuotes) +``` + +# cryptoQuotes 1.3.1 + +## General + +> **NOTE:** With this update the package is no longer considered `experimental`. + +* Removed deprecated functions `getQuote()`-, `getFGIndex()`- and `getLSRatio()`-functions. + +* Removed decprecated functions `availableExchanges()`-, `availableIntervals()`- and `availableTickers()`-functions. + +These functions were planned to be deleted in `1.4.0` - however, we have decided to aim for an `JOSS`- and `rOpenSci`-subscription which requires some degree of stability. Hence the deletion of these function at `1.3.0`. + +We expect `1.4.0` to be released *after* `rOpenSci`-submission and acceptance :pray: + +## Improvements + +### New features + +* `smi()`-function, a `subchart`-indicator built on the `TTR::SMI()`-function. +* `donchian_channel()`-function, a `main chart`-indicator built on the `TTR::DonchianChannel()`-function + +
+Usage +```{r} +chart( + ticker = BTC, + main = kline(), + indicator = list( + donchian_channel() + ), + sub = list( + smi() + ) +) +``` +
+ +### Expanded Support + +* `get_openinterest()` is now supported by `kraken` + +
+Usage +```{r} +tail( + get_openinterest( + ticker = "PF_XBTUSD", + interval = "1h", + source = "kraken" + ) +) +``` +
+ +### Charting + +* The `chart()`-function now has proper `light`-theme available that isn't the default `plotly`-values. +* The charts now displays date ranges as a subtitles. +* The `bollinger_bands()`-function now accepts a `color`-argument. These can be passed as `Hexadecimal`-colors or as is, `"blue"` for example. +* A new main chart function has been introduced. `pline()` which is a univariate price chart based on either open, high, low or close prices. + +
+Usage +```{r} +chart( + ticker = BTC, + main = pline(price = "close"), + indicator = list( + bollinger_bands( + color = "steelblue" + ) + ), + sub = list( + volume() + ), + options = list( + dark = FALSE + ) +) +``` +
+ +### Documentation + +* The documentation has been extensively reworked. This is includes, but not limited to, sample outputs for all `get_*`-functions. + +### Backend Changes + +* The `chart()`-functions no longer depend on `rlang`. + +> **Note:** we are generally moving away from `rlang`, `purrr` and `tidyverse` in general. We are, however, +> keeping the `tidyverse` styleguide. + +* Removed dependency on `conflicted`-package. + +Prior to version `1.3.0` the `get*`-functions were following the syntax of `quantmod` closely, and this goes for the function naming too. With the adoption of the `tidyverse` style guide, there is no conflicts that +needs to be resolved on `stable`- and `experimental`-functions. + +### New developper tools + +* `pull()`-function +* `var_ly()`-function +* `build()`-function + +## Breaking Changes + +* The `get_fgindex()`-function now returns columns in lower case. + +## Bugfixes + +* Fixed a bug where `get_fgindex()` where labelled as `deprecated` +* Fixed a bug in the `limitations`-article where the desired number of observations werent compatible with the `kraken`-exchange. +* Fixed a warning in the `get_lsratio()`-function with `source = "binance"` +* Fixed a bug in the `lsr()`-indicator which broke the `chart()`-function when included. +* Fixed a bug in the `get_quote()`-function where if `to = NULL` and `from != NULL` the returned `quote` would be filtered according to `UTC` and not `Sys.timezone()` +* Fixed a bug in the `chart()`-function where the inferred intervals would be incorrect for leap years, and months different from 30 days. + +# cryptoQuotes 1.3.0 + +## Improvements + +### General function improvements + +* `get_lsratio` and `getLSratio()` supports `kraken` and `bybit` as `source` + +* `available_`-functions are more adaptive to the calling environments + +```R +## charting the klines +## with indicators as +## subcharts +available_exchanges(type = 'ohlc') +``` + +Now returns all available exhanges that supports Open, High, Low and Close market data. The `type`-argument can be changed to, for example, `lsratio` to get +all available exchanges that supports Long to Shorts ratios. Similar changes have been made to remaining `available_`-functions. + +### Error-handling + +All `get_*`- and `available_*`-functions are now more robust to API and input errors. + +### Default Returning + +* `quotes` and `fear and greed index` now returns `200` rows instead of `100` + +### Charting + +* The `charts` now has a `dark` and `light` theme. Its passed into the `options = list(dark = TRUE)` of the `chart()`-function. +* The `charts` are now more color deficiency compliant, and the `deficiency` parameter in `options = list(deficiency = TRUE)` now applies to all `chart`-elements +* The `charts` are now constructed without `%>%` and, should, be more intuitive to navigate in. See example below, + +```{r} +## charting the klines +## with indicators as +## subcharts +chart( + ticker = BTC, + main = kline(), + sub = list( + volume() + ), + indicator = list( + bollinger_bands(), + sma(), + alma() + ), + options = list( + dark = TRUE, + deficiency = FALSE + ) +) +``` + +### Exchange Support + +The following exchanges have been added to list of `exchanges` available, + +* ByBit + +### New features + +* Funding rates, `get_fundingrate()` + +
+Usage +```{r} +## get funding rate +tail( + get_fundingrate( + ticker = "BTCUSDT", + source = "binance" + ) +) +``` +
+ +* Open interest, `get_openinterest()` + +
+Usage +```{r} +## get funding rate +tail( + get_openinterest( + ticker = "BTCUSDT", + source = "binance" + ) +) +``` +
+ + +## Breaking Changes + +### Charting + +* All the `charting`-functions have been reworked without backwards compatibility, or `lifecycle::deprecated()`-warnings. The `charting`-functions were, and still is, in an `experimental`-stage. + +### API Calls + +* All `dates` passed to `get_*`-functions assumed the dates were given in `UTC`, and were retrieved as `UTC`. These have now been changed; all functions now uses `Sys.timezone()` as `default` upon request and retrieval. + +## Warning + +As the `cryptoQuotes`-package has moved to the `tidyverse` style guide, the `getFoo`-functions are now `deprecated`. These will be permanently deleted, and removed from the `cryptoQuotes`-package, at version 1.4.0! + + +# cryptoQuotes 1.2.1 + +### Minor Updates + +* Added DOGECOIN data. This data is extracted on the `1m` chart, around Elon Musks Tweet. +* Added a usecase in the Vignette about Dogecoin and Elon Musk to showcase the functionality of the library. + +### Bugfixes + +* Corrected misspelled ticker in Vignette +* All returned Quotes are now in `UTC`, again. +* Fixed an error on the `Bitmart` API where weekly candles would throw an error. + +# cryptoQuotes 1.2.0 + +* All `from` and `to` arguments are now more flexible, and supports passing `Sys.Date()` and `Sys.time()` directly into the `get`-functions. + +* `getQuote()` now returns up to 100 pips preceding the specified `to` date, when `from = NULL`. It returns 100 pips, or up to `Sys.Date()`, from the specified `from` date. + +The `getQuote()`-function can now be used as follows; + +``` +## Specifying from +## date only; +## +## Returns 10 pips +getQuote( + ticker = 'BTCUSDT', + interval = '1d' + from = as.character(Sys.Date() - 10) + ) +``` + +``` +## Specifying to +## date only; +## +## Returns 100 pips +getQuote( + ticker = 'BTCUSDT', + interval = '1d' + to = as.character(Sys.Date()) + ) +``` + +## Market Sentiment + +Four new functions are added, + +* `getFGIndex()` which returns the daily Fear and Greed Index. +* `addFGIndex()` which adds the Fear and Greed Index as a subplot to price charts. +* `getLSRatio()` which returns the long-short ratio with varying granularity. Contributor has been credited. +* `addLSRatio()` which adds the long-short ratio as a subplot to price charts. + +## Convinience functions added + +Three new convinience functions are added applicable to some situations, + +* `removeBound()` +* `splitWindow()` +* `calibrateWindow()` + +# cryptoQuotes 1.1.0 + +## Frontend + +`getQuote()` now returns up to 100 pips when `to` and `from` is `NULL` + +## Backend + +* All code has been rewritten so its compatible with `httr2`, the package used `httr` at version `1.0.0`. + +## Future releases + +In the next release, three more exchanges will be supported. + +## Known bugs + +The returned `quotes` are in local timezone, this is an unintentional feature and will be fixed in a bugfix. + + +# cryptoQuotes 1.0.0 + +* Initial CRAN submission :rocket: diff --git a/NEWS.md b/NEWS.md index 91b23ce9..35fcb76c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,47 +1,221 @@ + + + +# cryptoQuotes 1.3.1 + +## General + +> **NOTE:** With this update the package is no longer considered +> `experimental`. + +- Removed deprecated functions `getQuote()`-, `getFGIndex()`- and + `getLSRatio()`-functions. + +- Removed decprecated functions `availableExchanges()`-, + `availableIntervals()`- and `availableTickers()`-functions. + +These functions were planned to be deleted in `1.4.0` - however, we have +decided to aim for an `JOSS`- and `rOpenSci`-subscription which requires +some degree of stability. Hence the deletion of these function at +`1.3.0`. + +We expect `1.4.0` to be released *after* `rOpenSci`-submission and +acceptance :pray: + +## Improvements + +### New features + +- `smi()`-function, a `subchart`-indicator built on the + `TTR::SMI()`-function. +- `donchian_channel()`-function, a `main chart`-indicator built on the + `TTR::DonchianChannel()`-function + +
+ +Usage + + +``` r +chart( + ticker = BTC, + main = kline(), + indicator = list( + donchian_channel() + ), + sub = list( + smi() + ) +) +``` + + +
+ +### Expanded Support + +- `get_openinterest()` is now supported by `kraken` + +
+ +Usage + + +``` r +tail( + get_openinterest( + ticker = "PF_XBTUSD", + interval = "1h", + source = "kraken" + ) +) +``` + + #> open_interest + #> 2024-05-31 15:00:00 3013.342 + #> 2024-05-31 16:00:00 2957.343 + #> 2024-05-31 17:00:00 2960.819 + #> 2024-05-31 18:00:00 2954.668 + #> 2024-05-31 19:00:00 2983.686 + #> 2024-05-31 20:00:00 2996.449 + +
+ +### Charting + +- The `chart()`-function now has proper `light`-theme available that + isn’t the default `plotly`-values. +- The charts now displays date ranges as a subtitles. +- The `bollinger_bands()`-function now accepts a `color`-argument. These + can be passed as `Hexadecimal`-colors or as is, `"blue"` for example. +- A new main chart function has been introduced. `pline()` which is a + univariate price chart based on either open, high, low or close + prices. + +
+ +Usage + + +``` r +chart( + ticker = BTC, + main = pline(price = "close"), + indicator = list( + bollinger_bands( + color = "steelblue" + ) + ), + sub = list( + volume() + ), + options = list( + dark = FALSE + ) +) +``` + + +
+ +### Documentation + +- The documentation has been extensively reworked. This is includes, but + not limited to, sample outputs for all `get_*`-functions. + +### Backend Changes + +- The `chart()`-functions no longer depend on `rlang`. + +> **Note:** we are generally moving away from `rlang`, `purrr` and +> `tidyverse` in general. We are, however, keeping the `tidyverse` +> styleguide. + +- Removed dependency on `conflicted`-package. + +Prior to version `1.3.0` the `get*`-functions were following the syntax +of `quantmod` closely, and this goes for the function naming too. With +the adoption of the `tidyverse` style guide, there is no conflicts that +needs to be resolved on `stable`- and `experimental`-functions. + +### New developper tools + +- `pull()`-function +- `var_ly()`-function +- `build()`-function + +## Breaking Changes + +- The `get_fgindex()`-function now returns columns in lower case. + +## Bugfixes + +- Fixed a bug where `get_fgindex()` where labelled as `deprecated` +- Fixed a bug in the `limitations`-article where the desired number of + observations werent compatible with the `kraken`-exchange. +- Fixed a warning in the `get_lsratio()`-function with + `source = "binance"` +- Fixed a bug in the `lsr()`-indicator which broke the + `chart()`-function when included. +- Fixed a bug in the `get_quote()`-function where if `to = NULL` and + `from != NULL` the returned `quote` would be filtered according to + `UTC` and not `Sys.timezone()` +- Fixed a bug in the `chart()`-function where the inferred intervals + would be incorrect for leap years, and months different from 30 days. + # cryptoQuotes 1.3.0 ## Improvements ### General function improvements -* `get_lsratio` and `getLSratio()` supports `kraken` and `bybit` as `source` +- `get_lsratio` and `getLSratio()` supports `kraken` and `bybit` as + `source` -* `available_`-functions are more adaptive to the callling environments +- `available_`-functions are more adaptive to the calling environments -```R +``` r ## charting the klines ## with indicators as ## subcharts available_exchanges(type = 'ohlc') ``` -Now returns all available exhanges that supports Open, High, Low and Close market data. The `type`-argument can be changed to, for example, `lsratio` to get -all available exchanges that supports Long to Shorts ratios. Similar changes have been made to remaining `available_`-functions. +Now returns all available exhanges that supports Open, High, Low and +Close market data. The `type`-argument can be changed to, for example, +`lsratio` to get all available exchanges that supports Long to Shorts +ratios. Similar changes have been made to remaining +`available_`-functions. ### Error-handling -All `get_*`- and `available_*`-functions are now more robust to API and input errors. +All `get_*`- and `available_*`-functions are now more robust to API and +input errors. ### Default Returning -* `quotes` and `fear and greed index` now returns `200` rows instead of `100` +- `quotes` and `fear and greed index` now returns `200` rows instead of + `100` ### Charting -* The `charts` now has a `dark` and `light` theme. Its passed into the `options = list(dark = TRUE)` of the `chart()`-function. -* The `charts` are now more color deficiency compliant, and the `deficiency` parameter in `options = list(deficiency = TRUE)` now applies to all `chart`-elements -* The `charts` are now constructed without `%>%` and, should, be more intuitive to navigate in. See example below, +- The `charts` now has a `dark` and `light` theme. Its passed into the + `options = list(dark = TRUE)` of the `chart()`-function. +- The `charts` are now more color deficiency compliant, and the + `deficiency` parameter in `options = list(deficiency = TRUE)` now + applies to all `chart`-elements +- The `charts` are now constructed without `%>%` and, should, be more + intuitive to navigate in. See example below, -```R +``` r ## charting the klines ## with indicators as ## subcharts chart( - ticker = BTCUSDT, + ticker = BTC, main = kline(), sub = list( - volume(), - macd() + volume() ), indicator = list( bollinger_bands(), @@ -49,117 +223,165 @@ chart( alma() ), options = list( - dark = TRUE, + dark = TRUE, deficiency = FALSE ) ) ``` + + ### Exchange Support -The following exchanges have been added to list of `exchanges` available, +The following exchanges have been added to list of `exchanges` +available, -* ByBit +- ByBit ### New features -* Funding rates +- Funding rates, `get_fundingrate()` + +
+ +Usage + -```R +``` r ## get funding rate -get_fundingrate( +tail( + get_fundingrate( ticker = "BTCUSDT", source = "binance" ) +) ``` -* Open interest + #> funding_rate + #> 2024-05-30 02:00:00 0.00010000 + #> 2024-05-30 10:00:00 0.00010000 + #> 2024-05-30 18:00:00 0.00010000 + #> 2024-05-31 02:00:00 0.00014599 + #> 2024-05-31 10:00:00 0.00012268 + #> 2024-05-31 18:00:00 0.00010000 + +
+ +- Open interest, `get_openinterest()` -```R -## get open interest -get_openinterest( - ticker = "BTCUSDT", - source = "binance" - ) +
+ +Usage + + +``` r +## get funding rate +tail( + get_openinterest( + ticker = "BTCUSDT", + source = "binance" + ) +) ``` + #> open_interest + #> 2024-05-26 02:00:00 72347.36 + #> 2024-05-27 02:00:00 71077.10 + #> 2024-05-28 02:00:00 71580.71 + #> 2024-05-29 02:00:00 71880.38 + #> 2024-05-30 02:00:00 76232.59 + #> 2024-05-31 02:00:00 74250.55 + +
## Breaking Changes ### Charting -* All the `charting`-functions have been reworked without backwards compatibility, or `lifecycle::deprecated()`-warnings. The `charting`-functions were, and still is, in an `experimental`-stage. +- All the `charting`-functions have been reworked without backwards + compatibility, or `lifecycle::deprecated()`-warnings. The + `charting`-functions were, and still is, in an `experimental`-stage. ### API Calls -* All `dates` passed to `get_*`-functions assumed the dates were given in `UTC`, and were retrieved as `UTC`. These have now been changed; all functions now uses `Sys.timezone()` as `default` upon request and retrieval. +- All `dates` passed to `get_*`-functions assumed the dates were given + in `UTC`, and were retrieved as `UTC`. These have now been changed; + all functions now uses `Sys.timezone()` as `default` upon request and + retrieval. ## Warning -As the `cryptoQuotes`-package has moved to the `tidyverse` style guide, the `getFoo`-functions are now `deprecated`. These will be permanently deleted, and removed from the `cryptoQuotes`-package, at version 1.4.0! - +As the `cryptoQuotes`-package has moved to the `tidyverse` style guide, +the `getFoo`-functions are now `deprecated`. These will be permanently +deleted, and removed from the `cryptoQuotes`-package, at version 1.4.0! # cryptoQuotes 1.2.1 ### Minor Updates -* Added DOGECOIN data. This data is extracted on the `1m` chart, around Elon Musks Tweet. -* Added a usecase in the Vignette about Dogecoin and Elon Musk to showcase the functionality of the library. +- Added DOGECOIN data. This data is extracted on the `1m` chart, around + Elon Musks Tweet. +- Added a usecase in the Vignette about Dogecoin and Elon Musk to + showcase the functionality of the library. ### Bugfixes -* Corrected misspelled ticker in Vignette -* All returned Quotes are now in `UTC`, again. -* Fixed an error on the ``Bitmart` API where weekly candles would throw an error. +- Corrected misspelled ticker in Vignette +- All returned Quotes are now in `UTC`, again. +- Fixed an error on the `Bitmart` API where weekly candles would throw + an error. # cryptoQuotes 1.2.0 -* All `from` and `to` arguments are now more flexible, and supports passing `Sys.Date()` and `Sys.time()` directly into the `get`-functions. +- All `from` and `to` arguments are now more flexible, and supports + passing `Sys.Date()` and `Sys.time()` directly into the + `get`-functions. -* `getQuote()` now returns up to 100 pips preceding the specified `to` date, when `from = NULL`. It returns 100 pips, or up to `Sys.Date()`, from the specified `from` date. +- `getQuote()` now returns up to 100 pips preceding the specified `to` + date, when `from = NULL`. It returns 100 pips, or up to `Sys.Date()`, + from the specified `from` date. The `getQuote()`-function can now be used as follows; -``` -## Specifying from -## date only; -## -## Returns 10 pips -getQuote( - ticker = 'BTCUSDT', - interval = '1d' - from = as.character(Sys.Date() - 10) - ) -``` - -``` -## Specifying to -## date only; -## -## Returns 100 pips -getQuote( - ticker = 'BTCUSDT', - interval = '1d' - to = as.character(Sys.Date()) - ) -``` + ## Specifying from + ## date only; + ## + ## Returns 10 pips + getQuote( + ticker = 'BTCUSDT', + interval = '1d' + from = as.character(Sys.Date() - 10) + ) + + ## Specifying to + ## date only; + ## + ## Returns 100 pips + getQuote( + ticker = 'BTCUSDT', + interval = '1d' + to = as.character(Sys.Date()) + ) ## Market Sentiment Four new functions are added, -* `getFGIndex()` which returns the daily Fear and Greed Index. -* `addFGIndex()` which adds the Fear and Greed Index as a subplot to price charts. -* `getLSRatio()` which returns the long-short ratio with varying granularity. Contributor has been credited. -* `addLSRatio()` whidh adds the long-short ratio as a subplot to price charts. +- `getFGIndex()` which returns the daily Fear and Greed Index. +- `addFGIndex()` which adds the Fear and Greed Index as a subplot to + price charts. +- `getLSRatio()` which returns the long-short ratio with varying + granularity. Contributor has been credited. +- `addLSRatio()` which adds the long-short ratio as a subplot to price + charts. ## Convinience functions added Three new convinience functions are added applicable to some situations, -* `removeBound()` -* `splitWindow()` -* `calibrateWindow()` +- `removeBound()` +- `splitWindow()` +- `calibrateWindow()` # cryptoQuotes 1.1.0 @@ -169,17 +391,18 @@ Three new convinience functions are added applicable to some situations, ## Backend -* All code has been rewritten so its compatible with `httr2`, the package used `httr` at version `1.0.0`. +- All code has been rewritten so its compatible with `httr2`, the + package used `httr` at version `1.0.0`. ## Future releases -In the next release, three more exchanges will be supported. +In the next release, three more exchanges will be supported. ## Known bugs -The returned `quotes` are in local timezone, this is an unintentional feature and will be fixed in a bugfix. - +The returned `quotes` are in local timezone, this is an unintentional +feature and will be fixed in a bugfix. # cryptoQuotes 1.0.0 -* Initial CRAN submission. +- Initial CRAN submission :rocket: diff --git a/R/ATOM.R b/R/ATOM.R index d3713e21..6fd95eef 100644 --- a/R/ATOM.R +++ b/R/ATOM.R @@ -1,17 +1,33 @@ -#' USDT denominated ATOMS with 15m intervals +#' USDT Denominated ATOM (ATOMUSDT) 15-Minute Intervals #' -#' A xts object with 15m OHLCV of USDT denominated ATOM with 97 rows and 5 columns, from 2023-12-30 to 2023-12-31. +#' @description +#' This dataset contains time-series data for the ATOM (ATOM) +#' denominated in USDT (Tether), captured in 15-minute intervals. +#' The data spans from December 30 to December 31, 2023. +#' +#' @format An [xts::xts()]-object with 97 rows and 5 columns, #' #' \describe{ -#' \item{Open}{Opening price} -#' \item{High}{Highest price} -#' \item{Low}{Lowest price} -#' \item{Close}{Closing price} -#' \item{Volume}{Volume} +#' \item{index}{<[POSIXct]> The time-index} +#' \item{open}{<[numeric]> Opening price} +#' \item{high}{<[numeric]> Highest price} +#' \item{low}{<[numeric]> Lowest price} +#' \item{close}{<[numeric]> Closing price} +#' \item{volume}{<[numeric]> Trading volume} #' } #' -#' @family data +#' @examples +#' # Load the dataset +#' data("ATOM") +#' +#' # chart +#' chart( +#' ticker = ATOM, +#' main = kline(), +#' sub = list(volume()) +#' ) "ATOM" + diff --git a/R/BTC.R b/R/BTC.R index 873ed61c..e67aec38 100644 --- a/R/BTC.R +++ b/R/BTC.R @@ -1,15 +1,29 @@ -#' USDT denominated Bitcoin(BTC) with 1 week intervals +#' USDT Denominated Bitcoin (BTCUSDT) Weekly Intervals #' -#' A xts object with weekly OHLCV of USDT denominated Bitcoin with 52 rows and 5 columns, from 2023-01-01 to 2023-12-31. +#' @description +#' This dataset contains time-series data for Bitcoin (BTC) +#' denominated in USDT (Tether), captured in weekly intervals. +#' The data spans from January 1, 2023, to December 31, 2023. +#' +#' @format An [xts::xts()]-object with 52 rows and 5 columns, #' #' \describe{ -#' \item{Open}{Opening price} -#' \item{High}{Highest price} -#' \item{Low}{Lowest price} -#' \item{Close}{Closing price} -#' \item{Volume}{Volume} +#' \item{index}{<[POSIXct]> The time-index} +#' \item{open}{<[numeric]> Opening price} +#' \item{high}{<[numeric]> Highest price} +#' \item{low}{<[numeric]> Lowest price} +#' \item{close}{<[numeric]> Closing price} +#' \item{volume}{<[numeric]> Trading volume} #' } #' +#' @examples +#' # Load the dataset +#' data("BTC") #' -#' @family data +#' # chart +#' chart( +#' ticker = BTC, +#' main = kline(), +#' sub = list(volume()) +#' ) "BTC" diff --git a/R/DOGE.R b/R/DOGE.R index 2b70eee9..05508302 100644 --- a/R/DOGE.R +++ b/R/DOGE.R @@ -1,14 +1,29 @@ -#' USDT denominated DOGECOIN in 1m intervals +#' USDT Denominated DOGECOIN (DOGEUSDT) 1-Minute Intervals #' -#' A xts object with 1m OHLCV of USDT denominated Dogecoin with 61 rows and 5 columns. +#' @description +#' This dataset contains time-series data for the DOGECOIN (DOGE) +#' denominated in USDT (Tether), captured in 1-minute intervals. +#' The data spans 2022-01-14 07:00:00 CET to 2022-01-14 08:00:00 CET. +#' +#' @format An [xts::xts()]-object with 61 rows and 5 columns, #' #' \describe{ -#' \item{Open}{Opening price} -#' \item{High}{Highest price} -#' \item{Low}{Lowest price} -#' \item{Close}{Closing price} -#' \item{Volume}{Volume} +#' \item{index}{<[POSIXct]> The time-index} +#' \item{open}{<[numeric]> Opening price} +#' \item{high}{<[numeric]> Highest price} +#' \item{low}{<[numeric]> Lowest price} +#' \item{close}{<[numeric]> Closing price} +#' \item{volume}{<[numeric]> Trading volume} #' } #' -#' @family data +#' @examples +#' # Load the dataset +#' data("DOGE") +#' +#' # chart +#' chart( +#' ticker = DOGE, +#' main = kline(), +#' sub = list(volume()) +#' ) "DOGE" diff --git a/R/FGIndex.R b/R/FGIndex.R index 74b6aa31..0ea380b4 100644 --- a/R/FGIndex.R +++ b/R/FGIndex.R @@ -1,10 +1,32 @@ -#' Fear and Greed Index Values +#' Fear and Greed Index (FGI) values for the +#' cryptocurrency market in daily intervals #' -#' A xts object with Fear and Greed Index value. It has 689 rows, and 1 colum. Extracted from 2023-01-01 to 2023-12-31 +#' @description +#' This dataset contains daily values of the Fear and Greed Index for the year +#' 2023, which is used to measure the sentiments of investors in the market. +#' The data spans from January 1, 2023, to December 31, 2023. +#' +#' @format An [xts::xts()]-object with 364 rows and 1 columns, #' #' \describe{ -#' \item{FGI}{Daily Fear and Greed Index Value} +#' \item{index}{<[POSIXct]> The time-index} +#' \item{fgi}{<[numeric]< The daily fear and greed index value} +#' } +#' @details +#' The Fear and Greed Index goes from 0-100, and can be classified as follows, +#' +#' \itemize{ +#' \item 0-24, Extreme Fear +#' \item 25-44, Fear +#' \item 45-55, Neutral +#' \item 56-75, Greed +#' \item 76-100, Extreme Greed #' } #' -#' @family data +#' @examples +#' # Load the dataset +#' data("FGIndex") +#' +#' # Get a summary of index values +#' summary(FGIndex) "FGIndex" diff --git a/R/FUN.R b/R/FUN.R index 0ed15774..3e7245c5 100644 --- a/R/FUN.R +++ b/R/FUN.R @@ -20,10 +20,11 @@ #' #' #' @param xts A xts-object that needs its bounds modified. -#' @param bounds A character vector of length 1. Has to be one of `c('upper','lower','both')`. Defaults to Upper. +#' @param bounds A character vector of length 1. +#' Has to be one of `c('upper','lower','both')`. Defaults to Upper. #' #' @example man/examples/scr_FUN.R -#' @family convinience +#' @family utility #' #' @returns Returns an xts-class object with its bounds removed. #' @export @@ -34,16 +35,16 @@ remove_bound <- function( # check if bounds are correctly # specified - if (!grepl(x = bounds, pattern = 'upper|lower|both')) { - - rlang::abort( - message = c( - 'Incorrectly specfied bounds', - 'v' = 'Has to be "upper", "lower" or "both"' - ) - ) - - } + # if (!grepl(x = bounds, pattern = 'upper|lower|both')) { + # + # rlang::abort( + # message = c( + # 'Incorrectly specfied bounds', + # 'v' = 'Has to be "upper", "lower" or "both"' + # ) + # ) + # + # } # this function # removes the upper @@ -73,15 +74,17 @@ remove_bound <- function( #' #' `r lifecycle::badge("experimental")` #' -#' The [split_window()]-function is a high level wrapper of the [stats::window()]-function which restricts -#' the intervals between the first and second index value iteratively +#' The [split_window()]-function is a high level wrapper +#' of the [stats::window()]-function which restricts the intervals between +#' the first and second index value iteratively #' #' @param xts A xts-object that needs needs to be split. #' @param by A reference [zoo::index()]-object, to be split by. -#' @param bounds A character vector of length 1. Has to be one of `c('upper','lower','both')`. Defaults to Upper. +#' @param bounds A character vector of length 1. +#' Has to be one of `c('upper','lower','both')`. Defaults to Upper. #' #' @example man/examples/scr_FUN.R -#' @family convinience +#' @family utility #' #' @returns Returns a list of iteratively restricted xts objects #' @@ -91,6 +94,16 @@ split_window <- function( by, bounds = 'upper') { + assert( + inherits(xts, "xts"), + error_message = c( + "x" = sprintf( + "Has to be {.cls xts}. Got {.cls %s}", + class(xts) + ) + ) + ) + # this function splits # the xts object in lists # in intervals that are comparable @@ -138,7 +151,7 @@ split_window <- function( #' @param ... optional arguments passed to `FUN`. #' #' @example man/examples/scr_FUN.R -#' @family convinience +#' @family utility #' #' @returns Returns a xts object. #' @@ -148,6 +161,16 @@ calibrate_window <- function( FUN, ...) { + assert( + inherits(list, "list"), + error_message = c( + "x" = sprintf( + "Has to be {.cls list}. Got {.cls %s}", + class(list) + ) + ) + ) + # This function calibrates # the window and returns # a XTS object that is comparable diff --git a/R/api_binance.R b/R/api_binance.R index 68a77e14..59e97c57 100644 --- a/R/api_binance.R +++ b/R/api_binance.R @@ -24,21 +24,23 @@ binanceUrl <- function( } binanceEndpoint <- function( - type = 'ohlc', + type = 'ohlc', futures = TRUE, - top = FALSE -) { + top = FALSE) { endPoint <- switch( EXPR = type, ohlc = { - if (futures) 'fapi/v1/klines' else 'api/v3/klines' + if (futures) 'fapi/v1/klines' else + 'api/v3/klines' }, ticker ={ - if (futures) 'fapi/v1/exchangeInfo' else 'api/v3/exchangeInfo' + if (futures) 'fapi/v1/exchangeInfo' else + 'api/v3/exchangeInfo' }, lsratio = { - if (top) 'futures/data/topLongShortAccountRatio' else 'futures/data/globalLongShortAccountRatio' + if (top) 'futures/data/topLongShortAccountRatio' else + 'futures/data/globalLongShortAccountRatio' }, interest = { 'futures/data/openInterestHist' @@ -61,8 +63,7 @@ binanceIntervals <- function( interval, all = FALSE, type, - ... -) { + ...) { # 0) wrap all intercals # in switch @@ -70,8 +71,42 @@ binanceIntervals <- function( EXPR = type, 'ohlc' = { data.frame( - labels = c('1s', '1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '8h', '12h', '1d', '3d', '1w', '1M'), - values = c('1s', '1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '8h', '12h', '1d', '3d', '1w', '1M') + labels = c( + '1s', + '1m', + '3m', + '5m', + '15m', + '30m', + '1h', + '2h', + '4h', + '6h', + '8h', + '12h', + '1d', + '3d', + '1w', + '1M' + ), + values = c( + '1s', + '1m', + '3m', + '5m', + '15m', + '30m', + '1h', + '2h', + '4h', + '6h', + '8h', + '12h', + '1d', + '3d', + '1w', + '1M' + ) ) }, @@ -82,21 +117,19 @@ binanceIntervals <- function( ) ) - # # Define all intervals in a data frame - # allIntervals <- data.frame( - # labels = c('1s', '1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '8h', '12h', '1d', '3d', '1w', '1M'), - # values = c('1s', '1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '8h', '12h', '1d', '3d', '1w', '1M') - # ) - if (all) { + return(all_intervals$labels) + } else { + # Select the specified interval selectedInterval <- all_intervals$values[ grepl(paste0('^', interval, '$'), all_intervals$values) ] return(selectedInterval) + } } @@ -104,8 +137,7 @@ binanceIntervals <- function( binanceResponse <- function( type = 'ohlc', futures, - ... -) { + ...) { # mock response # to avoid check error in @@ -226,8 +258,7 @@ binanceParameters <- function( interval, from = NULL, to = NULL, - ... -) { + ...) { # Basic parameters common to both futures and non-futures params <- list( diff --git a/R/api_bitmart.R b/R/api_bitmart.R index d4238f89..9d6ac225 100644 --- a/R/api_bitmart.R +++ b/R/api_bitmart.R @@ -32,14 +32,15 @@ bitmartEndpoint <- function( endPoint <- switch( EXPR = type, ohlc = { - if (futures) 'contract/public/kline' else 'spot/quotation/v3/lite-klines' + if (futures) 'contract/public/kline' else + 'spot/quotation/v3/lite-klines' }, ticker ={ - if (futures) 'contract/public/details' else 'spot/v1/symbols' + if (futures) 'contract/public/details' else + 'spot/v1/symbols' } ) - # 2) return endPoint url endPoint @@ -50,13 +51,40 @@ bitmartIntervals <- function( futures, interval, all = FALSE, - ... -) { + ...) { # Define all intervals in a data frame allIntervals <- data.frame( - labels = c('1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '12h', '1d', '3d', '1w'), - values = c(1, 3, 5, 15, 30, 60, 120, 240, 360, 720, 1440, 4320, 10080) + labels = c( + '1m', + '3m', + '5m', + '15m', + '30m', + '1h', + '2h', + '4h', + '6h', + '12h', + '1d', + '3d', + '1w' + ), + values = c( + 1, + 3, + 5, + 15, + 30, + 60, + 120, + 240, + 360, + 720, + 1440, + 4320, + 10080 + ) ) if (all) { @@ -77,12 +105,10 @@ bitmartIntervals <- function( bitmartResponse <- function( type = 'ohlc', futures, - ... -) { + ...) { response <- NULL - # mock response # to avoid check error in # unevaluated expressions @@ -92,16 +118,29 @@ bitmartResponse <- function( EXPR = type, ohlc = { list( - colum_names = if (futures) c('low', 'high', 'open', 'close', 'volume') else c('open', 'high', 'low', 'close', 'volume'), - colum_location = if (futures) 1:5 else c(2:5,7), - index_location = if (futures) 6 else 1 + + colum_names = if (futures) + c('low', 'high', 'open', 'close', 'volume') + else + c('open', 'high', 'low', 'close', 'volume'), + + colum_location = if (futures) + 1:5 + else + c(2:5, 7), + + index_location = if (futures) + 6 + else + 1 ) }, ticker = { list( foo = function(response, futures){ - if (futures) response$data$symbol$symbol else response$data$symbols + if (futures) response$data$symbol$symbol else + response$data$symbols } ) @@ -116,8 +155,7 @@ bitmartDates <- function( futures, dates, is_response = FALSE, - ... -) { + ...) { if (is_response) { @@ -131,7 +169,7 @@ bitmartDates <- function( dates <- convert_date( x = dates, multiplier = 1 - ) + ) dates <- vapply( dates, @@ -140,9 +178,10 @@ bitmartDates <- function( FUN.VALUE = character(1) ) - names(dates) <- if (futures) c('start_time', 'end_time') else c('after', 'before') - - + names(dates) <- if (futures) + c('start_time', 'end_time') + else + c('after', 'before') } @@ -158,8 +197,7 @@ bitmartParameters <- function( interval, from = NULL, to = NULL, - ... -) { + ...) { # Basic parameters params <- list( diff --git a/R/api_bybit.R b/R/api_bybit.R index 8578edee..ed2ff55b 100644 --- a/R/api_bybit.R +++ b/R/api_bybit.R @@ -26,23 +26,36 @@ bybitUrl <- function( bybitEndpoint <- function( type = 'ohlc', futures = TRUE, - top = FALSE -) { + top = FALSE) { endPoint <- switch( EXPR = type, + ohlc = { - if (futures) 'v5/market/kline' else 'v5/market/kline' + if (futures) + 'v5/market/kline' + else + 'v5/market/kline' }, - ticker ={ - if (futures) 'v5/market/instruments-info?category=linear' else 'v5/market/instruments-info?category=spot' + + ticker = { + if (futures) + 'v5/market/instruments-info?category=linear' + else + 'v5/market/instruments-info?category=spot' }, + lsratio = { - if (top) 'v5/market/account-ratio' else 'v5/market/account-ratio' + if (top) + 'v5/market/account-ratio' + else + 'v5/market/account-ratio' }, + fundingrate = { 'v5/market/funding/history' }, + interest = { '/v5/market/open-interest' } @@ -56,7 +69,6 @@ bybitEndpoint <- function( } # 2) Available intervals; ##### - bybitIntervals <- function( type, interval, @@ -67,21 +79,52 @@ bybitIntervals <- function( # 0) Define intervals all_intervals <- switch( EXPR = type, + 'lsratio' = { data.frame( - labels = c('5m', '15m', '30m', '1h', '4h', '1d'), - values = c("5min", "15min", "30min", "1h", "4h", "1d") + labels = c('5m', '15m', '30m', '1h', '4h', '1d'), + values = c("5min", "15min", "30min", "1h", "4h", "1d") ) }, + 'interest' = { data.frame( - labels = c('5m', '15m', '30m', '1h', '4h', '1d'), - values = c("5min", "15min", "30min", "1h" ,"4h", "1d") + labels = c('5m', '15m', '30m', '1h', '4h', '1d'), + values = c("5min", "15min", "30min", "1h" , "4h", "1d") ) }, + data.frame( - labels = c('1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '12h', '1d', '1M', '1w'), - values = c("1" , "3", "5", "15", "30", "60", "120", "240", "360", "720", "D", "M", "W") + labels = c( + '1m', + '3m', + '5m', + '15m', + '30m', + '1h', + '2h', + '4h', + '6h', + '12h', + '1d', + '1M', + '1w' + ), + values = c( + "1" , + "3", + "5", + "15", + "30", + "60", + "120", + "240", + "360", + "720", + "D", + "M", + "W" + ) ) ) @@ -106,10 +149,8 @@ bybitIntervals <- function( } - interval - } @@ -268,7 +309,7 @@ bybitParameters <- function( if (type == "interest") { - names(params)[3] ='intervalTime' + names(params)[3] <- 'intervalTime' names(date_params) <- c("startTime", "endTime") params$limit <- 200 } diff --git a/R/api_kraken.R b/R/api_kraken.R index e90f308b..78e220a7 100644 --- a/R/api_kraken.R +++ b/R/api_kraken.R @@ -31,10 +31,12 @@ krakenEndpoint <- function( endPoint <- switch( EXPR = type, ohlc = { - if (futures) 'api/charts/v1/' else '0/public/OHLC/' + if (futures) 'api/charts/v1/' else + '0/public/OHLC/' }, ticker ={ - if (futures) 'derivatives/api/v3/instruments/' else '0/public/AssetPairs/' + if (futures) 'derivatives/api/v3/instruments/' else + '0/public/AssetPairs/' }, # Was lsratio lsratio = { @@ -43,13 +45,8 @@ krakenEndpoint <- function( interest = { 'api/charts/v1/analytics/' } - - - ) - - # 2) return endPoint url endPoint @@ -66,18 +63,6 @@ krakenIntervals <- function( # 0) construct intervals all_intervals <- switch( EXPR = type, - # 'interest' = { - # data.frame( - # labels = c("1m", "5m", "15m", "30m", "1h", "4h", "12h", "2d", "8d"), - # values = c(60, 300, 900, 1800, 3600, 14400, 43200, 86400, 604800) - # ) - # }, - # 'lsratio' = { - # data.frame( - # labels = c("1m", "5m", "15m", "30m", "1h", "4h", "12h", "2d", "8d"), - # values = c(60, 300, 900, 1800, 3600, 14400, 43200, 86400, 604800) - # ) - # }, 'ohlc' = { if (futures) { # For futures, labels and values are the same @@ -118,7 +103,6 @@ krakenIntervals <- function( } - interval } @@ -183,6 +167,14 @@ krakenResponse <- function( index_location = c(1), colum_location = c(4,5) ) + }, + + interest = { + list( + colum_names = c('open', 'high', 'low', "close"), + index_location = c(1), + colum_location = c(2,3,4,5) + ) } ) @@ -204,16 +196,21 @@ krakenDates <- function( x = as.numeric(dates), multiplier = ifelse( futures, - yes = if (type %in% c('lsratio','interest')) 1 else 1000, # was 1000 + yes = if (type %in% c('lsratio', "interest")) 1 else 1000, # was 1000 no = 1 ) ) } else { + dates <- convert_date( x = dates, - multiplier = 1 + multiplier = ifelse( + type == "interest", + yes = 1, + no = 1 + ) ) if (!futures) { @@ -232,7 +229,6 @@ krakenDates <- function( } - # 5) Parameters passed to endpoints; #### krakenParameters <- function( futures = TRUE, @@ -265,116 +261,72 @@ krakenParameters <- function( is_response = FALSE ) - if (type == "interest") { - - - # Set specific parameters for futures or non-futures - if (futures) { - params$symbol = params$ticker - params$resolution = params$interval - params$tick_type = 'long-short-ratiotrade' - params$from = date_params[1] - params$to = date_params[2] - params$query = list( + switch( + type, + interest = { + params$symbol <- params$ticker + params$resolution <- params$interval + params$query <- list( interval = params$interval, - since = date_params[1], - to = date_params[2] + since = date_params[1], + to = date_params[2] ) - params$path = list( - symbol = params$symbol, + params$path <- list( + symbol = params$symbol, tick_type = "open-interest" ) - } else { - - params$pair = params$ticker - params$query = list( - since = date_params[1], - pair = params$pair, - interval = params$interval - ) - params$path = NULL - } - - - - } - - - if (type == 'ohlc') { - - # Set specific parameters for futures or non-futures - if (futures) { - params$symbol = params$ticker - params$resolution = params$interval - params$tick_type = 'trade' - params$from = date_params[1] - params$to = date_params[2] - params$query = list( - interval = params$interval, - from = date_params[1], - to =date_params[2] - ) - params$path = list( - tick_type = 'trade', - symbol = params$symbol, - resolution = params$resolution - ) - } else { - - params$pair = params$ticker - params$query = list( - since = date_params[1], - to = date_params[2], - pair = params$pair, - interval = params$interval - ) - params$path = NULL - } + }, + ohlc = { + # Set specific parameters for futures or non-futures + if (futures) { + params$symbol <- params$ticker + params$resolution <- params$interval + params$query <- list( + interval = params$interval, + from = date_params[1], + to = date_params[2] + ) + params$path <- list( + tick_type = 'trade', + symbol = params$symbol, + resolution = params$resolution + ) + } else { + params$pair <- params$ticker + params$query <- list( + since = date_params[1], + to = date_params[2], + pair = params$pair, + interval = params$interval + ) + params$path <- NULL + } - } - if (type == "lsratio") { - # Set specific parameters for futures or non-futures - if (futures) { - params$symbol = params$ticker - params$resolution = params$interval - params$tick_type = 'long-short-ratiotrade' - params$from = date_params[1] - params$to = date_params[2] - params$query = list( + }, + lsratio = { + params$symbol <- params$ticker + params$resolution <- params$interval + params$query <- list( interval = params$interval, - since = date_params[1], - to = date_params[2] + since = date_params[1], + to = date_params[2] ) - params$path = list( + params$path <- list( symbol = params$symbol, tick_type = 'long-short-info' ) - } else { - - params$pair = params$ticker - params$query = list( - since = date_params[1], - pair = params$pair, - interval = params$interval - ) - params$path = NULL } - - } + ) # Common parameters for both futures and non-futures - params$futures = futures - params$source = 'kraken' - - - - + params$futures <- futures + params$source <- 'kraken' # Return the structured list params } -# # script end; +# script end; diff --git a/R/api_kucoin.R b/R/api_kucoin.R index 2bdb04fc..950440af 100644 --- a/R/api_kucoin.R +++ b/R/api_kucoin.R @@ -7,8 +7,7 @@ # 1) URLs and Endpoint; #### kucoinUrl <- function( futures = TRUE, - ... -) { + ...) { # 1) define baseURL # for each API @@ -29,25 +28,23 @@ kucoinUrl <- function( kucoinEndpoint <- function( type = 'ohlc', futures = TRUE, - ... -) { - + ...) { endPoint <- switch( EXPR = type, ohlc = { - if (futures) 'api/v1/kline/query' else 'api/v1/market/candles' + if (futures) 'api/v1/kline/query' else + 'api/v1/market/candles' }, ticker ={ - if (futures) 'api/v1/contracts/active' else 'api/v1/market/allTickers' + if (futures) 'api/v1/contracts/active' else + 'api/v1/market/allTickers' }, fundingrate = { 'api/v1/contract/funding-rates' } ) - - # 2) return endPoint url return( endPoint @@ -59,27 +56,70 @@ kucoinIntervals <- function( interval, futures, all = FALSE, - ... -) { + ...) { + if (futures) { allIntervals <- data.frame( - labels = c('1m', '5m', '15m', '30m', '1h', '2h', '4h', '8h', '12h', '1d', '1w'), + labels = c( + '1m', + '5m', + '15m', + '30m', + '1h', + '2h', + '4h', + '8h', + '12h', + '1d', + '1w' + ), values = c(1, 5, 15, 30, 60, 120, 240, 480, 720, 1440, 10080) ) } else { allIntervals <- data.frame( - labels = c('1m', '3m', '5m', '15m', '30m', '1h', '2h', '4h', '6h', '8h', '12h', '1d', '1w'), - values = c('1min', '3min', '5min', '15min', '30min', '1hour', '2hour', '4hour', '6hour', '8hour', '12hour', '1day', '1week') + labels = c( + '1m', + '3m', + '5m', + '15m', + '30m', + '1h', + '2h', + '4h', + '6h', + '8h', + '12h', + '1d', + '1w' + ), + values = c( + '1min', + '3min', + '5min', + '15min', + '30min', + '1hour', + '2hour', + '4hour', + '6hour', + '8hour', + '12hour', + '1day', + '1week' + ) ) } if (all) { + return(allIntervals$labels) + } else { # Select the specified interval selectedInterval <- allIntervals$values[ grepl(paste0('^', interval, '$'), allIntervals$labels, ignore.case = TRUE) ] + return(selectedInterval) } } @@ -88,8 +128,7 @@ kucoinIntervals <- function( kucoinResponse <- function( type = 'ohlc', futures, - ... -) { + ...) { response <- NULL @@ -102,34 +141,36 @@ kucoinResponse <- function( EXPR = type, ohlc = { list( - colum_names = if (futures) c('open', 'high', 'low', 'close', 'volume') else c('open', 'close', 'high', 'low', 'volume'), + colum_names = if (futures) + c('open', 'high', 'low', 'close', 'volume') + else + c('open', 'close', 'high', 'low', 'volume'), colum_location = 2:6, index_location = 1 ) }, ticker = { list( - foo = function(response, futures){ - + foo = function(response, futures) { if (futures) { - subset( - x = response$data, - grepl(pattern = 'open', ignore.case = TRUE, x = response$data$status) - )$symbol - } else { + subset(x = response$data, + grepl( + pattern = 'open', + ignore.case = TRUE, + x = response$data$status + ))$symbol + } else { response$data$ticker$symbol - } + } } ) - - }, fundingrate = { list( - colum_names = "funding_rate", + colum_names = "funding_rate", index_location = c(3), colum_location = c(2) ) @@ -143,8 +184,7 @@ kucoinDates <- function( futures, dates, is_response = FALSE, - ... -) { + ...) { # 0) set multiplier based # on market diff --git a/R/availableExchanges.R b/R/availableExchanges.R deleted file mode 100644 index 705f7981..00000000 --- a/R/availableExchanges.R +++ /dev/null @@ -1,78 +0,0 @@ -# script: availableExchanges -# date: 2023-10-04 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: generate ta function that lists the available -# exchanges in library -# script start; - -#' Get available exchanges -#' -#' @description -#' `r lifecycle::badge("deprecated")` -#' -#' Get a vector of all available exchanges passed into the source -#' argument of the get-functions. -#' -#' @inherit available_exchanges -#' @family deprecated -#' -#' @export -availableExchanges <- function( - type = "ohlc"){ - - lifecycle::deprecate_soft( - when = '1.3.0', - what = "availableExchanges()", - with = "available_exchanges()" - ) - - # 0) define available - # exchanges - assert( - type %in% c("ohlc", "lsratio", "fundingrate", "interest"), - error_message = c( - "x" = sprintf( - "{.arg type} {.val %s} is not available.", - type - ), - "i" = sprintf( - "Has to be one of %s", - paste( - paste0("{.val ",c("ohlc", "lsratio", "fundingrate", "interest") ,"}"), - collapse = ", " - ) - ) - ) - ) - - exchanges <- sort( - switch( - type, - ohlc = c('binance', 'kucoin', 'kraken', 'bitmart', 'bybit'), - fundingrate = c('binance', 'bybit', 'kucoin'), - lsratio = c('binance', 'bybit', 'kraken'), - interest = c('binance', 'bybit') - ) - ) - - # 1) retun a message - # with all the available - # exchanges - cli::cli_inform( - message = c( - 'i' = cli::style_underline('Available Exchanges:'), - 'v' = paste( - exchanges, - collapse = ', ' - ) - ) - ) - - invisible( - exchanges - ) - -} - - -# script end; diff --git a/R/availableIntervals.R b/R/availableIntervals.R deleted file mode 100644 index 3f642023..00000000 --- a/R/availableIntervals.R +++ /dev/null @@ -1,92 +0,0 @@ -#' Get available intervals -#' -#' @description -#' `r lifecycle::badge("deprecated")` -#' -#' @inherit available_intervals -#' @family deprecated -#' -#' @export -availableIntervals <- function( - source = 'binance', - type = 'ohlc', - futures = TRUE) { - - lifecycle::deprecate_soft( - when = '1.3.0', - what = "availableIntervals()", - with = "available_intervals()" - ) - - - # 0) define available - # exchanges - assert( - type %in% c("ohlc", "lsratio", "fundingrate", "interest"), - error_message = c( - "x" = sprintf( - "{.arg type} {.val %s} is not available.", - type - ), - "i" = sprintf( - "Has to be one of %s", - paste( - paste0("{.val ",c("ohlc", "lsratio", "fundingrate", "interest") ,"}"), - collapse = ", " - ) - ) - ) - ) - - assert( - source %in% suppressMessages( - available_exchanges( - type = type - ) - ), - error_message = c( - "x" = sprintf( - fmt = "Exchange {.val %s} is not supported.", - source - ), - "i" = paste( - "Run", - cli::code_highlight( - code = "cryptoQuotes::available_exchanges()", - code_theme = "Chaos" - ), - "for supported exhanges" - ) - ) - ) - - - # 0) extract available - # intervals - all_intervals <- get(paste0(source, 'Intervals'))( - type = type, - futures = futures, - all = TRUE, - interval = NULL - ) - - - # 1) return a message - # with available - # intervals by exchange and market - cli::cli_inform( - message = c( - 'i' = paste0('Available Intervals at ', "{.val {source}}", ifelse(futures, ' (futures):', no = ' (spot):')), - 'v' = paste( - all_intervals, - collapse = ', ' - ) - ) - ) - - invisible( - all_intervals - ) - -} - diff --git a/R/availableTickers.R b/R/availableTickers.R deleted file mode 100644 index 8b9ed877..00000000 --- a/R/availableTickers.R +++ /dev/null @@ -1,74 +0,0 @@ -#' Get available cryptocurrency pairs -#' -#' @description -#' `r lifecycle::badge("deprecated")` -#' -#' This function returns all available -#' cryptocurrewncy pairs on the [available_exchanges] -#' -#' @inherit available_tickers -#' @family deprecated -#' -#' @export -availableTickers <- function( - source = 'binance', - futures = TRUE) { - - lifecycle::deprecate_soft( - when = '1.3.0', - what = "availableTickers()", - with = "available_tickers()" - ) - - # 0) Assert truthfulness - # and validity of all inputs - assert( - "Argument {.arg source} has to be {.cls character} of length {1}" = (is.character(source) & length(source) == 1), - "Argument {.arg futures} has to be {.cls logical} of length {1}" = (is.logical(futures) & length(futures) == 1) - ) - - assert( - source %in% suppressMessages( - available_exchanges( - type = 'ohlc' - ) - ) - ) - - # 1) make GET-request - # to ticker-information - response <- GET( - url = baseUrl( - source = source, - futures = futures - ), - endpoint = endPoint( - source = source, - futures = futures, - type = 'ticker' - ) - ) - - # 2) get source_response - # objects - source_response <- get( - paste0( - source, 'Response' - ) - )( - type = 'ticker', - futures = futures - ) - - ticker <- sort( - source_response$foo( - response = response, - futures = futures - ) - ) - - ticker - -} - -# script end; diff --git a/R/available_exchanges.R b/R/available_exchanges.R index 07a52b1e..90772d44 100644 --- a/R/available_exchanges.R +++ b/R/available_exchanges.R @@ -5,49 +5,42 @@ # exchanges in library # script start; +#' @title #' Get available exchanges #' #' @description #' `r lifecycle::badge("stable")` #' -#' Get a vector of all available exchanges passed into the source +#' Get a [vector] of all available exchanges passed into the `source` #' argument of the get-functions. #' #' @usage -#' ## available exchanges -#' ## by type #' available_exchanges( #' type = "ohlc" #' ) #' -#' @param type [character]-vector of length 1. See details +#' @param type [character]-vector of [length] 1. One of, +#' * \code{"ohlc"} - Available exchanges for Open, High, Low, Close and +#' Volume market data. See the [get_quote()]-function. +#' * \code{"lsratio"} - Available exchanges for Long-Short ratios. +#' See the [get_lsratio()]-function. +#' * \code{"fundingrate"} - Available exchanges for Funding rates. +#' See the [get_fundingrate()]-function. +#' * \code{"interest"} - Available exchanges for Open interest on perpetual +#' contracts on both sides. See the [get_openinterest()]-function. #' -#' @example man/examples/scr_availableExchanges.R +#' @returns +#' An [invisible()] [character]-vector containing available exchanges #' #' @details -#' -#' ## Available types -#' -#' -#' * ohlc: Open, High, Low, Close and Volume -#' * lsratio: Long-Short ratio -#' * fundingrate: Funding rates -#' * interest: Open perpetual contracts on both sides -#' -#' -#' ## Limits -#' #' The endpoints supported by the [available_exchanges()] are not uniform, -#' so exchanges available for, say, [get_lsratio()] is not necessarily the same as those available for [get_quote()] +#' so exchanges available for, say, [get_lsratio()] is not necessarily +#' the same as those available for [get_quote()] #' -#' @author Serkan Korkmaz +#' @example man/examples/scr_availableExchanges.R #' #' @family supported calls -#' -#' @returns -#' -#' An [invisible()] [character] vector containing available exchanges -#' +#' @author Serkan Korkmaz #' @export available_exchanges <- function( type = "ohlc"){ @@ -64,7 +57,10 @@ available_exchanges <- function( "i" = sprintf( "Has to be one of %s", paste( - paste0("{.val ",c("ohlc", "lsratio", "fundingrate", "interest") ,"}"), + paste0( + "{.val ", + c("ohlc", "lsratio", "fundingrate", "interest") ,"}" + ), collapse = ", " ) ) @@ -73,12 +69,12 @@ available_exchanges <- function( exchanges <- sort( switch( - type, - ohlc = c('binance', 'kucoin', 'kraken', 'bitmart', 'bybit'), - fundingrate = c('binance', 'bybit', 'kucoin'), - lsratio = c('binance', 'bybit', 'kraken'), - interest = c('binance', 'bybit') - ) + type, + ohlc = c('binance', 'kucoin', 'kraken', 'bitmart', 'bybit'), + fundingrate = c('binance', 'bybit', 'kucoin'), + lsratio = c('binance', 'bybit', 'kraken'), + interest = c('binance', 'bybit', 'kraken') + ) ) # 1) retun a message @@ -90,7 +86,7 @@ available_exchanges <- function( 'v' = paste( exchanges, collapse = ', ' - ) + ) ) ) diff --git a/R/available_intervals.R b/R/available_intervals.R index 2bf97e8d..85ea3889 100644 --- a/R/available_intervals.R +++ b/R/available_intervals.R @@ -1,38 +1,50 @@ +#' @title #' Get available intervals #' #' @description #' `r lifecycle::badge("stable")` #' -#' Get available intervals for the [available_tickers()] on the [available_exchanges()]. +#' Get available intervals for the [available_tickers()] +#' on the [available_exchanges()]. +#' +#' @usage available_intervals( +#' source = "binance", +#' type = "ohlc", +#' futures = TRUE +#' ) #' #' @inheritParams get_quote #' @inheritParams available_exchanges #' #' @inherit available_exchanges #' -#' @example man/examples/scr_availableIntervals.R #' #' @returns #' -#' An [invisible()] [character] vector containing the available intervals on -#' the exchange, market and endpoint +#' An [invisible()] [character]-vector containing the available intervals on +#' the exchange, market and endpoint. #' -#' @author Serkan Korkmaz +#' **Sample output** #' -#' @family supported calls +#' ```{r output, echo = FALSE} +#' head( +#' cryptoQuotes::available_intervals( +#' source = "bybit" +#' ) +#' ) +#' ``` +#' @example man/examples/scr_availableIntervals.R #' +#' @family supported calls +#' @author Serkan Korkmaz #' @export available_intervals <- function( source = 'binance', type = 'ohlc', futures = TRUE) { - # 0) define available # exchanges - - - assert( type %in% c("ohlc", "lsratio", "fundingrate", "interest"), error_message = c( @@ -43,7 +55,10 @@ available_intervals <- function( "i" = sprintf( "Has to be one of %s", paste( - paste0("{.val ",c("ohlc", "lsratio", "fundingrate", "interest") ,"}"), + paste0("{.val ", + c("ohlc", "lsratio", "fundingrate", "interest") + ,"}" + ), collapse = ", " ) ) @@ -85,7 +100,11 @@ available_intervals <- function( # intervals by exchange and market cli::cli_inform( message = c( - 'i' = paste0('Available Intervals at ', "{.val {source}}", ifelse(futures, ' (futures):', no = ' (spot):')), + 'i' = paste0( + 'Available Intervals at ', + "{.val {source}}", + ifelse(futures, ' (futures):', no = ' (spot):') + ), 'v' = paste( all_intervals, collapse = ', ' diff --git a/R/available_tickers.R b/R/available_tickers.R index 33e413cc..09c3ac46 100644 --- a/R/available_tickers.R +++ b/R/available_tickers.R @@ -1,27 +1,35 @@ -#' Get available cryptocurrency pairs +#' @title +#' Get actively traded cryptocurrency pairs #' #' @description #' `r lifecycle::badge("stable")` #' -#' Get available cryptocurrency pairs +#' Get actively traded cryptocurrency pairs on the [available_exchanges()]. #' #' @inheritParams get_quote #' -#' @example man/examples/scr_availableTickers.R -#' #' @returns +#' A [character]-vector of actively traded cryptocurrency pairs on the exchange, +#' and the specified market. #' -#' A [character]-vector of actively traded cryptocurrency pairs on the exchange, and the specified market. +#' **Sample output** +#' ```{r output, echo = FALSE} +#' head( +#' cryptoQuotes::available_tickers( +#' source = "bybit", +#' futures = TRUE +#' ) +#' ) +#' ``` #' #' @details +#' The naming-conventions across, and within, [available_exchanges()] are not +#' necessarily the same. This function lists all actively traded tickers. #' -#' The naming-conventions across, and within, [available_exchanges()] are not necessarily the same. This function lists -#' all actively traded tickers. -#' -#' @author Serkan Korkmaz +#' @example man/examples/scr_availableTickers.R #' #' @family supported calls -#' +#' @author Serkan Korkmaz #' @export available_tickers <- function( source = 'binance', @@ -30,8 +38,10 @@ available_tickers <- function( # 0) Assert truthfulness # and validity of all inputs assert( - "Argument {.arg source} has to be {.cls character} of length {1}" = (is.character(source) & length(source) == 1), - "Argument {.arg futures} has to be {.cls logical} of length {1}" = (is.logical(futures) & length(futures) == 1) + "Argument {.arg source} has to be {.cls character} of length {1}" = + (is.character(source) & length(source) == 1), + "Argument {.arg futures} has to be {.cls logical} of length {1}" = + (is.logical(futures) & length(futures) == 1) ) assert( diff --git a/R/chart.R b/R/chart.R index c90a9c6d..7f7beecf 100644 --- a/R/chart.R +++ b/R/chart.R @@ -6,378 +6,275 @@ # script start; # old function; ####### -#' Build interactive financial charts +#' @title +#' Build an interactive financial chart #' #' @description #' `r lifecycle::badge("experimental")` #' -#' [chart()] creates interactive financial charts using [plotly::plot_ly()] as backend. It's a high-level function which collects -#' and structures the passed chart elements. +#' A high-level [plotly::plot_ly()]- and [plotly::subplot()]-wrapper function +#' for building interactive financial charts using +#' the affiliated [chart]-functions. The [chart] consists of a main chart, and +#' an optional subchart. The main chart supports overlaying various trading +#' indicators like [sma] and [bollinger_bands]. #' -#' @param ticker A [xts::xts()]-object with Open, High, Low, Close and Volume columns. -#' @param main A [plotly::plot_ly()]-object wrapped in [rlang::expr()]. [kline()] by default. -#' @param sub An optional [list] of [plotly::plot_ly()]-object(s) wrapped in [rlang::expr()]. -#' @param indicator An optional [list] of [plotly::plot_ly()]-object(s) wrapped in [rlang::expr()]. -#' @param event_data An optional [data.frame] with event line(s) to be added to the [chart()]. See [add_event()] for more details. +#' @param ticker An object with Open, High, Low, Close and Volume columns that +#' can be coerced to a [xts::xts()]-object. +#' @param main A [plotly::plot_ly()]-function. [kline()] by default. +#' @param sub An optional [list] of [plotly::plot_ly()]-function(s). +#' @param indicator An optional [list] of [plotly::add_lines()]-function(s). +#' @param event_data An optional [data.frame] with event line(s) to be added +#' to the [chart()]. See [add_event()] for more details. #' @param options An optional [list] of [chart()]-options. See details below. #' +#' @returns A [plotly::plot_ly()] object. #' -#' @details +#' **Sample Output** +#' \if{html}{ +#' \out{}\figure{README-chartquote-1.png}{options: style="width:750px;max-width:75\%;"}\out{} +#' } +#' \if{latex}{ +#' \out{\begin{center}}\figure{README-chartquote-1.png}\out{\end{center}} +#' } #' +#' @details #' ## Options -#' * ```dark``` A [logical]-value of [length] 1. [TRUE] by default. Sets the overall theme of the [chart()] -#' * ```slider``` A [logical]-value of [length] 1. [FALSE] by default. If [TRUE], a [plotly::rangeslider()] is added. -#' * ```deficiency``` A [logical]-value of [length] 1. [FALSE] by default. If [TRUE], all [chart()]-elements are colorblind friendly -#' * ```size``` A [numeric]-value of [length] 1. The relative size of the main chart. 0.6 by default. Must be between 0 and 1, non-inclusive. #' +#' * \code{dark} A <[logical]>-value of [length] 1. [TRUE] by default. +#' Sets the overall theme of the [chart()] +#' * \code{slider} A <[logical]>-value of [length] 1. [FALSE] by default. +#' If [TRUE], a [plotly::rangeslider()] is added +#' * \code{deficiency} A <[logical]>-value of [length] 1. [FALSE] by default. +#' If [TRUE], all [chart()]-elements are colorblind friendly +#' * \code{size} A <[numeric]>-value of [length] 1. The relative size of the +#' main chart. 0.6 by default. Must be between 0 and 1, non-inclusive #' +#' ## Charting Events #' -#' @family chart indicators -#' @family price charts +#' If `event_data` is passed, vertical eventlines with appropriate labels and +#' coloring are added to the [chart()]. +#' This function is rigid, as it will fail if event, label and +#' index columns are not passed. #' +#' For more details please see [add_event()]. #' #' @example man/examples/scr_charting.R #' -#' @returns Returns a [plotly::plot_ly()] object. -#' +#' @family chart indicators +#' @family price charts #' @author Serkan Korkmaz -#' #' @export chart <- function( ticker, - main = kline(), - sub = list( - volume() - ), - indicator = list( - bollinger_bands() + main = list( + kline() ), + sub = list(), + indicator = list(), event_data = NULL, - options = list()) { - suppressWarnings( - expr = { - - # internal helper function; - # - # This is mainly to reduce - # the amount of repeated code - foo <- function(expr,...) { - - - # 1) Extract and modify calls - # by adding deficiency and ticker - # to the function - call <- rlang::call_modify( - .call = expr, - internal = list( - deficiency = deficiency, - ticker = ticker, - interval = interval, - ... - ) - ) - - # 2) expose the structure - # and the class of the call; - call <- rlang::eval_bare( - call - ) - - # 2.1) Extract the class - # from the call structure - call_class <- class( - call - ) - - # 3) evaluate the call - # and add the class - call <- rlang::eval_bare( - call + options = list()){ + + # 0) chart options and common + # independent parameters + name <- deparse(substitute(ticker)) + market <- attributes(ticker)$source + ticker <- tryCatch( + { + # 1) convert to xts + # to ensure consisten + # behaviour across + # chart functions + ticker <- xts::as.xts(ticker) + + ticker <- do.call( + cbind, + lapply( + c("open", "high", "low", "close", "volume"), + pull, + from = ticker ) - - class(call) <- c(class(call), call_class) - - call - - } - - # 0) intial parameters; - # TODO: Check wether this is unnecessary - name <- rlang::as_label(rlang::enquo(ticker)) - interval <- infer_interval(ticker) - market <- attributes(ticker)$source - ticker <- toDF(ticker) - - ## 1) set chart options - ## globally (locally) - default_options <- list( - dark = TRUE, - slider = FALSE, - deficiency = FALSE, - size = 0.6 ) - - options <- utils::modifyList( - x = default_options, - val = options, - keep.null = TRUE + ticker$candle <- factor( + as.factor(ticker$open > ticker$close), + levels = c(TRUE, FALSE), + labels = c("bear", "bull") ) - dark <- options$dark - deficiency <- options$deficiency - slider <- options$slider - size <- options$size - - - - # 1) Initialise the chart - # elements starting with the - # main_chart - chart_elements <- list( - main_chart = foo( - rlang::enexpr(main) - ) - ) - - # 2) wrap all indicator - # functions as expressions - indicator_fns <- rlang::enexpr( - sub - ) - - indicator_fns[1] <- NULL - - # 2) locate all subcharts - # from the indicator_fns - idx <-vapply( - X = lapply(X = indicator_fns, rlang::eval_bare), - FUN.VALUE = logical(1), - FUN = rlang::inherits_any, - class = c("chartelement", "subchart") - ) - - chart_elements$sub_chart <- lapply(indicator_fns[idx], foo) - - chart_elements <- flatten(chart_elements) - - - - # 3) extract price chart if it exists - # and apply the indicator functions - idx <- vapply( - X = chart_elements, - FUN = rlang::inherits_any, - class = "pricechart", - FUN.VALUE = logical(1) - ) - - if (any(idx)) { - - # 3.1) Extract all indicator - # functions - indicator_fns <- rlang::enexpr( - indicator - ) + ticker - # 3.2) Remove the first element - # of the list - indicator_fns[1] <- NULL + }, + error = function(error) { - pchart <- chart_elements[idx] - - lapply( - indicator_fns, - function(call) { - - pchart <<- foo( - call, - chart = pchart - ) - - } + assert( + FALSE, + error_message = c( + "x" = "The {.arg ticker} could not be coerced to {.cls xts}-object", + "v" = paste( + "See", cli::code_highlight( + code = "xts::as.xts()", + code_theme = "Chaos" + ), + "for further details." + ) ) + ) - chart_elements[idx] <- list(pchart) - - - - } - - - # Add event data if it - # exists - if (!is.null(event_data)){ + } + ) + interval <- infer_interval(ticker) + if (is.null(interval)) interval <- "Candle" - iteration <- 0 - chart_elements <- lapply( - chart_elements, - function(chart){ + ## 1) set chart options + ## globally (locally) + default_options <- list( + dark = TRUE, + slider = FALSE, + deficiency = FALSE, + size = 0.6 + ) - iteration <<- iteration + 1 + options <- utils::modifyList( + x = default_options, + val = options, + keep.null = TRUE + ) - rlang::eval_bare( - expr = add_event( - chart = chart, - event_data = event_data, - label = as.logical(iteration == 1) - ) - ) + dark <- options$dark + deficiency <- options$deficiency + slider <- options$slider + size <- options$size - } - ) + candle_color <- movement_color(deficiency = deficiency) - } + # 1) generate list + # of calls for lazy + # evaluation + call_list <- list( + main = substitute(main), + sub = as.list(substitute(sub))[-1], + indicator = as.list(substitute(indicator))[-1] + ) + # 2) modify the calls + # of the main and subcharts + # end with evaluation + plot_list <- Map( + f = function(.f) { + .f$data <- ticker + .f$slider <- slider + .f$interval <- interval + .f$candle_color <- candle_color + .f$deficiency <- deficiency + eval(.f) + }, + flatten(list(call_list$main, call_list$sub)) + ) + # 3.1) Get length + # of the plot_list + plot_list_length <- length( + plot_list + ) + if (!identical(call_list$indicator, list())) { + plot_list[1] <- list(Reduce( + f = function(plot, .f) { + # Modify the call list + .f$data <- ticker + .f$candle_color <- candle_color + .f$plot <- plot + eval(.f) + }, + x = call_list$indicator, + init = plot_list[[1]] + )) + } + if (!is.null(event_data)) { + # 1) convert function + # to call + .f <- substitute( + add_event( + data = event_data + ) + ) + plot_list <- Map( + f = function(x) { - # # # 0) Finalize plot - # # # and return - # # - # # chart_elements <- flatten(chart_elements) - # # - # # - chart_elements <- lapply( - X = chart_elements, - function(plot) { + # 1) add the plot to + # the function + .f$plot <- x - plotly::layout( - p = plot, - colorway = paletteer::paletteer_d("ggsci::category20b_d3"), + eval(.f) - # colorway =paletteer::paletteer_d("ggthemes::excel_Slice"), - # was 848e9c - xaxis = list( - gridcolor = if (dark) '#40454c' else NULL - ), - yaxis = list( - gridcolor = if (dark) '#40454c' else NULL - ) + }, + plot_list + ) - ) + } + # apply colors to to all + # to charts + # + # hcl.colors are colorblind friendly. See: + # https://stackoverflow.com/questions/57153428/r-plot-color-combinations-that-are-colorblind-accessible + n_colors <- length(unlist(call_list)) + colorway <- grDevices::hcl.colors(n = n_colors) - } + plot_list <- lapply( + X = plot_list, + FUN = function(plot) { + plotly::layout( + p = plot, + colorway = colorway ) + } + ) + - if (length(chart_elements) > 1) { + plot <- suppressWarnings( + plotly::subplot( + plot_list, + nrows = plot_list_length, + shareX = TRUE, + titleY = FALSE, + titleX = FALSE, + heights = if (plot_list_length > 1) { - heights <- c( + c( size, rep( - x = (1-size)/ (length(chart_elements) - 1), - length.out = length(chart_elements) - 1 + x = (1-size) / (plot_list_length - 1), + length.out = plot_list_length - 1 ) ) } else { - heights <- 1 - + 1 } - - - chart <- plotly::subplot( - chart_elements, - nrows = length(chart_elements), - shareX = TRUE, - titleY = TRUE, - heights = heights - ) - - plotly::layout( - p = chart, - font = list( - size = 14, - color = if (dark)'#848e9c' else NULL - ), - # width = if (interactive()) Inf else 1980, #Was 1000 - # height = if (interactive()) Inf else 1080, #was 1000 - margin = list(l = 60, r = 30, b = 65, t = 65), - yaxis = list( - title = NULL, - gridcolor = if (dark) '#40454c' else NULL - ), - xaxis = list( - rangeslider = list( - visible = slider, - thickness = 0.05 - ), - gridcolor = if (dark) '#40454c' else NULL - ), - showlegend = TRUE, - legend = list( - orientation = 'h', x = 0, y = 1,yref="container", title = list(text = "Indicators:")), - paper_bgcolor = if(dark)'#2b3139'else NULL, - plot_bgcolor = if(dark)'#2b3139'else NULL, - # font = list( - # color= if (dark)'#848e9c' else NULL - # ), - annotations = list( - list( - text = paste( - 'Ticker:', name, - 'Interval:', interval - ), - x = 0, - xref = 'paper', - y = 1, - yref = 'paper', - xanchor = 'left', - yanchor = 'bottom', - showarrow = FALSE, - font = list( - size =24 - ) - ), - list( - text = paste('Market:', market), - x = 1, - xref = 'paper', - y = 1, - yref = 'paper', - xanchor = 'right', - yanchor = 'bottom', - showarrow = FALSE, - font = list( - size = 24 - ) - ) - ) - # title = list( - # text=paste( - # 'Ticker:', - # name, - # 'Interval:', - # interval - # ), - # x = 0, - # xref = 'paper', - # yref = "container" - # # , - # # y = 1, - # # x = 0, - # - # # yref = 'paper' - # ) - ) - - } + ) ) + bar( + dark = dark, + plot = plot, + name = name, + market = market, + date_range = paste(range(zoo::index(ticker)), collapse = " - ") + ) } diff --git a/R/chart_bollingerbands.R b/R/chart_bollingerbands.R index dab02663..00169b87 100644 --- a/R/chart_bollingerbands.R +++ b/R/chart_bollingerbands.R @@ -4,162 +4,170 @@ # objective: Create expressions to be evaluted in # the charting function # script start; - +#' @title #' Add Bollinger Bands #' to the chart #' #' @description -#' #' `r lifecycle::badge("experimental")` #' -#' Bollinger Bands provide a visual representation of price volatility and are widely used by traders -#' and investors to assess potential price reversals and trade opportunities in various financial markets, including stocks, forex, and commodities. +#' A high-level [plotly::add_lines()]-wrapper function that interacts +#' with the [TTR::BBands()]-function. The function adds bollinger bands +#' to the main [chart()]. #' +#' @usage bollinger_bands( +#' n = 20, +#' sd = 2, +#' maType = "SMA", +#' color = '#4682b4', +#' ... +#' ) #' #' @inheritParams TTR::BBands -#' @param internal An empty [list]. Used for internal purposes. Ignore. -#' -#' @example man/examples/scr_charting.R -#' +#' @param color A [character]-vector of [length] 1. "#4682b4" by default. #' -#' -#' @returns Invisbly returns a plotly object. +#' @inherit kline #' #' @family chart indicators -#' +#' @family main chart indicators +#' @author Serkan Korkmaz #' @export bollinger_bands <- function( n = 20, sd = 2, maType = "SMA", - internal = list(), + color = '#4682b4', ...){ - structure( - rlang::expr( - { + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - # 0) locate global - # parameters to be passed - # into the charting functions; - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten( - lapply(!!rlang::enexpr(internal), rlang::eval_tidy) + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # # 1) unpack all elements + # # of the args + # data <- args$data + + # 0.4) linewidth + linewidth <- 0.90 + + # 1) calculate MACD + # indicator + data <- indicator( + x = args$data, + columns = c("high", "low", "close"), + .f = TTR::BBands, + n = n, + sd = sd, + maType = maType + ) + + layers <- list( + # middle line + list( + type = "add_lines", + params = list( + showlegend = FALSE, + legendgroup = 'bb', + name = "Lower", + inherit = FALSE, + data = data, + x = ~index, + y = ~dn, + line =list( + color = color, + width = linewidth + ) ) - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - chart <- internal_args$chart - - candle_color <- movement_color( - deficiency = deficiency - ) - - # 0.3) band color - color <- '#F100F1' - - # 0.4) linewidth - linewidth <- 0.90 + ), + + list( + type = "add_lines", + params = list( + showlegend = FALSE, + legendgroup = 'bb', + name = "Upper", + inherit = FALSE, + data = data, + x = ~index, + y = ~up, + line = list( + color = color, + width = linewidth + ) + ) - # 1) calculate MACD - # indicator - indicator_ <- toDF( - TTR::BBands( - HLC = toQuote(ticker)[, grep(pattern = 'high|low|close', x = colnames(ticker),ignore.case = TRUE)], - n = !!n, - maType = !!maType, - ... = !!rlang::enquos(...) + ), + + list( + type = "add_lines", + params = list( + showlegend = FALSE, + legendgroup = 'bb', + name = paste(maType), + inherit = FALSE, + data = data, + x = ~index, + y = ~mavg, + line = list( + color =color, + dash ='dot', + width = linewidth + ) ) + ) + ) + plot <- plotly::add_ribbons( + showlegend = TRUE, + legendgroup = 'bb', + p = args$plot, + inherit = FALSE, + x = ~index, + ymin = ~dn, + ymax = ~up, + data = data, + fillcolor = as_rgb(alpha = 0.1, hex_color = color), + line = list( + color = "transparent" + ), + name = paste0("BB(", paste(c(n, sd, maType), collapse = ", "), ")") + ) - layers <- list( - # middle line - list( - type = "add_lines", - params = list( - showlegend = FALSE,legendgroup = 'bb', - name = "Lower", - inherit = FALSE, - data = indicator_, - x = ~index, - y = ~dn, - line =list( - color = color, - width = linewidth - ) - ) - ), - - list( - type = "add_lines", - params = list( - showlegend = FALSE, - legendgroup = 'bb', - name = "Upper", - inherit = FALSE, - data = indicator_, - x = ~index, - y = ~up, - line = list( - color = color, - width = linewidth - ) - ) + plot <- build( + plot = plot, + layers = layers + ) - ), - - list( - type = "add_lines", - params = list( - showlegend = FALSE, - legendgroup = 'bb', - name = paste(!!maType), - inherit = FALSE, - data = indicator_, - x = ~index, - y = ~mavg, - line = list( - color =color, - dash ='dot', - width = linewidth - ) - ) - ) - - ) - - chart <- plotly::add_ribbons( - showlegend = TRUE, - legendgroup = 'bb', - p = chart, - inherit = FALSE, - x = ~index, - ymin = ~dn, - ymax = ~up, - data = indicator_, - fillcolor = 'rgba(241,0,241,0.1)', - line = list( - color = "transparent" - ), - name = paste0("BB(", paste(c(!!n, !!sd), collapse = ", "), ")") - ) + invisible( + plot + ) - chart <- build( - plot = chart, - layers = layers - ) - chart - } - ), - class = "indicator" + }, + class = c( + "indicator", + "plotly", + "htmlwidget" + ) ) } diff --git a/R/chart_donchian.R b/R/chart_donchian.R new file mode 100644 index 00000000..0a06a569 --- /dev/null +++ b/R/chart_donchian.R @@ -0,0 +1,182 @@ +# script: Donchian Channel +# author: Serkan Korkmaz, serkor1@duck.com +# date: 2024-05-30 +# objective: Charting the Donchian Channel. This was originally +# an example in the vignette custom_indicators - but has now been permanently +# added as a tribute to the turtle trading system +# script start; + +#' @title +#' Add Donchian Channels +#' to the chart +#' +#' @description +#' `r lifecycle::badge("experimental")` +#' +#' A high-level [plotly::add_lines()]-wrapper function that interacts +#' with the [TTR::DonchianChannel()]-function. +#' The function adds Donchian Channels +#' to the main [chart()]. +#' +#' @usage donchian_channel( +#' n = 10, +#' include.lag = FALSE, +#' color = '#4682b4', +#' ... +#' ) +#' +#' @inheritParams TTR::DonchianChannel +#' @param color A [character]-vector of [length] 1. "#4682b4" by default. +#' +#' @inherit kline +#' +#' @family chart indicators +#' @family main chart indicators +#' @author Serkan Korkmaz +#' @export +donchian_channel <- function( + ## these arguments are the + ## available arguments in the TTR::DonchianChannel + ## function + n = 10, + include.lag = FALSE, + color = '#4682b4', + ... +) { + + check_indicator_call() + + structure( + .Data = { + + ## 1) define args + ## as a list from the ellipsis + ## which is how the chart-function + ## communicates with the indicators + args <- list( + ... + ) + + ## 2) define the data, which in this + ## case is the indicator. The indicator + ## function streamlines the data so it works + ## with plotly + data <- indicator( + ## this is just the ticker + ## that is passed into the chart-function + x = args$data, + + ## columns are the columns of the ohlc + ## which the indicator is calculated on + columns = c("high", "low"), + + ## the function itself + ## can be a custom function + ## too. + .f = TTR::DonchianChannel, + + ## all other arguments + ## passed into .f + n = n, + include.lag = include.lag + ) + + ## each layer represents + ## each output from the indicator + ## in this case we have + ## high, mid and low. + ## + ## The lists represents a plotly-function + ## and its associated parameters. + layers <- list( + ## high + list( + type = "add_lines", + params = list( + showlegend = FALSE, + legendgroup = "DC", + name = "high", + inherit = FALSE, + data = data, + x = ~index, + y = ~high, + line = list( + color = color, + width = 0.9 + ) + ) + ), + + ## mid + list( + type = "add_lines", + params = list( + showlegend = FALSE, + legendgroup = "DC", + name = "mid", + inherit = FALSE, + data = data, + x = ~index, + y = ~mid, + line = list( + color = color, + dash ='dot', + width = 0.9 + ) + ) + ), + + ## low + list( + type = "add_lines", + params = list( + showlegend = FALSE, + legendgroup = "DC", + name = "low", + inherit = FALSE, + data = data, + x = ~index, + y = ~low, + line = list( + color = color, + width = 0.9 + ) + ) + ) + ) + + ## we can add ribbons + ## to the main plot to give + ## it a more structured look. + plot <- plotly::add_ribbons( + showlegend = TRUE, + legendgroup = 'DC', + p = args$plot, + inherit = FALSE, + x = ~index, + ymin = ~low, + ymax = ~high, + data = data, + fillcolor = as_rgb(alpha = 0.1, hex_color = color), + line = list( + color = "transparent" + ), + name = paste0("DC(", paste(c(n), collapse = ", "), ")") + ) + + ## the plot has to be build + ## using the cryptoQuotes::build-function + invisible( + build( + plot, + layers = layers + ) + ) + + } + ) + +} + + +# script end; diff --git a/R/chart_event.R b/R/chart_event.R index 7efedda8..d36a6add 100644 --- a/R/chart_event.R +++ b/R/chart_event.R @@ -1,177 +1,114 @@ -#' add eventlines to -#' the chart +#' @title +#' Add eventlines to the chart #' #' @description -#' #' `r lifecycle::badge("experimental")` #' -#' Common types of event indicators include earnings release dates, dividend payouts, central bank interest rate decisions, chart pattern breakouts, and geopolitical events like elections or geopolitical tensions. -#' The choice of event indicators depends on the trader's or analyst's specific objectives and the factors they believe are most relevant to the asset's price movements. -#' -#' -#' # Note -#' The eventlines are drawn using [plotly::layout()], so all existing -#' eventlines will be replaced each time you call [add_event()]. -#' +#' A high-level [plotly::layout()]-function. +#' The function adds `shapes` and `annotations` to the main [chart()]. #' -#' @param event_data a [data.frame] with index, event and colors. -#' @param ... arguments pass interally by [chart], ignore. +#' @param data a [data.frame]-type object with `index`, `event` +#' and `color` columns. +#' @param ... For internal use. Please ignore. #' +#' @returns A [plotly::plot_ly()]-object with `shapes` and `annotations` #' #' @details +#' The [data.frame] must include the following columns, #' -#' TBA -#' -#' +#' * `index` [integer] or [date]: corresponding to the event timing. +#' * `event` [character]: the event label. +#' * `color` [character]: the color of the event #' #' @example man/examples/scr_addEvents.R #' #' @family chart indicators -#' @family subcharts -#' -#' @returns Invisbly returns a plotly object. -#' @export +#' @family subchart indicators +#' @family main chart indicators +#' @author Serkan Korkmaz +#' @keywords internal add_event <- function( - event_data, + data, ... - # chart, - # event_data, - # label = TRUE - ) { +) { - structure( - rlang::expr( - { - - # 0) store the data - # so it can be passed in the remainder - # of the function with !! - event_data <- !!event_data - internal_args <- lapply(!!rlang::enquos(...), rlang::eval_tidy) - chart <- internal_args$chart - label <- internal_args$label - - - # 1) check if the data is - # passed as data.frame, tibble or data.table - # etc. - if (!rlang::inherits_any(x = event_data, class = "data.frame")) { - - cli::cli_abort( - message = c( - "{.var event_data} must be a {.cls data.frame}", - "x" = "You've supplied a {.cls {class(event_data)}}." - ) - ) - - } + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - # 2) check if expected columns - # have been passed correctly - expected_colnames <- c('index', 'event', 'color') - - # check if the column names - # include event, labels, color - colnames(event_data) <- tolower( - colnames( - event_data + structure( + .Data = { + + # 0) check data validity + # has to be of type data.frame and contain + # event, color and index columns + assert( + inherits(x = data, what = "data.frame"), + error_message = c( + "x" = sprintf( + fmt = "Expected {.cls data.frame} got {.cls %s}", + class(data) ) ) + ) - if (sum(grepl(x = colnames(event_data),pattern = paste(expected_colnames, collapse = "|"))) != 3) { - - # determine the missing column names - # from the data - missing_cols <- setdiff( - expected_colnames, - colnames(event_data) - ) - - cli::cli_abort( - message = c( - paste("Expected columns:", paste0("{.val ", expected_colnames, "}", collapse = ", ")), - "x" = paste("Missing columns:", paste0("{.val ", missing_cols, "}", collapse = ", ")), - "i" = "Check your spelling, or add the columns." - ) - ) - - } - + assert( + all(c("index", "event", "color") %in% colnames(data)), + error_message = c( + "x" = "Expected columns {.val index}, + {.val event}, {.val color}. None found." + ) + ) - # 3) modify the layout - # of the data to add - # the event lines - # - # - # TODO: Open issue at Github - # when calling layout + shapes twice, - # the first lines doesnt draw. - if (label) { + args <- list( + ... + ) - chart <- plotly::layout( - p = chart, - annotations = do.call( - list, - lapply( - 1:nrow(event_data), - function(i) { - annotations( - x = event_data$index[i], - text = event_data$event[i] - ) - } + plotly::layout( + p = args$plot, + annotations = do.call( + list, + lapply( + seq_len(nrow(data)), + function(i) { + annotations( + x = data$index[i], + text = data$event[i] ) - ), - shapes = do.call( - list, - lapply( - 1:nrow(event_data), - function(i) { + } - vline( - x = event_data$index[i], - col = event_data$color[i] - ) - - } - - ) - ) ) + ), + shapes = do.call( + list, + lapply( + seq_len(nrow(data)), + function(i) { + + vline( + x = data$index[i], + col = data$color[i] + ) - } else { - - - chart <- plotly::layout( - p = chart, - shapes = do.call( - list, - lapply( - 1:nrow(event_data), - function(i) { - - vline( - x = event_data$index[i], - col = event_data$color[i] - ) - - } + } - ) - ) ) + ) + ) - } - - chart - } - ), - class = "event" + }, + class = c( + "indicator", + "plotly", + "htmlwidget" + ) ) } diff --git a/R/chart_fgi.R b/R/chart_fgi.R index 27b35d39..6d0aa7c5 100644 --- a/R/chart_fgi.R +++ b/R/chart_fgi.R @@ -4,119 +4,115 @@ # objective: # script start; +#' @title #' Chart the Fear and Greed Index #' #' @description -#' #' `r lifecycle::badge("experimental")` #' -#' The fear and greed index is a market sentiment indicator that measures investor emotions to -#' gauge whether they are generally fearful (indicating potential selling pressure) or greedy (indicating potential buying enthusiasm) -#' -#' @param index The Fear and Greed Index created by [getFGIndex()] -#' @param internal An empty [list]. Used for internal purposes. Ignore. +#' A high-level [plotly::plot_ly()]-wrapper function. +#' The function adds a subchart with the `fear and greed`-index. #' -#' @example man/examples/scr_FGIndex.R +#' @param index A [xts::xts()]-object. See [get_fgindex()] for more details. #' -#' @details -#' The Fear and Greed Index goes from 0-100, and can be classifed as follows +#' @inherit kline +#' @inherit get_fgindex #' -#' \itemize{ -#' \item 0-24, Extreme Fear -#' \item 25-44, Fear -#' \item 45-55, Neutral -#' \item 56-75, Greed -#' \item 76-100, Extreme Greed -#' } +#' @example man/examples/scr_chartFGIndex.R #' #' @family chart indicators #' @family sentiment indicators -#' @family subcharts -#' -#' @returns Invisbly returns a plotly object. +#' @family subchart indicators +#' @author Serkan Korkmaz #' @export fgi <- function( index, - internal = list()) { - structure( - rlang::expr( - { - - # 0) locate global - # parameters to be passed - # into the charting functions; - - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) - deficiency <- internal_args$deficiency - - - candle_color <- movement_color( - deficiency = deficiency - ) - - - DT <- toDF( - quote = !!index - ) - + ...) { - color_scale <- if (deficiency){ + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - - rev(paletteer::paletteer_c("grDevices::Cividis", 30)) - - - } else { - paletteer::paletteer_c("grDevices::RdYlGn", 30) - - } - - value <- DT$fgi - - DT$color_scale <- ceiling( - (1-30) * (value -0)/(100 - 0) + 30 - ) - - DT$color_scale <- rev(color_scale)[ - DT$color_scale - ] - - plotly::layout( - yaxis = list( - title = 'Fear and Greed Index' + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) unpack values + # from chart + data <- zoo::fortify.zoo(index, names = "index") + color_deficiency <- args$deficiency + + + # 1.1) define available + # colors + color_scale <- grDevices::hcl.colors( + n = 30, + palette = ifelse(color_deficiency, "Cividis", "RdYlGn"), + rev = color_deficiency + ) + + data$color_scale <- normalize( + x = data$fgi, + range = c(0,30), + value = c(0,100) + ) + + data$color_scale <- color_scale[ + data$color_scale + ] + + plotly::layout( + plotly::plot_ly( + showlegend = FALSE, + name = "FGI", + data = data, + y = ~fgi, + x = ~index, + type = 'scatter', + mode = 'lines+markers', + line = list( + color = 'gray', + dash = 'dash', + shape = 'spline', + smoothing = 1.5 ), - p = plotly::plot_ly( - showlegend = TRUE, - name = "FGI", - data = DT, - y = ~fgi, - x = ~index, - type = 'scatter', - mode = 'lines+markers', + marker = list( + size = 10, + color = ~color_scale, line = list( - color = 'gray', - dash = 'dash', - shape = 'spline', - smoothing = 1.5 - ), - marker = list( - size = 10, - color = ~color_scale, - line = list( - color = 'black', - width = 2 - ) + color = 'black', + width = 2 ) ) + ), + annotations = list( + text = "Fear and Greed Index", + font = list( + size = 16 + ), + showarrow = FALSE, + x = 0, + y = 1, + xref = "paper", + yref = "paper" ) + ) - - } - ), - class = "subchart" + }, + class = c( + "subchart", + "plotly", + "htmlwidget" + ) ) - } # script end; diff --git a/R/chart_indicators.R b/R/chart_indicators.R deleted file mode 100644 index e1e88fd2..00000000 --- a/R/chart_indicators.R +++ /dev/null @@ -1,219 +0,0 @@ -# script: indicators; -# date: 2023-10-11 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Generate indictors -# that are compatible with -# plotly -# script start; - - -# addBBands <- function( - # chart, -# cols = c('High', 'Low', 'Close'), -# ... -# ) { -# -# -# ## 1) convert the embedded -# ## data.frame in the plot -# ## to xts, zoo object -# quote <- ( -# attributes(chart)$quote -# ) -# -# ## 2) extract the main chart -# ## and store it it as plot_ -# chart_ <- chart$main -# -# ## 3) calculate the bollinger -# ## bands using TTR and store -# ## it as indicator. -# indicator <- toDF( -# TTR::BBands( -# HLC = quote[ -# , -# which( -# sapply( -# colnames(quote), -# grepl, -# pattern = paste0(cols, collapse = '|'), -# ignore.case = TRUE -# ) -# ) -# ], -# ... -# ) -# ) -# -# ## 4) add the indicator -# ## to main plot_ -# chart_ <- chart_ %>% -# plotly::add_lines( -# showlegend = FALSE, -# data = indicator, -# x = ~Index, -# y = ~up, -# line = list( -# color ='#F100F1' -# ), -# inherit = FALSE, -# name = "up", -# ) %>% -# plotly::add_lines( -# data = indicator, -# x = ~Index, -# y = ~dn, -# showlegend = FALSE, -# fill = 'tonexty', -# fillcolor = 'rgba(241,0,241,0.1)', -# line = list( -# color ='#F100F1' -# ), -# inherit = FALSE, -# name = "dn" -# ) %>% -# plotly::add_lines( -# showlegend = FALSE, -# data = indicator, -# x = ~Index, -# y = ~mavg, -# line = list( -# dash ='dot', -# color = '#F100F1' -# ), -# inherit = FALSE, -# name = "MA" -# ) -# -# ## 5) store plot_ -# ## in the plot list -# ## in main -# chart$main <- chart_ -# -# ## 6) pass the quote on -# ## to the attributes of the -# ## for further indicator plots -# attributes(chart)$quote <- attributes(chart)$quote -# -# -# ## 7) return -# ## the plot invisibly -# ## to force enduser -# ## to use chart-function -# return( -# invisible(chart) -# ) -# -# } - - - -#' #' Add various Moving Average indicators -#' #' to the chart -#' #' -#' #' @description -#' #' -#' #' `r lifecycle::badge("experimental")` -#' #' -#' #' Moving averages are versatile tools used by traders and analysts in various timeframes, from short-term intraday trading to long-term investing. -#' #' They help smooth out noise in price data and provide valuable information for decision-making in financial markets. -#' #' -#' #' -#' #' -#' #' @param chart a [kline()] or [ohlc()] chart -#' #' @param FUN A named function calculating MAs. Has to be explicitly called. See [TTR::SMA()] for more information. -#' #' @param ... See [TTR::SMA()] -#' #' -#' #' @details -#' #' The function supports all moving averages calculated -#' #' by the [TTR] library. See [TTR::SMA()] for more information. -#' #' -#' #' -#' #' -#' #' @example man/examples/scr_charting.R -#' #' -#' #' @returns Invisbly returns a plotly object. -#' #' -#' #' @family chart indicators -#' #' @export -#' addMA <- function(chart, FUN = TTR::SMA, ...) { -#' -#' ## 0) extract -#' ## call to paste into the function -#' if (...length() == 0) { -#' -#' arguments <- rlang::fn_fmls( -#' fn = eval(FUN) -#' ) -#' -#' } else { -#' -#' arguments <- as.list( -#' match.call() -#' ) -#' } -#' -#' -#' foo <- match.fun( -#' FUN = FUN -#' ) -#' -#' -#' quote <- attributes(chart)$quote -#' -#' # 1) extract the main -#' # chart from the plot -#' chart_ <- chart$main -#' -#' quote_ <- toDF( -#' foo( -#' quote[,'Close'], -#' ... -#' ) -#' ) -#' -#' -#' -#' colnames(quote_)[!grepl(colnames(quote_), pattern = 'Index', ignore.case =TRUE)] <- 'value' -#' -#' chart_ <- chart_ %>% plotly::add_lines( -#' data = quote_, -#' name = paste0( -#' gsub(pattern = '^[a-z]+::', replacement = '', ignore.case = TRUE, x = deparse(arguments$FUN)), -#' '(', -#' names(arguments[4]), -#' '=', -#' arguments[[4]], -#' ')' -#' ), -#' x = ~Index, -#' y = ~value, -#' inherit = FALSE -#' ) -#' -#' -#' -#' -#' chart$main <- chart_ -#' attributes(chart)$quote <- quote -#' -#' -#' return( -#' invisible(chart) -#' ) -#' -#' -#' -#' -#' } - - - - - - - - - - -# script end; diff --git a/R/chart_lsr.R b/R/chart_lsr.R index 433ade14..601b9873 100644 --- a/R/chart_lsr.R +++ b/R/chart_lsr.R @@ -3,115 +3,119 @@ # author: Serkan Korkmaz, serkor1@duck.com # objective: # script start; - - -#' Chart the long-short ratios +#' @title +#' Chart the long-short ratio #' #' @description -#' #' `r lifecycle::badge("experimental")` #' -#' The [lsr()]-function adds a scatter plot as a subplot to the chart colored by ratio size. +#' A high-level [plotly::plot_ly()]-wrapper function. +#' The function adds a subchart to the [chart] with `long-short ratio`. #' -#' @details -#' The long-short ratio is a market sentiment indicator on expected price movement. +#' @param ratio A [xts::xts()]-object. See [get_lsratio()] for more details. +#' @inherit kline #' -#' @param ratio A [xts::xts()]-object with the column LSRatio. See [get_lsratio()] for more details. -#' @param internal An empty [list()]. This is an internal helper-argument, ignore. -#' -#' @example man/examples/scr_LSR.R +#' @example man/examples/scr_chartLSR.R #' #' @family chart indicators #' @family sentiment indicators -#' @family subcharts -#' -#' @returns A [plotly::plot_ly()]-object wrapped in [rlang::expr()] -#' +#' @family subchart indicators +#' @author Serkan Korkmaz #' @export lsr <- function( ratio, - internal = list()) { - structure( - rlang::expr( - { - - # 0) locate global - # parameters to be passed - # into the charting functions; - - # 0) locate global - # parameters to be passed - # into the charting functions; + ...) { - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - - - ratio <- toDF( - quote = !!ratio + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) unpack values + # from chart + data <- zoo::fortify.zoo(ratio, names = "index") + color_deficiency <- args$deficiency + + + # 1.1) define available + # colors + color_scale <- grDevices::hcl.colors( + n = 30, + palette = ifelse(color_deficiency, "Cividis", "RdYlGn"), + rev = color_deficiency + ) + + data$color_scale <- normalize( + x = data$ls_ratio, + range = c(0,30), + value = c(0,3) ) - - value <- ratio$ls_ratio - - ratio$color_scale <- round((30) * (value -0)/(2 - 0)) - - - color_scale <- if (deficiency){ - - - rev(paletteer::paletteer_c("grDevices::Cividis", 30)) - - - } else { - paletteer::paletteer_c("grDevices::RdYlGn", 30) - - } + data$color_scale <- color_scale[ + data$color_scale + ] + + plotly::layout( + plotly::plot_ly( + showlegend = FALSE, + name = "Long-Short Ratio", + data = data, + y = ~ls_ratio, + x = ~index, + type = 'scatter', + mode = 'lines+markers', + line = list( + color = 'gray', + dash = 'dash', + shape = 'spline', + smoothing = 1.5 + ), + marker = list( + size = 10, + color = ~color_scale, + line = list( + color = 'black', + width = 2 + ) + ) + ), + annotations = list( + text = "Long-Short Ratio", + font = list( + size = 16 + ), + showarrow = FALSE, + x = 0, + y = 1, + xref = "paper", + yref = "paper" + ) + ) - ratio$color_scale <- color_scale[ - ratio$color_scale - ] + }, + class = c( + "subchart", + "plotly", + "htmlwidget" + ) + ) - plotly::layout( - yaxis = list( - title = 'Long-Short Ratio' - ), - p = plotly::plot_ly( - showlegend = FALSE, - data = ratio, - y = ~ls_ratio, - x = ~Index, - type = 'scatter', - mode = 'lines+markers', - line = list( - color = 'gray', - dash = 'dash', - shape = 'spline', - smoothing = 1.5 - ), - marker = list( - size = 10, - color = ~color_scale, - line = list( - color = 'black', - width = 2 - ) - ) - ) - ) - } - ), - class = "subchart" - ) } diff --git a/R/chart_ma.R b/R/chart_ma.R index 07b0d170..a7a60485 100644 --- a/R/chart_ma.R +++ b/R/chart_ma.R @@ -5,205 +5,217 @@ # the charting function # script start; -#' Add Simple Moving Averages to the charts +chart_ma <- function( + data, + plot, + name, + y +) { + + plotly::add_lines( + p = plot, + data = data, + inherit = FALSE, + showlegend = TRUE, + name = name, + x = ~index, + y = stats::as.formula( + # NOTE: to avoid possible naming + # bugs in TTR use names(data)[2]. + # names(data)[1] is index as per + # zoo.fortify + paste("~",names(data)[2]) + ), + line = list( + width = 0.9 + ) + ) + +} + +#' @title +#' Add Simple Moving Average (SMA) indicators to the chart #' #' @description #' #' `r lifecycle::badge("experimental")` #' -#' A high-level [plotly::add_lines()]-wrapper function that interacts with [TTR]'s moving average family of functions. +#' A high-level [plotly::add_lines()]-wrapper function that +#' interacts with [TTR]'s moving average family of functions. +#' The function adds moving average indicators to the main [chart()]. +#' +#' @usage sma( +#' price = "close", +#' n = 10, +#' ... +#' ) #' #' @inheritParams TTR::SMA -#' @param price A [character]-vector of [length] 1. Close by default. The name of the vector to passed into [TTR::SMA] -#' @param internal An empty [list]. Used for internal purposes. Ignore. +#' @param price A [character]-vector of [length] 1. "close" by default. +#' The name of the vector to passed into [TTR::SMA]. +#' @param ... For internal use. Please ignore. #' -#' @example man/examples/scr_charting.R +#' @example man/examples/scr_MAindicator.R #' #' @returns #' -#' A [plotly::plot_ly()]-object wrapped in [rlang::expr()]. +#' A [plotly::plot_ly()]-object #' #' @family chart indicators #' @family moving average indicators -#' +#' @family main chart indicators +#' @author Serkan Korkmaz #' @export sma <- function( price = "close", n = 10, - internal = list(), ...) { - structure( - rlang::expr( - { - - # 0) locate global - # parameters to be passed - # into the charting functions; - - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) - - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - chart <- internal_args$chart - - - - candle_color <- movement_color( - deficiency = deficiency - ) - - - # 0.4) linewidth - linewidth <- 0.90 - - # 1) calculate MACD - # indicator - indicator <- toDF( - TTR::SMA( - x = toQuote(ticker)[, grep(pattern = !!price, x = colnames(ticker),ignore.case = TRUE)], - n = !!n, - ... = !!rlang::enquos(...) - ) - ) - - - - # 2) add middle band - chart <- plotly::add_lines( - showlegend = TRUE, - p = chart, - inherit = FALSE, - data = indicator, - x = ~index, - y = ~sma, - line = list( - width = linewidth - ), - name = paste0("SMA(", !!n, ")") - ) - - - - chart + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - } - ), - class = "indicator" + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) calculate MACD + # indicator + data <- indicator( + x = args$data, + columns = price, + .f = TTR::SMA, + n = n + ) + + + # 3) add ma chart + chart_ma( + data = data, + plot = args$plot, + name = paste0("SMA(", n, ")"), + y = "sma" + + ) + + + }, + class = c( + "indicator", + "plotly", + "htmlwidget" + ) ) } - -#' Add Exponentially Weighted Moving Average to the charts +#' @title +#' Add Exponentially-Weighted Moving Average (EMA) to the chart #' -#' @inherit sma description +#' @usage ema( +#' price = "close", +#' n = 10, +#' wilder = FALSE, +#' ratio = NULL, +#' ... +#' ) #' -#' @param price A [character]-vector of [length] 1. Close by default. The name of the vector to passed into [TTR::EMA] +#' @param price A [character]-vector of [length] 1. "close" by default. +#' The name of the vector to passed into [TTR::EMA]. #' @inheritParams TTR::EMA -#' @param internal An empty [list]. Used for internal purposes. Ignore. -#' -#' @example man/examples/scr_charting.R +#' @param ... For internal use. Please ignore. #' -#' @returns -#' -#' A [plotly::plot_ly()]-object wrapped in [rlang::expr()]. +#' @inherit sma #' #' @family chart indicators #' @family moving average indicators -#' +#' @family main chart indicators +#' @author Serkan Korkmaz #' @export ema <- function( - price = "Close", + price = "close", n = 10, wilder = FALSE, ratio = NULL, - internal = list(), ...) { - structure( - rlang::expr( - { - - # 0) locate global - # parameters to be passed - # into the charting functions; - - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) - - - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - chart <- internal_args$chart - - - - candle_color <- movement_color( - deficiency = deficiency - ) - - - # 0.4) linewidth - linewidth <- 0.90 - - # 1) calculate MACD - # indicator - indicator <- toDF( - TTR::EMA( - x = toQuote(ticker)[, grep(pattern = !!price, x = colnames(ticker),ignore.case = TRUE)], - n = !!n, - wilder = !!wilder, - ratio = !!ratio, - ... = !!rlang::enquos(...) - ) - ) - - - - # 2) add middle band - plotly::add_lines( - showlegend = TRUE, - p = chart, - inherit = FALSE, - data = indicator, - x = ~index, - y = ~ema, - line = list( - width = linewidth - ), - name = paste0("EMA(", !!n, ")") - ) - - - - + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - } - ), - class = "indicator" + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) calculate MACD + # indicator + data <- indicator( + x = args$data, + columns = price, + .f = TTR::EMA, + n = n, + wilder = wilder, + ratio = ratio, + ) + + # 2) add ma chart + chart_ma( + data = data, + plot = args$plot, + name = paste0("EMA(", n, ")"), + y = "ema" + + ) + + + + }, + class = c( + "indicator", + "plotly", + "htmlwidget" + ) ) } -#' Add Double Exponential Moving Average to the chart +#' @title +#' Add Double Exponential Moving Average (DEMA) to the chart #' -#' @inherit sma description +#' @usage dema( +#' price = "close", +#' n = 10, +#' v = 1, +#' wilder = FALSE, +#' ratio = NULL, +#' ... +#' ) #' -#' @param price A [character]-vector of [length] 1. Close by default. The name of the vector to passed into [TTR::DEMA] +#' @param price A [character]-vector of [length] 1. "close" by default. +#' The name of the vector to passed into [TTR::DEMA]. #' @inheritParams TTR::DEMA -#' @param internal An empty [list]. Used for internal purposes. Ignore. -#' -#' @example man/examples/scr_charting.R +#' @param ... For internal use. Please ignore. #' -#' @returns -#' -#' A [plotly::plot_ly()]-object wrapped in [rlang::expr()]. +#' @inherit sma #' #' @family chart indicators #' @family moving average indicators -#' +#' @family main chart indicators +#' @author Serkan Korkmaz #' @export dema <- function( price = "close", @@ -211,601 +223,498 @@ dema <- function( v = 1, wilder = FALSE, ratio = NULL, - internal = list()) { - - structure( - rlang::expr( - { - - # 0) locate global - # parameters to be passed - # into the charting functions; - - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) - - - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - chart <- internal_args$chart - - - - candle_color <- movement_color( - deficiency = deficiency - ) - - - # 0.4) linewidth - linewidth <- 0.90 - - # 1) calculate MACD - # indicator - indicator <- toDF( - TTR::DEMA( - x = toQuote(ticker)[, grep(pattern = !!price, x = colnames(ticker),ignore.case = TRUE)], - n = !!n, - v = !!v, - wilder = !!wilder, - ratio = !!ratio - ) - ) - - - - # 2) add middle band - plotly::add_lines( - showlegend = TRUE, - p = chart, - inherit = FALSE, - data = indicator, - x = ~index, - y = ~dema, - line = list( - width = linewidth - ), - name = paste0("DEMA(", !!n, ")") - ) - - + ...) { - chart + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - } - ), - class = "indicator" + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) calculate MACD + # indicator + data <- indicator( + x = args$data, + columns = price, + .f = TTR::DEMA, + n = n, + v = v, + wilder = wilder, + ratio = ratio + ) + + # 2) add ma chart + chart_ma( + data = data, + plot = args$plot, + name = paste0("DEMA(", n, ")"), + y = "dema" + + ) + + + + }, + class = c( + "indicator", + "plotly", + "htmlwidget" + ) ) + } -#' Add Weighted Moving Average to the chart +#' @title +#' Add Weighted Moving Average (WMA) to the chart #' -#' @inherit sma description +#' @usage wma( +#' price = "close", +#' n = 10, +#' wts = 1:n, +#' ... +#' ) #' -#' @param price A [character]-vector of [length] 1. Close by default. The name of the vector to passed into [TTR::WMA] +#' @param price A [character]-vector of [length] 1. "close" by default. +#' The name of the vector to passed into [TTR::WMA]. #' @inheritParams TTR::WMA -#' @param internal An empty [list]. Used for internal purposes. Ignore. -#' -#' @example man/examples/scr_charting.R +#' @param ... For internal use. Please ignore. #' -#' @returns -#' -#' A [plotly::plot_ly()]-object wrapped in [rlang::expr()]. +#' @inherit sma #' #' @family chart indicators #' @family moving average indicators -#' +#' @family main chart indicators +#' @author Serkan Korkmaz #' @export wma <- function( price = "close", n = 10, wts = 1:n, - internal = list(), ...) { - structure( - rlang::expr( - { - - # 0) locate global - # parameters to be passed - # into the charting functions; - - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) - - - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - chart <- internal_args$chart - - - - candle_color <- movement_color( - deficiency = deficiency - ) - - - # 0.4) linewidth - linewidth <- 0.90 - - # 1) calculate MACD - # indicator - indicator <- toDF( - TTR::WMA( - x = toQuote(ticker)[, grep(pattern = !!price, x = colnames(ticker),ignore.case = TRUE)], - n = !!n, - wts = !!wts, - ... = !!rlang::enquos(...) - ) - ) - - # NOTE: The column - # name of WMA is broken - # TODO: Submit a PR - - - - # 2) add middle band - plotly::add_lines( - showlegend = TRUE, - p = chart, - inherit = FALSE, - data = indicator, - x = ~index, - y = ~v1, - line = list( - width = linewidth - ), - name = paste0("WMA(", !!n, ")") - ) + # TODO: Submit PR, WMA has an issue + # too in the naming. + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - } - ), - class = "indicator" + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) calculate MACD + # indicator + data <- indicator( + x = args$data, + columns = price, + .f = TTR::WMA, + n = n, + wts = wts + ) + + # 2) add ma chart + chart_ma( + data = data, + plot = args$plot, + name = paste0("WMA(", n, ")"), + y = "wma" + + ) + + + + }, + class = c( + "indicator", + "plotly", + "htmlwidget" + ) ) } - -#' Add Elastic Volume-weighted Moving Average to the chart +#' @title +#' Add Elastic Volume-Weighted Moving Average (EVWMA) to the chart #' -#' @inherit sma description +#' @usage evwma( +#' price = "close", +#' n = 10, +#' ... +#' ) #' -#' @param price A [character]-vector of [length] 1. Close by default. The name of the vector to passed into [TTR::EVWMA] +#' @param price A [character]-vector of [length] 1. "close" by default. +#' The name of the vector to passed into [TTR::EVWMA] #' @inheritParams TTR::EVWMA -#' @param internal An empty [list]. Used for internal purposes. Ignore. +#' @param ... For internal use. Please ignore. #' -#' @example man/examples/scr_charting.R -#' -#' @returns -#' -#' A [plotly::plot_ly()]-object wrapped in [rlang::expr()]. +#' @inherit sma #' #' @family chart indicators #' @family moving average indicators -#' +#' @family main chart indicators +#' @author Serkan Korkmaz #' @export evwma <- function( - price = "Close", + price = "close", n = 10, - internal = list(), ...) { - structure( - rlang::expr( - { - - # 0) locate global - # parameters to be passed - # into the charting functions; - - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) - - - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - chart <- internal_args$chart - - - - candle_color <- movement_color( - deficiency = deficiency - ) - - - # 0.4) linewidth - linewidth <- 0.90 - - # 1) calculate MACD - # indicator - indicator <- toDF( - TTR::EVWMA( - price = toQuote(ticker)[, grep(pattern = !!price, x = colnames(ticker),ignore.case = TRUE)], - volume = toQuote(ticker)$volume, - n = !!n, - ... = !!rlang::enquos(...) - ) - ) - - # NOTE: The column - # name of WMA is broken - # TODO: Submit a PR - - - - # 2) add middle band - plotly::add_lines( - showlegend = TRUE, - p = chart, - inherit = FALSE, - data = indicator, - x = ~index, - y = ~v1, - line = list( - width = linewidth - ), - name = paste0("EVWMA(", !!n, ")") - ) + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - } - ), - class = "indicator" + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) calculate MACD + # indicator + data <- indicator( + x = args$data, + columns = price, + .f = TTR::EVWMA, + volume = args$data$volume, + n = n + ) + + # 2) add ma chart + chart_ma( + data = data, + plot = args$plot, + name = paste0("EVWMA(", n, ")"), + y = "evwma" + + ) + + }, + class = c( + "indicator", + "plotly", + "htmlwidget" + ) ) } -#' Add Zero Lag Exponential Moving Average to the chart -#' +#' @title +#' Add Zero Lag Exponential Moving Average (ZLEMA) to the chart #' -#' @inherit sma description +#' @usage zlema( +#' price = "close", +#' n = 10, +#' ratio = NULL, +#' ... +#' ) #' -#' @param price A [character]-vector of [length] 1. Close by default. The name of the vector to passed into [TTR::ZLEMA] +#' @param price A [character]-vector of [length] 1. "close" by default. +#' The name of the vector to passed into [TTR::ZLEMA]. #' @inheritParams TTR::ZLEMA -#' @param internal An empty [list]. Used for internal purposes. Ignore. +#' @param ... For internal use. Please ignore. #' -#' @example man/examples/scr_charting.R -#' -#' @returns -#' -#' A [plotly::plot_ly()]-object wrapped in [rlang::expr()]. +#' @inherit sma #' #' @family chart indicators #' @family moving average indicators -#' +#' @family main chart indicators +#' @author Serkan Korkmaz #' @export zlema <- function( price = "close", n = 10, ratio = NULL, - internal = list(), ...) { - structure( - rlang::expr( - { - - # 0) locate global - # parameters to be passed - # into the charting functions; - - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) - - - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - chart <- internal_args$chart - - - - candle_color <- movement_color( - deficiency = deficiency - ) - - - # 0.4) linewidth - linewidth <- 0.90 - - # 1) calculate MACD - # indicator - indicator <- toDF( - TTR::ZLEMA( - x = toQuote(ticker)[, grep(pattern = !!price, x = colnames(ticker),ignore.case = TRUE)], - ratio = !!ratio, - n = !!n, - ... = !!rlang::enquos(...) - ) - ) - - # NOTE: The column - # name of WMA is broken - # TODO: Submit a PR - - - - # 2) add middle band - plotly::add_lines( - showlegend = TRUE, - p = chart, - inherit = FALSE, - data = indicator, - x = ~index, - y = ~v1, - line = list( - width = linewidth - ), - name = paste0("ZLEMA(", !!n, ")") - ) + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - } - ), - class = "indicator" + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) calculate MACD + # indicator + data <- indicator( + x = args$data, + columns = price, + .f = TTR::ZLEMA, + n = n, + ratio = ratio + ) + + # 2) add ma chart + chart_ma( + data = data, + plot = args$plot, + name = paste0("ZLEMA(", n, ")"), + y = "zlema" + + ) + + }, + class = c( + "indicator", + "plotly", + "htmlwidget" + ) ) } -#' Add Volume-weighted Moving Average to the chart +#' @title +#' Add Volume-Weighted Moving Average (VWAP) to the chart #' -#' @inherit sma description +#' @usage vwap( +#' price = "close", +#' n = 10, +#' ratio = NULL, +#' ... +#' ) #' -#' @param price A [character]-vector of [length] 1. Close by default. The name of the vector to passed into [TTR::VWAP] +#' @param price A [character]-vector of [length] 1. "close" by default. +#' The name of the vector to passed into [TTR::VWAP] #' @inheritParams TTR::VWAP -#' @param internal An empty [list]. Used for internal purposes. Ignore. -#' -#' @example man/examples/scr_charting.R +#' @param ... For internal use. Please ignore. #' -#' @returns -#' -#' A [plotly::plot_ly()]-object wrapped in [rlang::expr()]. +#' @inherit sma #' #' @family chart indicators +#' @family moving average indicators +#' @family main chart indicators +#' @author Serkan Korkmaz #' @export vwap <- function( price = "close", n = 10, ratio = NULL, - internal = list(), ...) { + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() + structure( - rlang::expr( - { - - # 0) locate global - # parameters to be passed - # into the charting functions; - - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) - - - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - chart <- internal_args$chart - - - - candle_color <- movement_color( - deficiency = deficiency - ) - - - # 0.4) linewidth - linewidth <- 0.90 - - # 1) calculate MACD - # indicator - indicator <- toDF( - TTR::VWAP( - price = toQuote(ticker)[, grep(pattern = !!price, x = colnames(ticker),ignore.case = TRUE)], - volume = toQuote(ticker)$volume, - n = !!n, - ... = !!rlang::enquos(...) - ) - ) - - # 2) add middle band - plotly::add_lines( - showlegend = TRUE, - p = chart, - inherit = FALSE, - data = indicator, - x = ~index, - y = ~vwap, - line = list( - width = linewidth - ), - name = paste0("VWAP(", !!n, ")") - ) - - } - ), - class = "indicator" + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) calculate MACD + # indicator + data <- indicator( + x = args$data, + columns = price, + .f = TTR::VWAP, + n = n, + ratio = ratio, + volume = args$data$volume + ) + + # 2) add ma chart + chart_ma( + data = data, + plot = args$plot, + name = paste0("VWAP(", n, ")"), + y = "vwap" + + ) + + }, + class = c( + "indicator", + "plotly", + "htmlwidget" + ) ) + + } -#' Add Hull Moving Average to the chart +#' @title +#' Add Hull Moving Average (HMA) to the chart #' -#' @inherit sma description +#' @usage hma( +#' price = "close", +#' n = 20, +#' ... +#' ) #' -#' @param price A [character]-vector of [length] 1. Close by default. The name of the vector to passed into [TTR::HMA] +#' @param price A [character]-vector of [length] 1. "close" by default. +#' The name of the vector to passed into [TTR::HMA]. #' @inheritParams TTR::HMA -#' @param internal An empty [list]. Used for internal purposes. Ignore. -#' -#' @example man/examples/scr_charting.R -#' -#' @returns +#' @param ... For internal use. Please ignore. #' -#' A [plotly::plot_ly()]-object wrapped in [rlang::expr()]. +#' @inherit sma #' #' @family chart indicators #' @family moving average indicators -#' +#' @family main chart indicators +#' @author Serkan Korkmaz #' @export hma <- function( - price = "Close", + price = "close", n = 20, - internal = list(), ...) { + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() + structure( - rlang::expr( - { - - # 0) locate global - # parameters to be passed - # into the charting functions; - - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) - - - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - chart <- internal_args$chart - - - - candle_color <- movement_color( - deficiency = deficiency - ) - - - # 0.4) linewidth - linewidth <- 0.90 - - # 1) calculate MACD - # indicator - indicator <- toDF( - TTR::HMA( - x = toQuote(ticker)[,grep(pattern = !!price, x = colnames(ticker),ignore.case = TRUE)], - n = !!n, - ... = !!rlang::enquos(...) - ) - ) - - # 2) add middle band - plotly::add_lines( - showlegend = TRUE, - p = chart, - inherit = FALSE, - data = indicator, - x = ~index, - y = ~v1, - line = list( - width = linewidth - ), - name = paste0("HMA(", !!n, ")") - ) - - } - ), - class = "indicator" + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) calculate MACD + # indicator + data <- indicator( + x = args$data, + columns = price, + .f = TTR::HMA, + n = n + ) + + # 2) add ma chart + chart_ma( + data = data, + plot = args$plot, + name = paste0("HMA(", n, ")"), + y = "hma" + + ) + + }, + class = c( + "indicator", + "plotly", + "htmlwidget" + ) ) } - -#' Add Arnaud Legoux Moving Average to the chart +#' @title +#' Add Arnaud Legoux Moving Average (ALMA) to the chart #' -#' @inherit sma description +#' @usage alma( +#' price = "close", +#' n = 9, +#' offset = 0.85, +#' sigma = 6, +#' ... +#' ) #' -#' @param price A [character]-vector of [length] 1. Close by default. The name of the vector to passed into [TTR::ALMA] +#' @param price A [character]-vector of [length] 1. "close" by default +#' The name of the vector to passed into [TTR::ALMA]. #' @inheritParams TTR::ALMA -#' @param internal An empty [list]. Used for internal purposes. Ignore. +#' @param ... For internal use. Please ignore. #' -#' @example man/examples/scr_charting.R -#' -#' @returns -#' -#' A [plotly::plot_ly()]-object wrapped in [rlang::expr()]. +#' @inherit sma #' #' @family chart indicators #' @family moving average indicators -#' +#' @family main chart indicators +#' @author Serkan Korkmaz #' @export alma <- function( price = "close", n = 9, offset = 0.85, sigma = 6, - internal = list(), ...) { - # NOTE: ALMA doesnt return a - # column with ALMA name nor V1 + # check if the indicator is called + # from the chart-function # - # It returns the same column name as - # passed - # TODO: Submit PR + # stops the function if not + check_indicator_call() structure( - rlang::expr( - { - - # 0) locate global - # parameters to be passed - # into the charting functions; - - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) - - - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - chart <- internal_args$chart - - - - candle_color <- movement_color( - deficiency = deficiency - ) - - - # 0.4) linewidth - linewidth <- 0.90 - - # 1) calculate MACD - # indicator - indicator <- toDF( - TTR::ALMA( - x = toQuote(ticker)[, grep(pattern = !!price, x = colnames(ticker),ignore.case = TRUE)], - n = !!n, - offset = !!offset, - sigma = !!sigma, - ... = !!rlang::enquos(...) - ) - ) - - # 2) add middle band - plotly::add_lines( - showlegend = TRUE, - p = chart, - inherit = FALSE, - data = indicator, - x = ~index, - y = ~!!rlang::sym(price), - line = list( - width = linewidth - ), - name = paste0("ALMA(", !!n, ")") - ) - - } - ), - class = "indicator" + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) calculate MACD + # indicator + data <- indicator( + x = args$data, + columns = price, + .f = TTR::ALMA, + n = n, + offset = offset, + sigma = sigma + ) + + # 2) add ma chart + chart_ma( + data = data, + plot = args$plot, + name = paste0("ALMA(", n, ")"), + y = "alma" + + ) + + }, + class = c( + "indicator", + "plotly", + "htmlwidget" + ) ) } - # script end; diff --git a/R/chart_macd.R b/R/chart_macd.R index 8aa62fdc..e506def6 100644 --- a/R/chart_macd.R +++ b/R/chart_macd.R @@ -6,25 +6,36 @@ # the charting function # script start; -#' Add MACD indicators to the chart +#' @title +#' Chart the Moving Average Convergence Divergence (MACD) indicator #' #' @description -#' #' `r lifecycle::badge("experimental")` #' -#' Traders and investors use the MACD indicator to identify trend changes, potential reversals, and overbought or oversold conditions in the market. -#' It is a versatile tool that can be applied to various timeframes and asset classes, making it a valuable part of technical analysis for many traders. +#' A high-level [plotly::plot_ly()]- and [plotly::add_lines()]-function that +#' interacts with the [TTR::MACD()]-function. The function adds subchart with a +#' [TTR::MACD()]-indicator. +#' +#' @usage macd( +#' nFast = 12, +#' nSlow = 26, +#' nSig = 9, +#' maType = "SMA", +#' percent = TRUE, +#' ... +#' ) #' #' @inheritParams TTR::MACD -#' @param internal An empty [list]. Used for internal purposes. Ignore. +#' @param ... For internal use. Please ignore. #' -#' @example man/examples/scr_charting.R +#' @inherit kline #' -#' @returns Invisbly returns a plotly object. +#' @example man/examples/scr_charting.R #' #' @family chart indicators -#' @family subcharts -#' +#' @family subchart indicators +#' @family momentum indicators +#' @author Serkan Korkmaz #' @export macd <- function( nFast = 12, @@ -32,125 +43,136 @@ macd <- function( nSig = 9, maType = "SMA", percent = TRUE, - internal = list(), ...){ + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() structure( - rlang::expr( - { - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) - - - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency - - - - candle_color <- movement_color( - deficiency = deficiency - ) - - # 0.3) band color - color <- '#F100F1' - - # 0.4) linewidth - linewidth <- 0.90 - - # 1) calculate MACD - # indicator - indicator_ <- toDF( - TTR::MACD( - x = toQuote(ticker)[,grep(pattern = 'close', x = colnames(ticker))], - nFast = !!nFast, - nSlow = !!nSlow, - nSig = !!nSig, - maType = !!maType, - percent = !!percent, - !!rlang::enquos(...) + .Data = { + + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) unpack all elements + # of the args + #data <- args$data + + + # 0.4) linewidth + linewidth <- 0.90 + + # 1) calculate MACD + # indicator + data <- indicator( + x = args$data, + columns = "close", + .f = TTR::MACD, + nFast = nFast, + nSlow = nSlow, + nSig = nSig, + maType = maType, + percent = percent + + ) + + + data$direction <- as.logical( + data$signal >= data$macd + ) + + # 2) create plot + # without using pipes; + p <- plotly::plot_ly( + data = data, + showlegend = FALSE, + name = 'MACD', + x = ~ index, + y = ~ (macd - signal), + color = ~ direction, + colors = c( + # The first color always + # applies to the true condition + args$candle_color$bullish, + args$candle_color$bearish), + type = 'bar', + marker = list(line = list( + color = "black", + width = 0.5 + )) + ) + + layers <- list( + list( + type = "add_lines", + params = list( + name = "MACD: Signal", + data = data, + showlegend = FALSE, + x = ~ index, + y = ~ signal, + inherit = FALSE, + line = list(width = linewidth) ) - ) - indicator_$direction <- as.logical( - indicator_$signal >= indicator_$macd - ) + ), + list( + type = "add_lines", + params = list( + name = "MACD: MACD", + data = data, + showlegend = FALSE, + x = ~ index, + y = ~ macd, + inherit = FALSE, + line = list(width = linewidth) + ) - # 2) create plot - # without using pipes; - p <- plotly::plot_ly( - data = indicator_, - showlegend = FALSE, - name = 'MACD', - x = ~ index, - y = ~ (macd - signal), - color = ~ direction, - colors = c( - # The first color always - # applies to the true condition - candle_color$bullish, - candle_color$bearish), - type = 'bar', - marker = list(line = list( - color = "black", - width = 0.5 - )) ) + ) - layers <- list( + p <- build( + plot = p, + layers = layers, + annotations = list( list( - type = "add_lines", - params = list( - name = "MACD: Signal", - data = indicator_, - showlegend = FALSE, - x = ~ index, - y = ~ signal, - inherit = FALSE, - line = list(width = linewidth) - ) - - ), - list( - type = "add_lines", - params = list( - name = "MACD: MACD", - data = indicator_, - showlegend = FALSE, - x = ~ index, - y = ~ macd, - inherit = FALSE, - line = list(width = linewidth) - ) - + text = paste0( + "MACD(",paste(c(nFast, nSlow,nSig), collapse = ', '), ")" + ), + x = 0, + y = 1, + font = list( + size = 16 + ), + xref = 'paper', + yref = 'paper', + showarrow = FALSE ) + ), + yaxis = list( + title = NA ) + ) - p <- build( - plot = p, - layers = layers, - annotations = list( - list( - text = paste0("MACD(",paste(c(!!nFast, !!nSlow,!!nSig), collapse = ','), ")"), - x = 0.01, - y = 1, - xref = 'paper', - yref = 'paper', - showarrow = FALSE - ) - ), - yaxis = list( - title = NA - ) - ) + p - p - } - ), - class = c("subchart") + }, + class = c( + "subchart", + "plotly", + "htmlwidget" + ) ) } diff --git a/R/chart_quote.R b/R/chart_quote.R index 241e3cb2..9a502d9b 100644 --- a/R/chart_quote.R +++ b/R/chart_quote.R @@ -1,158 +1,273 @@ -#' Candlestick chart +#' @title +#' Candlestick Chart #' #' @description -#' #' `r lifecycle::badge("experimental")` #' -#' Candlestick charts are highly visual and provide a quick and intuitive way to assess market sentiment and price action. -#' Traders and analysts use them in conjunction with other technical analysis tools to make informed trading decisions. -#' These charts are particularly useful for identifying key support and resistance levels, trend changes, and potential entry and exit points in financial markets. -#' -#' @param internal An empty [list]. Used for internal purposes. Ignore. +#' A high-level [plotly::plot_ly()]-function for charting +#' Open, High, Low and Close prices. #' -#' @family price charts +#' @param ... For internal use. Please ignore. #' -#' @example man/examples/scr_charting.R +#' @example man/examples/scr_klinechart.R #' #' @returns +#' An [invisible] [plotly::plot_ly()]-object. #' -#' A [plotly::plot_ly()]-object wrapped in [rlang::expr()]. -#' +#' @family price charts #' @author Serkan Korkmaz -#' #' @export kline <- function( - internal = list()) { - structure( - rlang::expr( - { - # 0) locate global - # parameters to be passed - # into the charting functions; + ...) { - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - ticker <- internal_args$ticker - interval <- internal_args$interval - deficiency <- internal_args$deficiency + structure( + .Data = { + # 0) construct arguments + # via chart function + args <- list(...) + data <- indicator(args$data) + # # 1) bottom trace + bot <- 3 + p <- plotly::plot_ly( + data = data, + x = ~index, + type = 'candlestick', + hoverinfo = "none", + open = ~open, + close = ~close, + high = ~high, + low = ~low, + increasing = list( + # Border color and width + line = list(color = "black", width = bot), + fillcolor = "black" + ), + decreasing = list( + # Border color and width + line = list(color = "black", width = bot), + fillcolor = "black" + ), + showlegend = FALSE, + legendgroup = "price", + name = "Border" + ) - candle_color <- movement_color( - deficiency = deficiency - ) - candle_color <- movement_color( - deficiency = deficiency - ) + p <- plotly::add_trace( + p, + inherit = FALSE, + x = ~index, + type = "candlestick", + open = ~open, + close = ~close, + high = ~high, + low = ~low, + increasing = list( + # Main candle color and narrower width + line = list(color = args$candle_color$bullish, width = bot - 1.75), + fillcolor = args$candle_color$bullish + ), + decreasing = list( + # Main candle color and narrower width + line = list(color = args$candle_color$bearish, width = bot - 1.75), + fillcolor = args$candle_color$bearish + ), + showlegend = TRUE, + legendgroup = "price", + name = args$interval + ) - plotly::layout( - p = plotly::plot_ly( - data = ticker, - showlegend = TRUE, - name = interval, - yaxis = 'y', - x = ~index, - type = 'candlestick', - open = ~open, - close = ~close, - high = ~high, - low = ~low, - increasing = list( - line = list( - color = candle_color$bullish - ), - fillcolor = candle_color$bullish - ), - decreasing = list( - line = list( - color =candle_color$bearish - ), - fillcolor = candle_color$bearish + + invisible( + { + plotly::layout( + p = p, + xaxis = list( + rangeslider = list( + visible = args$slider, + thickness = 0.05 + ) ) - ), - yaxis = list( - title = "Price" ) - ) - + } + ) - - } - ), - class = c("pricechart", "chartelement") + }, + class = c("pricechart", "plotly", "htmlwidget") ) } -#' OHLC chart +#' @title +#' OHLC Barchart #' #' @inherit kline +#' +#' @example man/examples/scr_ohlcchart.R +#' #' @family price charts +#' @author Serkan Korkmaz #' @export ohlc <- function( - internal = list()) { + ...) { - structure( - rlang::expr( - { - # 0) locate global - # parameters to be passed - # into the charting functions; + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) + structure( + .Data = { - ticker <- internal_args$ticker - interval <- internal_args$interval - deficiency <- internal_args$deficiency + # 0) construct arguments + # via chart function + args <- list(...) + data <- indicator(args$data) + # # 1) bottom trace + bot <- 5 + p <- plotly::plot_ly( + data = data, + x = ~ index, + type = 'ohlc', + open = ~ open, + hoverinfo = "none", + close = ~ close, + high = ~ high, + low = ~ low, + increasing = list( + # Border color and width + line = list(color = "black", width = bot), + fillcolor = "black" + ), + decreasing = list( + # Border color and width + line = list(color = "black", width = bot), + fillcolor = "black" + ), + showlegend = FALSE, + name = "Border", + legendgroup = "price" + ) + p <- plotly::add_trace( + p = p, + x = ~ index, + inherit = FALSE, + type = "ohlc", + open = ~ open, + close = ~ close, + high = ~ high, + low = ~ low, + increasing = list( + # Main candle color and narrower width + line = list(color = args$candle_color$bullish, width = bot - 3), + fillcolor = args$candle_color$bullish + ), + decreasing = list( + # Main candle color and narrower width + line = list(color = args$candle_color$bearish, width = bot - 3), + fillcolor = args$candle_color$bearish + ), + showlegend = TRUE, + name = args$interval, + legendgroup = "price" + ) - candle_color <- movement_color( - deficiency = deficiency + plotly::layout( + p = p, + xaxis = list( + rangeslider = list( + visible = args$slider, + thickness = 0.05 + ) ) + ) + }, - plotly::layout( - p = plotly::plot_ly( - data = ticker, - showlegend = TRUE, - name = interval, - yaxis = 'y', - x = ~index, - type = 'ohlc', - open = ~open, - close = ~close, - high = ~high, - low = ~low, - increasing = list( - line = list( - color = candle_color$bullish - ) - ), - decreasing = list( - line = list( - color =candle_color$bearish - ) - ) - ), - yaxis = list(title = "Price") - ) + class = c("pricechart", "plotly", "htmlwidget") + ) +} +#' @title +#' Line Chart +#' +#' @inherit kline +#' +#' @param price A [character]-vector of [length] 1. "close" by default. +#' +#' @example man/examples/scr_plinechart.R +#' +#' @family price charts +#' @author Serkan Korkmaz +#' @export +pline <- function( + price = "close", + ...) { + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() + structure( + .Data = { - } + # 0) arguments passed + # via the chart function + args <- list(...) - ), - class = c("pricechart", "chartelement") - ) + data <- indicator(args$data, columns = price) + p <- plotly::plot_ly( + data = data, + x = ~index, + y = stats::as.formula( + paste("~", price) + ), + type = "scatter", + mode = "lines", + showlegend = TRUE, + legendgroup = "price", + name = paste0( + to_title(price), + " (", args$interval, ")" + ), + line = list( + width = 1.2, + color = "#d38b68"# was: "#d3ba68" + ) + ) + + invisible({ + plotly::layout( + p = p, + xaxis = list( + rangeslider = list( + visible = args$slider, + thickness = 0.05 + ) + ) + ) + }) + + }, + class = c("pricechart", "plotly", "htmlwidget") + ) } diff --git a/R/chart_rsi.R b/R/chart_rsi.R index 3b17409e..9ee19906 100644 --- a/R/chart_rsi.R +++ b/R/chart_rsi.R @@ -5,164 +5,180 @@ # objective: Create expressions to be evaluted in # the charting function # script start; -#' Add RSI indicators to your -#' chart +#' @title +#' Chart the Relative Strength Index (RSI) #' #' @description -#' #' `r lifecycle::badge("experimental")` #' -#' The RSI can be customized with different look-back periods to suit various trading strategies and timeframes. -#' It is a valuable tool for assessing the momentum and relative strength of an asset, helping traders make more informed decisions in financial markets. +#' A high-level [plotly::plot_ly()]- and [plotly::add_lines()]-function that +#' interacts with the [TTR::RSI()]-function. +#' The function adds a subchart with a [TTR::RSI()]-indicator. +#' +#' @usage rsi( +#' price = "close", +#' n = 14, +#' maType = "SMA", +#' upper_limit = 80, +#' lower_limit = 20, +#' color = '#4682b4', +#' ... +#' ) #' #' @inheritParams TTR::RSI -#' @param upper_limit A [numeric]-vector of [length] 1. 80 by default. Sets the upper limit of the [TTR::RSI]. -#' @param lower_limit A [numeric]-vector of [length] 1. 20 by default. Sets the lower limit of the [TTR::RSI]. -#' @param internal An empty [list]. Used for internal purposes. Ignore. +#' @param upper_limit A [numeric]-vector of [length] 1. 80 by default. +#' Sets the upper limit of the [TTR::RSI]. +#' @param lower_limit A [numeric]-vector of [length] 1. 20 by default. +#' Sets the lower limit of the [TTR::RSI]. +#' @param color A [character]-vector of [length] 1. "#4682b4" by default. +#' @param ... For internal use. Please ignore. #' -#' @returns Invisbly returns a plotly object. +#' @inherit kline #' #' @example man/examples/scr_charting.R #' -#' #' @family chart indicators -#' @family subcharts -#' +#' @family subchart indicators +#' @family momentum indicators +#' @author Serkan Korkmaz #' @export rsi <- function( - n = 14, - maType = "SMA", + price = "close", + n = 14, + maType = "SMA", upper_limit = 80, lower_limit = 20, - internal = list(), + color = '#4682b4', ...){ - structure( - rlang::expr( - { - # 0) locate global - # parameters to be passed - # into the charting functions; - - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten( - lapply( - X = !!rlang::enexpr(internal), - FUN = rlang::eval_tidy - ) - ) - - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - candle_color <- movement_color( - deficiency = deficiency + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) calculate RSI + # indicator + data <- stats::na.omit( + indicator( + x = args$data, + columns = price, + .f = TTR::RSI, + n = 14, + maType = "SMA" ) + ) - # 0.3) band color - color <- '#F100F1' + # 1.1) chart arguments + linewidth <- 0.90 - # 0.4) linewidth - linewidth <- 0.90 - - indicator <- toDF( - TTR::RSI( - price = toQuote(ticker)[,grep(pattern = 'close', x = colnames(ticker))], - n = !!n, - maType = !!maType, - ... = !!rlang::enquos(...) - ) - ) - layers <- list( - list( - type = "add_lines", - params = list( - showlegend = FALSE, - name = "Upper Bound", - y = ~!!upper_limit, - line = list( - color = color, - dash = 'dot', - width = linewidth - ) - ) + layers <- list( + list( + type = "add_lines", + params = list( - ), - list( - type = "add_lines", - params = list( - showlegend = FALSE, - name = "Lower Bound", - y = ~!!lower_limit, - line = list( - color = color, - dash = 'dot', - width = linewidth - ) + showlegend = FALSE, + name = "Upper Bound", + y = ~upper_limit, + line = list( + color = color, + dash = 'dot', + width = linewidth ) + ) - ), - list( - type = "add_ribbons", - params = list( - data = ticker, - showlegend = FALSE, - ymin = ~!!lower_limit, - ymax = ~!!upper_limit, - fillcolor = "rgba(241,0,241,0.1)", - line = list( - color = 'rgba(0,0,0,0)' - ) # Transparent line + ), + list( + type = "add_lines", + params = list( + showlegend = FALSE, + name = "Lower Bound", + y = ~lower_limit, + line = list( + color = color, + dash = 'dot', + width = linewidth ) + ) + ), + list( + type = "add_ribbons", + params = list( + data = data, + showlegend = FALSE, + ymin = ~lower_limit, + ymax = ~upper_limit, + fillcolor = as_rgb(alpha = 0.1, hex_color = color), + line = list( + color = 'transparent' + ) # Transparent line ) + + ) + ) + + # Initialize the plot with RSI line + p <- plot_ly( + name = 'RSI', + data = data, + mode = "lines", + showlegend = FALSE, + type = "scatter", + x = ~index, + y = ~rsi, + line = list( + color = color, + width = linewidth ) + ) - # Initialize the plot with RSI line - p <- plot_ly( - name = 'RSI', - data = indicator, - mode = "lines", - showlegend = FALSE, - type = "scatter", - x = ~index, - y = ~rsi, - line = list( - color = color, - width = linewidth + p <- build( + plot = p, + layers = layers, + annotations = list( + list( + text = paste0("RSI(", n, ")"), + font = list( + size = 16 + ), + x = 0, + y = 1, + xref = 'paper', + yref = 'paper', + showarrow = FALSE ) + ), + yaxis = list( + title = NA, + range = c(0, 100) ) - p <- build( - plot = p, - layers = layers, - annotations = list( - list( - text = paste0("RSI(", !!n, ")"), - x = 0.01, - y = 1, - xref = 'paper', - yref = 'paper', - showarrow = FALSE - ) - ), - yaxis = list( - title = NA, - range = c(0, 100) - ) + ) - ) + # Display the plot + p - # Display the plot - p - } - ), - class = "subchart" + }, + class = c( + "subchart", + "plotly", + "htmlwidget" + ) ) } diff --git a/R/chart_smi.R b/R/chart_smi.R new file mode 100644 index 00000000..fc0d6e7a --- /dev/null +++ b/R/chart_smi.R @@ -0,0 +1,203 @@ +# script: chart_smi +# author: Serkan Korkmaz, serkor1@duck.com +# date: 2024-05-29 +# objective: The Stochastic Momentum Index - subchart +# script start; +#' @title +#' Chart the Stochastic Momentum Index (SMI) +#' +#' @description +#' `r lifecycle::badge("experimental")` +#' +#' A high-level [plotly::plot_ly()]- and [plotly::add_lines()]-function that +#' interacts with the [TTR::SMI()]-function. +#' The function adds a subchart with a [TTR::SMI()]-indicator. +#' +#' @usage smi( +#' nFastK = 14, +#' nFastD = 3, +#' nSlowD = 3, +#' maType, +#' bounded = TRUE, +#' smooth = 1, +#' upper_limit = 40, +#' lower_limit = -40, +#' color = "#4682b4", +#' ... +#' ) +#' +#' @inheritParams TTR::SMI +#' @param upper_limit A [numeric]-vector of [length] 1. 40 by default. +#' Sets the upper limit of the [TTR::SMI]. +#' @param lower_limit A [numeric]-vector of [length] 1. -40 by default. +#' Sets the lower limit of the [TTR::SMI]. +#' @param color A [character]-vector of [length] 1. "#4682b4" by default. +#' @param ... For internal use. Please ignore. +#' +#' @inherit kline +#' +#' @example man/examples/scr_charting.R +#' +#' @family chart indicators +#' @family subchart indicators +#' @family momentum indicators +#' @author Serkan Korkmaz +#' @export +smi <- function( + nFastK = 14, + nFastD = 3, + nSlowD = 3, + maType, + bounded = TRUE, + smooth = 1, + upper_limit = 40, + lower_limit = -40, + color = "#4682b4", + ...) { + + # check if function is called + # outside of chart-function + check_indicator_call() + + # 1) initialize structure + # indicator + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 1) calculate indicator + # using indicator-function + data <- indicator( + x = args$data, + columns = c("high", "low", "close"), + .f = TTR::SMI, + nFastK = nFastK, + nFastD = nFastD, + nSlowD = nSlowD, + maType = maType, + bounded = TRUE, + smooth = smooth + ) + + p <- plotly::plot_ly( + data = data, + showlegend = FALSE, + name = "Signal", + x = ~index, + y = ~signal, + type = "scatter", + mode = "lines", + line = list( + width = 0.9, + dash = "dot" + + ) + ) + + layers <- list( + list( + type = "add_lines", + params = list( + name = "Index", + data = data, + showlegend = FALSE, + x = ~index, + y = ~smi, + inherit = FALSE, + line = list( + width = 0.9 + ) + ) + ), + list( + type = "add_lines", + params = list( + name = "Index", + data = data, + showlegend = FALSE, + x = ~index, + y = ~lower_limit, + inherit = FALSE, + line = list( + width = 0.9, + color = as_rgb(hex_color = color, alpha = 1), + dash = "dot" + ) + ) + ), + list( + type = "add_lines", + params = list( + name = "Index", + data = data, + showlegend = FALSE, + x = ~index, + y = ~upper_limit, + inherit = FALSE, + line = list( + width = 0.9, + color = as_rgb(hex_color = color, alpha = 1), + dash = "dot" + ) + ) + ), + list( + type = "add_ribbons", + params = list( + data = data, + inherit = FALSE, + showlegend = FALSE, + x = ~index, + ymin = ~lower_limit, + ymax = ~upper_limit, + fillcolor = as_rgb(alpha = 0.1, hex_color = color), + line = list( + color = 'transparent', + dash = "dot" + ) + ) + + ) + ) + + p <- build( + plot = p, + layers = layers, + annotations = list( + list( + text = paste0( + "SMI(",paste(c(nFastK, nFastD, nSlowD), collapse = ', '), ")" + ), + x = 0, + y = 1, + font = list( + size = 16 + ), + xref = 'paper', + yref = 'paper', + showarrow = FALSE + ) + ), + yaxis = list( + title = NA + ) + ) + + p + + }, + class = c( + "subchart", + "plotly", + "htmlwidget" + ) + ) + +} + +# script end; diff --git a/R/chart_volume.R b/R/chart_volume.R index fcea071a..6f756394 100644 --- a/R/chart_volume.R +++ b/R/chart_volume.R @@ -4,79 +4,90 @@ # objective: # script start; -#' Add volume indicators -#' to the chart +#' @title +#' Chart the trading volume #' #' @description -#' #' `r lifecycle::badge("experimental")` #' -#' Volume indicators are technical analysis tools used to analyze trading volume, which represents the number of shares or contracts traded in a financial market over a specific period of time. -#' These indicators provide valuable insights into the strength and significance of price movements. -#' -#' @param internal An empty [list]. Used for internal purposes. Ignore. +#' A high-level [plotly::plot_ly()]-function. +#' The function adds a subchart with the trading `trading`. #' -#' @returns Invisbly returns a plotly object. +#' @inherit kline #' #' @example man/examples/scr_charting.R #' #' @family chart indicators -#' @family subcharts -#' +#' @family subchart indicators +#' @author Serkan Korkmaz #' @export -volume <- function(internal = list()){ - - structure( - rlang::expr( - { - # 0) locate global - # parameters to be passed - # into the charting functions; - - # internal_args <- flatten(lapply(!!rlang::enquos(internal), rlang::eval_tidy)) - internal_args <- flatten(lapply(!!rlang::enexpr(internal), rlang::eval_tidy)) +volume <- function( + ...){ - ticker <- internal_args$ticker - deficiency <- internal_args$deficiency + # check if the indicator is called + # from the chart-function + # + # stops the function if not + check_indicator_call() - - candle_color <- movement_color( - deficiency = deficiency + structure( + .Data = { + + # 0) construct arguments + # via chart function + args <- list( + ... + ) + + # 0.4) linewidth + linewidth <- 0.90 + + data <- indicator( + x = args$data + ) + + plot <- plotly::layout( + plotly::plot_ly( + data = data, + name = "Volume", + x = ~index, + y = ~volume, + showlegend = FALSE, + color = ~ as.factor(candle), + type = "bar", + colors = c( + args$candle_color$bearish, + args$candle_color$bullish + ), + marker = list( + line = list( + color = "black", + width = 0.5) ) + ), + annotations = list( + text = "Volume", + font = list( + size = 16 + ), + showarrow = FALSE, + x = 0, + y = 1, + xref = "paper", + yref = "paper" + ) + ) + + }, + class = c( + "subchart", + "plotly", + "htmlwidget" + ) - # 0.4) linewidth - linewidth <- 0.90 - - plot <- plotly::plot_ly( - data = ticker, - name = "Volume", - x = ~index, - y = ~volume, - showlegend = FALSE, - color = ~direction, - type = "bar", - colors = c( - candle_color$bearish, - candle_color$bullish - - ), - marker = list( - line = list( - color = "black", - width = 0.5) - ) - ) - } - ), - class = "subchart" ) - - - - - } # script end; diff --git a/R/cryptoQuotes-package.R b/R/cryptoQuotes-package.R index 89666b89..1789c10d 100644 --- a/R/cryptoQuotes-package.R +++ b/R/cryptoQuotes-package.R @@ -8,8 +8,6 @@ #' @importFrom plotly layout #' @importFrom plotly plot_ly #' @importFrom plotly subplot -#' @importFrom rlang abort -#' @importFrom rlang trace_back #' @importFrom TTR BBands #' @importFrom xts as.xts #' @importFrom zoo as.zoo diff --git a/R/getFNG.R b/R/getFNG.R deleted file mode 100644 index e1a989de..00000000 --- a/R/getFNG.R +++ /dev/null @@ -1,144 +0,0 @@ -# script: getFNG -# date: 2023-12-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: write a function -# that extract and aggregates the fear and greed -# index from alternative.met -# script start; - -#' Get the daily Fear and Greed Index -#' for the cryptocurrency market -#' -#' @description -#' -#' `r lifecycle::badge("deprecated")` -#' -#' The fear and greed index is a market sentiment indicator that measures investor emotions to -#' gauge whether they are generally fearful (indicating potential selling pressure) or greedy (indicating potential buying enthusiasm) -#' -#' @inherit get_fgindex -#' @family deprecated -#' -#' @export -getFGIndex <- function( - from = NULL, - to = NULL) { - - # NOTE: This function - # is a standalone function that only - # depends on few internal functions. - # - # Its otherwise selfcontained. - lifecycle::deprecate_soft( - when = '1.3.0', - what = "getFGIndex()", - with = "get_fgindex()" - ) - - # 1) check internet - # connection - check_internet_connection() - - assert( - "Valid {.arg from} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(from) || (is.date(from) & length(from) == 1)), - - "Valid {.arg to} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(to) || (is.date(to) & length(to) == 1)) - ) - - - from <- coerce_date(from); to <- coerce_date(to) - - # 3) if no from and to - # are passed; construct - # forced date intervals - if (is.null(from) || is.null(to)) { - - # to ensure consistency across - # APIs if no date is set the output - # is limited to 200 pips - forced_dates <- default_dates( - interval = '1d', - from = from, - to = to - ) - - # generate from - # to variables - from <- forced_dates$from - to <- forced_dates$to - - } - - # 4) perform request and - # store; - query <- list( - format = 'json', - limit = '0' - ) - - - response <- GET( - url = "https://api.alternative.me", - endpoint = "fng", - query = query, - path = "/" - )$data - - - assert( - !is.null(response), - error_message = sprintf( - fmt = "Unexpected error. Try again or submit a %s", - cli::style_hyperlink( - text = cli::col_br_red("bug report"), - url = "https://github.com/serkor1/cryptoQuotes" - ) - ) - ) - - # 6) dates are returned in UNIX - # and doesnt need any numerical - # operations. - response$timestamp <- convert_date( - x = as.numeric(response$timestamp), - multiplier = 1 - ) - - - # 7) order response timestamp and - # convert to xts - response <- response[ - order(response$timestamp, decreasing = FALSE), - ] - - response <- xts::as.xts( - zoo::as.zoo( - as.numeric(response$value) - ), - order.by = response$timestamp - ) - - # 8) set colnames - # to FGI - colnames(response) <- 'FGI' - - # 9) subset according - # to from and to - response <- stats::window( - x = response, - start = from, - end = to - ) - - response -} - -# script end; diff --git a/R/getLSRatio.R b/R/getLSRatio.R deleted file mode 100644 index e29b374e..00000000 --- a/R/getLSRatio.R +++ /dev/null @@ -1,181 +0,0 @@ -# script: Long-Short Ratioes -# date: 2024/01/05 -# Author: Jonas Cuzulan Hirani -# objective: Extract the Long-Short Ratios -# from the exchanges - -#' Get the long to short ratio of a cryptocurrency pair -#' -#' @description -#' -#' `r lifecycle::badge("deprecated")` -#' -#' Get the long-short ratio for any [available_tickers()] from the [available_exchanges()] -#' -#' @inherit get_lsratio -#' @family deprecated -#' -#' @export -getLSRatio <- function( - ticker, - interval = '1d', - source = 'binance', - from = NULL, - to = NULL, - top = FALSE) { - - # 1) check internet - # connection and interval validity - lifecycle::deprecate_soft( - when = '1.3.0', - what = "getLSRatio()", - with = "get_lsratio()" - ) - # 1) check internet - # connection and interval validity - check_internet_connection() - - # 1) check all arguments - # what are missing, and are - # the classes correct? - {{ - - assert( - "Argument {.arg ticker} is missing with no default" = !missing(ticker) & is.character(ticker) & length(ticker) == 1, - "Argument {.arg source} has to be {.cls character} of length {1}" = (is.character(source) & length(source) == 1), - "Argument {.arg interval} has to be {.cls character} of length {1}" = (is.character(interval) & length(interval) == 1), - "Valid {.arg from} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(from) || (is.date(from) & length(from) == 1)), - "Valid {.arg to} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(to) || (is.date(to) & length(to) == 1)) - ) - - }} - - # recode the exchange - # source to avoid errors - # based on capitalization - # and whitespace - source <- tolower( - trimws(source) - ) - ticker <- toupper( - trimws(ticker) - ) - - # 1) check wether - # the chosen exchange - # is supported by the library - assert( - source %in% suppressMessages( - available_exchanges( - type = 'lsratio' - ) - ), - error_message = c( - "x" = sprintf( - fmt = "Exchange {.val %s} is not supported.", - source - ), - "i" = paste( - "Run", - cli::code_highlight( - code = "cryptoQuotes::available_exchanges(type = 'lsratio')", - code_theme = "Chaos" - ), - "for supported exhanges" - ) - ) - ) - - # 2) construct dates - # with API constraints; - # - # If no dates are specified - # it will return the last - # 100 available pips - # closest to Sys.time() - from <- coerce_date(from); to <- coerce_date(to) - - # 3) if either of the - # date variables are NULL - # pass them into the default_dates - # function to extract 100 pips. - if (is.null(from) | is.null(to)) { - - # to ensure consistency across - # APIs if no date is set the output - # is limited to 200 pips - forced_dates <- default_dates( - interval = interval, - from = from, - to = to, - limit = NULL - ) - - # generate from - # to variables - from <- forced_dates$from - to <- forced_dates$to - - } - - # NOTE: binance only supports - # the last 30 days - if (source %in% 'binance') { - - from <- max( - from, - coerce_date( - Sys.Date() - 28 - ) - ) - - } - - response <- fetch( - ticker = ticker, - source = source, - futures= TRUE, - interval = interval, - type = 'lsratio', - to = to, - from = from, - top = top - ) - - # Bybit has no to or from - # parameter - so this have to be subsettet - # manually - if (source == "bybit") { - - response <- response[ - paste(c(from, to),collapse = "/") - ] - - } - - # # Calculate the long - # # short ratio as not - # # all APIs provides this by default - response$ls_ratio <- response$long / response$short - - if (source == 'kraken') { - - response$long <- response$long/100 - response$short <- response$short/100 - - } - - # return the - # response - response - -} - diff --git a/R/getQuote.R b/R/getQuote.R deleted file mode 100644 index 2804d924..00000000 --- a/R/getQuote.R +++ /dev/null @@ -1,187 +0,0 @@ -#' Get the Open, High, Low, Close and Volume data on a cryptocurrency pair -#' -#' @description -#' -#' `r lifecycle::badge("deprecated")` -#' -#' Get a quote on a cryptocurrency pair from the [available_exchanges()] in various [available_intervals()] for any actively traded [available_tickers()]. -#' -#' @usage -#' ## get OHLC-V -#' getQuote( -#' ticker, -#' source = 'binance', -#' futures = TRUE, -#' interval = '1d', -#' from = NULL, -#' to = NULL -#' ) -#' -#' @inherit get_quote -#' @family deprecated -#' -#' @export - -getQuote <- function( - ticker, - source = 'binance', - futures = TRUE, - interval = '1d', - from = NULL, - to = NULL) { - # This function returns - # the ticker with the desired intervals - # and such - lifecycle::deprecate_soft( - when = '1.3.0', - what = "getQuote()", - with = "get_quote()" - ) - # 0) check internet connection - # before anything - check_internet_connection() - - - - # 1) check all arguments - # what are missing, and are - # the classes correct? - {{ - - assert( - "Argument {.arg ticker} is missing with no default" = !missing(ticker) & is.character(ticker) & length(ticker) == 1, - "Argument {.arg source} has to be {.cls character} of length {1}" = (is.character(source) & length(source) == 1), - "Argument {.arg futures} has to be {.cls logical} of length {1}" = (is.logical(futures) & length(futures) == 1), - "Argument {.arg interval} has to be {.cls character} of length {1}" = (is.character(interval) & length(interval) == 1), - "Valid {.arg from} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(from) || (is.date(from) & length(from) == 1)), - - "Valid {.arg to} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(to) || (is.date(to) & length(to) == 1)) - - - - - ) - - }} - - # recode the exchange - # source to avoid errors - # based on capitalization - # and whitespace - source <- tolower( - trimws(source) - ) - ticker <- toupper( - trimws(ticker) - ) - - # 1) check wether - # the chosen exchange - # is supported by the library - assert( - source %in% suppressMessages( - available_exchanges() - ), - error_message = c( - "x" = sprintf( - fmt = "Exchange {.val %s} is not supported.", - source - ), - "i" = paste( - "Run", - cli::code_highlight( - code = "cryptoQuotes::available_exchanges(type = 'ohlc')", - code_theme = "Chaos" - ), - "for supported exhanges" - ) - ) - ) - - # 2) check wether the - # interval is supported by - # the exchange API - assert( - interval %in% suppressMessages( - available_intervals( - source = source, - futures = futures - ) - ), - error_message = c( - "x" = sprintf( - fmt = "Interval {.val %s} is not supported.", - interval - ), - "i" = paste( - "Run", - cli::code_highlight( - code = sprintf("cryptoQuotes::available_intervals(source = '%s', futures = '%s')", source, futures), - code_theme = "Chaos" - ), - "for supported intervals" - ) - ) - ) - - # 3) if either of the - # date variables are NULL - # pass them into the default_dates - # function to extract 100 pips. - - from <- coerce_date(from); to <- coerce_date(to) - if (is.null(from) | is.null(to)) { - - # to ensure consistency across - # APIs if no date is set the output - # is limited to 100 pips - forced_dates <- default_dates( - interval = interval, - from = from, - to = to - ) - - # generate from - # to variables - from <- forced_dates$from - to <- forced_dates$to - - - } - - - ohlc <- fetch( - ticker = ticker, - source = source, - futures= futures, - interval = interval, - type = "ohlc", - to = to, - from = from - )[paste(c(from, to), collapse = "/")] - - # # Kraken doesnt have a to - # # parameter on spot market - # if (source == "kraken" & !futures) { - # - # ohlc <- ohlc[paste(c(from, to), collapse = "/")] - # - # } - - attributes(ohlc)$source <- paste0( - to_title(source), if (futures) " (PERPETUALS)" else " (SPOT)" - ) - - ohlc - -} - -# script end; diff --git a/R/get_fgi.R b/R/get_fgi.R index 79b92975..e56dfeb2 100644 --- a/R/get_fgi.R +++ b/R/get_fgi.R @@ -6,29 +6,40 @@ # index from alternative.met # script start; +#' @title #' Get the daily Fear and Greed Index -#' for the cryptocurrency market +#' in the cryptocurrency market #' #' @description +#' `r lifecycle::badge("stable")` #' -#' `r lifecycle::badge("deprecated")` +#' Get the daily fear and greed index. #' -#' The fear and greed index is a market sentiment indicator that measures investor emotions to -#' gauge whether they are generally fearful (indicating potential selling pressure) or greedy (indicating potential buying enthusiasm) +#' @usage get_fgindex( +#' from = NULL, +#' to = NULL +#' ) #' #' @inheritParams get_quote #' -#' @example man/examples/scr_FGIndex.R -#' #' @inherit get_quote details #' -#' @family get-function -#' #' @returns An [xts]-object containing, #' -#' * fgi ([numeric]): The daily fear and greed index value +#' \item{index}{<[POSIXct]> the time-index} +#' \item{fgi}{<[numeric]> the daily fear and greed index value} +#' +#' **Sample output** +#' +#' ```{r output, echo = FALSE} +#' ## fear and greed index +#' tail( +#' cryptoQuotes:::control_data$fgindex +#' ) +#' ``` #' -#' @note +#' @details +#' ## Classification #' #' The Fear and Greed Index goes from 0-100, and can be classified as follows, #' @@ -40,8 +51,22 @@ #' \item 76-100, Extreme Greed #' } #' -#' @author Serkan Korkmaz +#' ## About the Fear and Greed Index +#' The fear and greed index is a market sentiment indicator that measures +#' investor emotions to gauge whether they are generally fearful +#' (indicating potential selling pressure) or +#' greedy (indicating potential buying enthusiasm). +#' +#' ## Source +#' This index is fetched from +#' \href{https://alternative.me/crypto/fear-and-greed-index/}{alternative.me}, +#' and can be different from the one provided by +#' \href{https://coinmarketcap.com/charts/#fear-and-greed-index}{coinmarketcap}. #' +#' @example man/examples/scr_FGIndex.R +#' +#' @family get-functions +#' @author Serkan Korkmaz #' @export get_fgindex <- function( from = NULL, @@ -58,17 +83,17 @@ get_fgindex <- function( check_internet_connection() assert( - "Valid {.arg from} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(from) || (is.date(from) & length(from) == 1)), - - "Valid {.arg to} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(to) || (is.date(to) & length(to) == 1)) + " + Valid {.arg from} input is on the form + {.val {paste(as.character(Sys.Date()))}} or + {.val {as.character(format(Sys.time()))}} + " = (is.null(from) || (is.date(from) & length(from) == 1)), + + " + Valid {.arg to} input is on the form + {.val {paste(as.character(Sys.Date()))}} or + {.val {as.character(format(Sys.time()))}} + " = (is.null(to) || (is.date(to) & length(to) == 1)) ) @@ -146,7 +171,7 @@ get_fgindex <- function( # 8) set colnames # to FGI - colnames(response) <- 'FGI' + colnames(response) <- 'fgi' # 9) subset according # to from and to diff --git a/R/get_fundingrate.R b/R/get_fundingrate.R index ad0869af..73d74bb5 100644 --- a/R/get_fundingrate.R +++ b/R/get_fundingrate.R @@ -5,17 +5,15 @@ # to get the funding rate from # exchanges that supports it # script start; - - +#' @title #' Get the funding rate on futures contracts #' #' @description -#' #' `r lifecycle::badge("stable")` #' -#' Get the funding rate on a cryptocurrency pair from the [available_exchanges()] in any actively traded [available_tickers()] on the FUTURES markets. -#' -#' @inheritParams get_quote +#' Get the funding rate on a cryptocurrency pair from +#' the [available_exchanges()] in any actively +#' traded [available_tickers()] on the futures markets. #' #' @usage get_fundingrate( #' ticker, @@ -24,19 +22,25 @@ #' to = NULL #' ) #' -#' @example man/examples/scr_getFundingrate.R -#' -#' @returns +#' @inheritParams get_quote #' -#' An [xts]-object containing, +#' @returns An [xts]-object containing, #' -#' * funding_rate ([numeric]): the current funding rate +#' \item{index}{<[POSIXct]> the time-index} +#' \item{funding_rate}{<[numeric]> the current funding rate} #' +#' **Sample output** +#' ```{r output, echo = FALSE} +#' ## funding rate +#' tail( +#' cryptoQuotes:::control_data$fundingrate +#' ) +#' ``` #' -#' @family get-function +#' @example man/examples/scr_getFundingrate.R #' +#' @family get-functions #' @author Serkan Korkmaz -#' #' @export get_fundingrate <- function( ticker, @@ -50,18 +54,25 @@ get_fundingrate <- function( # 1) assert argument # values assert( - "Argument {.arg ticker} is missing with no default" = !missing(ticker) & is.character(ticker) & length(ticker) == 1, - "Argument {.arg source} has to be {.cls character} of length {1}" = (is.character(source) & length(source) == 1), - "Valid {.arg from} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(from) || (is.date(from) & length(from) == 1)), - "Valid {.arg to} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(to) || (is.date(to) & length(to) == 1)) + " + Argument {.arg ticker} is missing with no default + " = !missing(ticker) & is.character(ticker) & length(ticker) == 1, + + " + Argument {.arg source} has to be {.cls character} of length {1} + " = (is.character(source) & length(source) == 1), + + " + Valid {.arg from} input is on the form + {.val {paste(as.character(Sys.Date()))}} or + {.val {as.character(format(Sys.time()))}} + " = (is.null(from) || (is.date(from) & length(from) == 1)), + + " + Valid {.arg to} input is on the form + {.val {paste(as.character(Sys.Date()))}} or + {.val {as.character(format(Sys.time()))}} + " = (is.null(to) || (is.date(to) & length(to) == 1)) ) # recode the exchange @@ -80,7 +91,7 @@ get_fundingrate <- function( assert( source %in% suppressMessages( available_exchanges(type = "fundingrate") - ), + ), error_message = c( "x" = sprintf( fmt = "Exchange {.val %s} is not supported.", diff --git a/R/get_lsratio.R b/R/get_lsratio.R index 740d1285..db950b72 100644 --- a/R/get_lsratio.R +++ b/R/get_lsratio.R @@ -4,17 +4,16 @@ # objective: Extract the Long-Short Ratios # from the exchange +#' @title #' Get the long to short ratio of a cryptocurrency pair #' #' @description -#' #' `r lifecycle::badge("stable")` #' -#' Get the long-short ratio for any [available_tickers()] from the [available_exchanges()] +#' Get the long-short ratio for any [available_tickers()] +#' from the [available_exchanges()] #' -#' @usage -#' ## long-short ratio -#' get_lsratio( +#' @usage get_lsratio( #' ticker, #' interval = '1d', #' source = 'binance', @@ -23,37 +22,32 @@ #' top = FALSE #' ) #' -#' @param ticker A [character] vector of [length] 1. See [available_tickers()] for available tickers. -#' @param interval A [character] vector of [length] 1. See [available_intervals()] for available intervals. -#' @param source A [character]-vector of [length] 1. See [available_exchanges()] for details. -#' @param from An optional vector of [length] 1. Can be [Sys.Date()]-class, [Sys.time()]-class or [as.character()] in %Y-%m-%d format. -#' @param to An optional vector of [length] 1. Can be [Sys.Date()]-class, [Sys.time()]-class or [as.character()] in %Y-%m-%d format. -#' @param top A [logical] vector. [FALSE] by default. If [TRUE] it returns the top traders Long-Short ratios. -#' -#' @inherit get_quote details +#' @inheritParams get_quote +#' @param top A [logical] vector. [FALSE] by default. +#' If [TRUE] it returns the top traders Long-Short ratios. #' -#' @note #' -#' ## Available exchanges -#' -#' See [available_exchanges()] with for available exchanges. +#' @returns An [xts]-object containing, #' -#' ## Limited return values +#' \item{index}{<[POSIXct]> the time-index} +#' \item{long}{<[numeric]> the share of longs} +#' \item{short}{<[numeric]> the share of shorts} +#' \item{ls_ratio}{<[numeric]> the ratio of longs to shorts} #' -#' Binance only supports data for the last 30 days. Use other exchanges if you need beyond that. +#' **Sample output** +#' ```{r output, echo = FALSE} +#' ## Long-Short Ratio +#' tail( +#' cryptoQuotes:::control_data$lsratio +#' ) +#' ``` #' -#' @author Jonas Cuzulan Hirani +#' @inherit get_quote details #' #' @example man/examples/scr_LSR.R #' -#' @family get-function -#' -#' @returns An [xts]-object containing, -#' -#' * long ([numeric]) - the share of longs -#' * short ([numeric]) - the share of shorts -#' * ls_ratio ([numeric]) - the ratio of longs to shorts -#' +#' @family get-functions +#' @author Jonas Cuzulan Hirani #' @export get_lsratio <- function( ticker, @@ -73,19 +67,23 @@ get_lsratio <- function( {{ assert( - "Argument {.arg ticker} is missing with no default" = !missing(ticker) & is.character(ticker) & length(ticker) == 1, - "Argument {.arg source} has to be {.cls character} of length {1}" = (is.character(source) & length(source) == 1), - "Argument {.arg interval} has to be {.cls character} of length {1}" = (is.character(interval) & length(interval) == 1), - "Valid {.arg from} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(from) || (is.date(from) & length(from) == 1)), - "Valid {.arg to} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(to) || (is.date(to) & length(to) == 1)) + " + Argument {.arg ticker} is missing with no default + " = !missing(ticker) & is.character(ticker) & length(ticker) == 1, + " + Argument {.arg source} has to be {.cls character} of length {1} + " = (is.character(source) & length(source) == 1), + " + Argument {.arg interval} has to be {.cls character} of length {1} + " = (is.character(interval) & length(interval) == 1), + "Valid {.arg from} input is on the form + {.val {paste(as.character(Sys.Date()))}} or + {.val {as.character(format(Sys.time()))} + }" = (is.null(from) || (is.date(from) & length(from) == 1)), + "Valid {.arg to} input is on the form + {.val {paste(as.character(Sys.Date()))}} or + {.val {as.character(format(Sys.time()))}} + " = (is.null(to) || (is.date(to) & length(to) == 1)) ) }} @@ -142,7 +140,9 @@ get_lsratio <- function( "i" = paste( "Run", cli::code_highlight( - code = "cryptoQuotes::available_intervals(type = 'interest', source = source)", + code = "cryptoQuotes::available_intervals( + type = 'lsratio', source = source + )", code_theme = "Chaos" ), "for supported intervals" @@ -159,7 +159,6 @@ get_lsratio <- function( # closest to Sys.time() from <- coerce_date(from); to <- coerce_date(to) - # 3) if either of the # date variables are NULL # pass them into the default_dates @@ -183,19 +182,25 @@ get_lsratio <- function( } + # NOTE: binance only supports # the last 30 days if (source %in% 'binance') { from <- max( from, - coerce_date( - Sys.Date() - 28 + as.POSIXct( + coerce_date( + Sys.Date() - 28 + ), + tz = Sys.timezone() ) + ) } + response <- fetch( ticker = ticker, source = source, diff --git a/R/get_openinterest.R b/R/get_openinterest.R index 905b52ac..94a75282 100644 --- a/R/get_openinterest.R +++ b/R/get_openinterest.R @@ -6,19 +6,17 @@ # markets # script start; +#' @title #' Get the open interest on perpetual futures contracts #' #' @description -#' #' `r lifecycle::badge("stable")` #' -#' Get the open interest on a cryptocurrency pair from the [available_exchanges()] in any actively traded [available_tickers()] on the FUTURES markets. -#' -#' @inheritParams get_quote +#' Get the open interest on a cryptocurrency pair from the +#' [available_exchanges()] in any actively traded [available_tickers()] +#' on the FUTURES markets. #' -#' @usage -#' ## open interest -#' get_openinterest( +#' @usage get_openinterest( #' ticker, #' interval = '1d', #' source = 'binance', @@ -26,24 +24,28 @@ #' to = NULL #' ) #' -#' @example man/examples/scr_getOpeninterest.R -#' -#' @inherit get_quote details +#' @inheritParams get_quote #' #' @returns -#' #' An [xts]-object containing, #' -#' * open_interest ([numeric]): total open perpetual contracts on both both sides. +#' \item{index}{<[POSIXct]> the time-index} +#' \item{open_interest}{<[numeric]> open perpetual contracts on both both sides} #' -#' @note +#' **Sample output** +#' ```{r output, echo = FALSE} +#' ## Open Interest +#' tail( +#' cryptoQuotes:::control_data$openinterest +#' ) +#' ``` #' -#' Not all exchanges supports this endpoint, check [available_exchanges()] for details. +#' @inherit get_quote details #' -#' @family get-function +#' @example man/examples/scr_getOpeninterest.R #' +#' @family get-functions #' @author Serkan Korkmaz -#' #' @export get_openinterest <- function( ticker, @@ -58,19 +60,27 @@ get_openinterest <- function( # 1) assert argument # inputs assert( - "Argument {.arg ticker} is missing with no default" = !missing(ticker) & is.character(ticker) & length(ticker) == 1, - "Argument {.arg source} has to be {.cls character} of length {1}" = (is.character(source) & length(source) == 1), - "Argument {.arg interval} has to be {.cls character} of length {1}" = (is.character(interval) & length(interval) == 1), - "Valid {.arg from} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(from) || (is.date(from) & length(from) == 1)), - "Valid {.arg to} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(to) || (is.date(to) & length(to) == 1)) + " + Argument {.arg ticker} is missing with no default + " = !missing(ticker) & is.character(ticker) & length(ticker) == 1, + " + Argument {.arg source} has to be {.cls character} of length {1} + " = (is.character(source) & length(source) == 1), + + " + Argument {.arg interval} has to be {.cls character} of length {1} + " = (is.character(interval) & length(interval) == 1), + + " + Valid {.arg from} input is on the form + {.val {paste(as.character(Sys.Date()))}} or + {.val {as.character(format(Sys.time()))}} + " = (is.null(from) || (is.date(from) & length(from) == 1)), + + "Valid {.arg to} input is on the form + {.val {paste(as.character(Sys.Date()))}} or + {.val {as.character(format(Sys.time()))}} + " = (is.null(to) || (is.date(to) & length(to) == 1)) ) # 2) assert validity @@ -113,7 +123,9 @@ get_openinterest <- function( "i" = paste( "Run", cli::code_highlight( - code = "cryptoQuotes::available_intervals(type = 'interest', source = source)", + code = " + cryptoQuotes::available_intervals(type = 'interest', source = source) + ", code_theme = "Chaos" ), "for supported intervals" @@ -123,19 +135,6 @@ get_openinterest <- function( from <- coerce_date(from); to <- coerce_date(to) - # NOTE: binance only supports - # the last 30 days - if (source %in% 'binance') { - - from <- max( - from, - coerce_date( - Sys.Date() - 28 - ) - ) - - } - # 3) if either of the # date variables are NULL # pass them into the default_dates @@ -156,11 +155,24 @@ get_openinterest <- function( # to variables from <- forced_dates$from to <- forced_dates$to - } + # NOTE: binance only supports + # the last 30 days + if (source %in% 'binance') { - fetch( + from <- max( + from, + as.POSIXct( + coerce_date( + Sys.Date() - 28 + ), + tz = Sys.timezone() + ) + ) + } + + output <- fetch( ticker = ticker, source = source, futures= TRUE, @@ -170,6 +182,15 @@ get_openinterest <- function( from = from ) + if (source %in% 'kraken') { + + output <- output$high + + names(output)[1] <- "open_interest" + + } + + output } diff --git a/R/get_quote.R b/R/get_quote.R index 40956cad..8af50a2a 100644 --- a/R/get_quote.R +++ b/R/get_quote.R @@ -1,21 +1,14 @@ +#' @title #' Get the Open, High, Low, Close and Volume data on a cryptocurrency pair #' #' @description -#' #' `r lifecycle::badge("stable")` #' -#' Get a quote on a cryptocurrency pair from the [available_exchanges()] in various [available_intervals()] for any actively traded [available_tickers()]. -#' -#' @param ticker An [character]-vector of [length] 1. See [available_tickers()] for available tickers. -#' @param source A [character]-vector of [length] 1. ```binance``` by default. See [available_exchanges()] for available exchanges. -#' @param interval A [character]-vector of [length] 1. ```1d``` by default. See [available_intervals()] for available intervals. -#' @param futures A [logical]-vector of [length] 1. [TRUE] by default. Returns futures market if [TRUE], spot market otherwise. -#' @param from An optional [character], [date] or [POSIXct] vector of [length] 1. [NULL] by default. -#' @param to An optional [character], [date] or [POSIXct] vector of [length] 1. [NULL] by default. +#' Get a quote on a cryptocurrency pair from the [available_exchanges()] in +#' various [available_intervals()] for any +#' actively traded [available_tickers()]. #' -#' @usage -#' ## get OHLC-V -#' get_quote( +#' @usage get_quote( #' ticker, #' source = 'binance', #' futures = TRUE, @@ -24,32 +17,52 @@ #' to = NULL #' ) #' -#' @family get-function -#' -#' @example man/examples/scr_getQuote.R +#' @param ticker A [character]-vector of [length] 1. +#' See [available_tickers()] for available tickers. +#' @param source A [character]-vector of [length] 1. \code{binance} by default. +#' See [available_exchanges()] for available exchanges. +#' @param interval A [character]-vector of [length] 1. ```1d``` by default. +#' See [available_intervals()] for available intervals. +#' @param futures A [logical]-vector of [length] 1. [TRUE] by default. +#' Returns futures market if [TRUE], spot market otherwise. +#' @param from An optional [character]-, [date]- or +#' [POSIXct]-vector of [length] 1. [NULL] by default. +#' @param to An optional [character]-, [date]- or +#' [POSIXct]-vector of [length] 1. [NULL] by default. #' #' @returns An [xts]-object containing, #' -#' * open ([numeric]): the opening price -#' * close ([numeric]): the closing price -#' * high ([numeric]): the highest price -#' * low ([numeric]): the lowest price -#' * volume ([numeric]): the trading volume +#' \item{index}{<[POSIXct]> The time-index} +#' \item{open}{<[numeric]> Opening price} +#' \item{high}{<[numeric]> Highest price} +#' \item{low}{<[numeric]> Lowest price} +#' \item{close}{<[numeric]> Closing price} +#' \item{volume}{<[numeric]> Trading volume} +#' +#' **Sample output** +#' ```{r output, echo = FALSE} +#' ## Get daily quote +#' tail( +#' cryptoQuotes:::control_data$quote +#' ) +#' ``` #' #' @details #' #' ## On time-zones and dates -#' -#' Values passed to ``from`` or ``to`` must be coercible by [as.Date()], or [as.POSIXct()], with a format of either ```"%Y-%m-%d"``` or ```"%Y-%m-%d %H:%M:%S"```. By default -#' all dates are passed and returned with [Sys.timezone()]. +#' Values passed to ``from`` or ``to`` must be coercible by [as.Date()], +#' or [as.POSIXct()], with a format of either ```"%Y-%m-%d"``` or +#' ```"%Y-%m-%d %H:%M:%S"```. By default all dates are passed and +#' returned with [Sys.timezone()]. #' #' ## On returns +#' If only ``from`` is provided 200 pips are returned up to ``Sys.time()``. +#' If only ``to`` is provided 200 pips up to the specified date is returned. #' -#' If only ``from`` is provided 200 pips are returned up to ``Sys.time()``. If only ``to`` is provided 200 pips up to the specified date -#' is returned. +#' @example man/examples/scr_getQuote.R #' +#' @family get-functions #' @author Serkan Korkmaz -#' #' @export get_quote <- function( ticker, @@ -66,28 +79,38 @@ get_quote <- function( # argumnents before anything check_internet_connection() - - # 1) check all arguments # what are missing, and are # the classes correct? {{ assert( - "Argument {.arg ticker} is missing with no default" = !missing(ticker) & is.character(ticker) & length(ticker) == 1, - "Argument {.arg source} has to be {.cls character} of length {1}" = (is.character(source) & length(source) == 1), - "Argument {.arg futures} has to be {.cls logical} of length {1}" = (is.logical(futures) & length(futures) == 1), - "Argument {.arg interval} has to be {.cls character} of length {1}" = (is.character(interval) & length(interval) == 1), - "Valid {.arg from} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(from) || (is.date(from) & length(from) == 1)), - "Valid {.arg to} input is on the form {.val {paste(as.character(Sys.Date()))}} or {.val {as.character( - format( - Sys.time() - ) - )}}" = (is.null(to) || (is.date(to) & length(to) == 1)) + " + Argument {.arg ticker} is missing with no default + " = !missing(ticker) & is.character(ticker) & length(ticker) == 1, + + " + Argument {.arg source} has to be {.cls character} of length {1} + " = (is.character(source) & length(source) == 1), + + " + Argument {.arg futures} has to be {.cls logical} of length {1} + " = (is.logical(futures) & length(futures) == 1), + + " + Argument {.arg interval} has to be {.cls character} of length {1} + " = (is.character(interval) & length(interval) == 1), + + " + Valid {.arg from} input is on the form + {.val {paste(as.character(Sys.Date()))}} or + {.val {as.character(format(Sys.time()))}} + " = (is.null(from) || (is.date(from) & length(from) == 1)), + + "Valid {.arg to} input is on the form + {.val {paste(as.character(Sys.Date()))}} or + {.val {as.character(format(Sys.time()))}} + " = (is.null(to) || (is.date(to) & length(to) == 1)) ) }} @@ -147,7 +170,15 @@ get_quote <- function( "i" = paste( "Run", cli::code_highlight( - code = sprintf("cryptoQuotes::available_intervals(source = '%s', futures = '%s')", source, futures), + code = sprintf( + "cryptoQuotes::available_intervals( + source = '%s', + type = 'ohlc, + futures = '%s' + )", + source, + futures + ), code_theme = "Chaos" ), "for supported intervals" @@ -196,13 +227,13 @@ get_quote <- function( from = from )[paste(c(from, to), collapse = "/")] - # # Kraken doesnt have a to - # # parameter on spot market - # if (source == "kraken" & !futures) { - # - # ohlc <- ohlc[paste(c(from, to), collapse = "/")] - # - # } + # Kraken doesnt have a to + # parameter on spot market + if (source == "kraken") { + + ohlc <- ohlc[paste(c(from, to), collapse = "/")] + + } attributes(ohlc)$source <- paste0( to_title(source), if (futures) " (PERPETUALS)" else " (SPOT)" diff --git a/R/helper.R b/R/helper.R index c7b1ddc2..caa2ff20 100644 --- a/R/helper.R +++ b/R/helper.R @@ -4,6 +4,104 @@ # objective: A class of helper # function # script start; +indicator <- function( + x, + columns = NULL, + .f = NULL, + ...) { + + x <- tryCatch( + expr = { + + xts::as.xts( + x + ) + + }, + error = function(error) { + + assert( + FALSE, + error_message = c( + "x" = "Could not coerce to {.cls xts}", + "i" = error$message + ) + ) + + } + ) + + x <- do.call( + cbind, + # Set names here + # and remove from pull + stats::setNames( + lapply( + X = if (is.null(columns)) names(x) else columns, + FUN = pull, + from = x + ), + nm = if (is.null(columns)) names(x) else columns + ) + ) + + # 1) get the indicator function + # for each + if (!is.null(.f)) { + + x <- .f( + x, + ... + ) + + } + + names(x) <- tolower(names(x)) + + zoo::fortify.zoo( + x, + names = c( + "index" + ) + ) + +} + +# var_ly <- function( + # variable) { +# +# # 0) extract variable +# # from the source +# variable <- grep( +# pattern = variable, +# x = names(get("data",envir = parent.frame())), +# ignore.case = TRUE, +# value = TRUE +# ) +# +# # 1) assert variable +# # existance +# assert( +# !identical( +# variable, +# character(0) +# ) & length(variable) == 1, +# error_message = c( +# "x" = "Error in {.val variable}" +# ) +# ) +# +# # 2) return as formula +# as.formula( +# paste( +# '~', variable +# ) +# ) +# +# } + + + build <- function( plot, @@ -18,15 +116,21 @@ build <- function( ) { # Generalize function calling based on the 'type' attribute - fun_name <- layer$type # The Plotly function to call, e.g., "add_lines", "add_ribbons" - layer$params$p <- plot # Ensure the plot is passed as the first argument + + # The Plotly function to call, e.g., "add_lines", "add_ribbons" + fun_name <- layer$type + + # Ensure the plot is passed as the first argument + layer$params$p <- plot if (!"data" %in% names(layer$params)) { - # If 'data' is not explicitly provided, assume the plot's original data should be used + # If 'data' is not explicitly provided, + # assume the plot's original data should be used layer$params$data <- plot$x$data } - # Dynamically call the Plotly function with the parameters specified in 'layer$params' + # Dynamically call the Plotly function with + # the parameters specified in 'layer$params' do.call( get( fun_name, @@ -60,37 +164,63 @@ to_title <- function( } -infer_interval <- function( + + +find_mode <- function( x) { + # 1) create a trable + # of values + frequency_table <- table( + x + ) + + # 2) find the mode + # and return as character + value <- as.character( + names(frequency_table)[which.max(frequency_table)] + ) + + value + +} + + +infer_interval <- function( + x) { # 0) extract # index index <- zoo::index( - x + utils::head( + x = x, + # n should be the minimum + # of available rows and 7. 7 + # was chosen randomly, but its important + # that its odd numbered so consensus can be + # reached. This application is 20x faster + # than using the entire dataset + # and reaches the same conclusion + n = min(nrow(x), 7) + ) ) # 1) calculate # differences - x <- unique( - as.numeric( - difftime( - time1 = index[-1], - time2 = index[-length(index)], - units = "secs" - ) + x <- as.numeric( + difftime( + time1 = index[-1], + time2 = index[-length(index)], + units = "secs" ) ) - assert( - length(x) == 1, - error_message = "error in time-index" - ) + x <- find_mode(x) switch( - as.character(x), + x, "1" = "1s", "60" = "1m", "180" = "3m", @@ -107,7 +237,11 @@ infer_interval <- function( "259200" = "3d", "604800" = "1w", "1209600" = "2w", - "1M" + "2678400" = "1M", + "2592000" = "1M", + "2419200" = "1M", + "2505600" = "1M", + NULL ) @@ -118,8 +252,9 @@ infer_interval <- function( #' Check if values are valid dates #' #' @description -#' This function check is equivalent to [is.numeric()], [is.logical()], and checks for the date type classes -#' POSIXct, POSIXt and Date. And wether the character vector can be formatted to dates. +#' This function check is equivalent to [is.numeric()], [is.logical()], +#' and checks for the date type classes POSIXct, POSIXt and Date. +#' And wether the character vector can be formatted to dates. #' #' @param x object to be tested #' @@ -129,7 +264,6 @@ infer_interval <- function( #' @returns [TRUE] if its either POSIXct, POSIXt or Date. [FALSE] otherwise. is.date <- function(x){ - # check if its # a date indicator <- inherits( @@ -145,7 +279,11 @@ is.date <- function(x){ expr = { # Either of these have to be # non-NA to work - !is.na(as.POSIXct(x)) | !is.na(as.POSIXct(x,format = "%Y-%m-%d %H:%M:%S")) + !is.na(as.POSIXct(x)) | !is.na( + as.POSIXct( + x, + format = "%Y-%m-%d %H:%M:%S") + ) }, error = function(error){ @@ -164,10 +302,10 @@ is.date <- function(x){ #' #' #' @description -#' This function is a wrapper of [stopifnot()], [tryCatch()] and [cli::cli_abort()] and asserts -#' the truthfulness of the passed expression(s). -#' @param ... expressions >= 1. If named the names are used as error messages, otherwise -#' R's internal error-messages are thrown +#' This function is a wrapper of [stopifnot()], [tryCatch()] and +#' [cli::cli_abort()] and asserts the truthfulness of the passed expression(s). +#' @param ... expressions >= 1. If named the names are used +#' as error messages, otherwise R's internal error-messages are thrown #' #' @param error_message character. An error message, supports [cli]-formatting. #' @example man/examples/scr_assert.R @@ -255,7 +393,9 @@ assert <- function(..., error_message = NULL) { # is forced to be the internal otherwise # the assert function will throw the same error-message # for any error. - message = if (is.null(error_message) || number_expressions != 1) error$message else error_message, + message = if (is.null(error_message) || number_expressions != 1) + error$message else + error_message, call = sys.call( 1 - length(sys.calls()) ) @@ -266,68 +406,48 @@ assert <- function(..., error_message = NULL) { } -toDF <- function(quote) { - # this function converts - # the quote to a data.frame - # for the plotting and reshaping - attr_list <- attributes(quote)$source - # 2) convert to - # data.frame - DF <- as.data.frame( - zoo::coredata(quote), - row.names = NULL - ) +pull <- function( + from, + what = "Open") { - colnames(DF) <- tolower( - colnames(DF) - ) - # 3) add the index; - DF$index <- zoo::index( - quote + # 0) identify column + # by name + column <- grep( + pattern = what, + x = colnames(from), + ignore.case = TRUE, + value = TRUE ) - # 1) determine - # wether the the day is closed - # green - if (all(c('open', 'close') %in% colnames(DF))) { - - DF$direction <- ifelse( - test = DF$close > DF$open, - yes = 'Increasing', - no = 'Decreasing' + assert( + !identical(character(0), column), + error_message = c( + "x" = sprintf( + fmt = "Could not find column {.val %s}", + what + ) ) - - } - - - attributes(DF)$source <- attr_list - - return( - DF ) -} - -toQuote <- function(DF) { - - quote <- xts::as.xts( - DF[,grep(pattern = 'open|high|low|close|volume|index',x = colnames(DF), ignore.case = TRUE)] - ) - - zoo::index(quote) <- as.POSIXct( - DF$index + stats::setNames( + do.call( + what = `$`, + args = list( + from, + column + ) + ), + nm = tolower(what) ) - attributes(quote)$source <- attributes(DF)$source - - quote } + # Plotly parameters; #### vline <- function( x = 0, @@ -429,33 +549,24 @@ coerce_date <- function(x){ #' @keywords internal flatten <- function(x) { - if (!inherits(x, "list")) return(list(x)) else return(unlist(c(lapply(x, flatten)), recursive = FALSE)) + if (!inherits(x, "list")) + return(list(x)) else + return(unlist(c(lapply(x, flatten)), recursive = FALSE)) } # base-chart colors; #### +movement_color <- function( + deficiency = FALSE) { -movement_color <- function(deficiency = FALSE){ + palette <- c("#d3ba68","#d5695d","#5d8ca8","#65a479") + location <- if (deficiency) c(3,1) else c(4,2) - palette <- paletteer::paletteer_d("ggthemes::wsj_rgby") - - - - if (deficiency) { - - list( - bullish = palette[3], - bearish = palette[1] - ) - - } else { - - list( - bullish = palette[4], - bearish = palette[2] - ) - } + list( + bullish = palette[location[1]], + bearish = palette[location[2]] + ) } @@ -513,7 +624,9 @@ convert_date <- function( assert( FALSE, error_message = sprintf( - fmt = "Unexpected error. Contact the package maintainer or submit a %s.", + fmt = " + Unexpected error. Contact the package maintainer or submit a %s. + ", cli::style_hyperlink( text = cli::col_br_red("bug report"), url = "https://github.com/serkor1/cryptoQuotes" @@ -551,7 +664,8 @@ convert_date <- function( #' compliance on the limits #' #' @inheritParams get_quote -#' @param length a [numeric]-value of [length] 1. The desired distance between `from` and `to`. +#' @param length a [numeric]-value of [length] 1. +#' The desired distance between `from` and `to`. #' #' #' @returns @@ -594,7 +708,7 @@ default_dates <-function( starting_point <- as.POSIXct( trunc(as.double(starting_point_time)/(15*60))*(15*60), - tz = 'UTC', + tz = Sys.timezone(), origin = origin_date ) @@ -665,7 +779,7 @@ default_dates <-function( max(interval_seq), as.POSIXct( current_time, - tz = "UTC", + tz = Sys.timezone(), origin = origin_date ) ) @@ -677,6 +791,358 @@ default_dates <-function( } -# script end; + +# pkg-startup; #### + +# This information contains +# links to the development blog, github source code +# and guides +pkg_information <- function(){ + + # 1) wrattep in format + # inline to ensure that the + # message be supressed at startup + cli::format_inline( + c( + paste( + cli::col_br_red(cli::symbol$heart), + cli::style_hyperlink( + text = cli::col_br_blue('release notes'), + url = 'https://serkor1.github.io/cryptoQuotes/news/index.html' + ), + "\n" + ), + # Source code link + paste( + cli::col_br_yellow(cli::symbol$star), + "Browse the", + cli::style_hyperlink( + text = cli::col_br_blue("source code"), + url = "https://github.com/serkor1/cryptoQuotes/" + ), + "\n" + ), + + # link to pkgdown website + paste( + cli::col_br_yellow(cli::symbol$star), + "Read the", + cli::style_hyperlink( + text = cli::col_br_blue("documentation"), + url = 'https://serkor1.github.io/cryptoQuotes/' + ), + "\n" + ), + + paste( + cli::col_br_yellow(cli::symbol$star), + "Join the", + cli::style_hyperlink( + text = cli::col_br_blue("discussion"), + url = 'https://github.com/serkor1/cryptoQuotes/discussions' + ) + ) + ) + ) + +} + + +# This is the cryptoQuotes +# header that prints the line +# with pkgname and version +pkg_header <- function( + pkgname) { + + + cli::cli( + cli::cli_h1( + text = paste( + pkgname, + utils::packageVersion( + pkgname + ) + ) + ) + + ) + +} + + + +#' Create a list of layout elements on subcharts +#' +#' @param x [integer]-vector of [length] 1. +#' @param layout_element [character]-vector of [length] 1. +#' [plotly::layout] elements. See example. +#' @param layout_attribute [character]-vector of [length] 1. +#' [plotly::layout] element value. See example. +#' +#' @examples +#' \dontrun{ +#' chart_layout( +#' x = 1:plot_list_length, +#' layout_element = "yaxis", +#' layout_attribute = list( +#' gridcolor = if (dark) "#40454c" else '#D3D3D3' # Was CCCCCC +#' ) +#' ) +#' } +#' +#' +#' @return A [list] of layout elements. +#' @keywords internal +#' @family development tools +chart_layout <- function( + x, + layout_element, + layout_attribute) { + + stats::setNames( + lapply( + 0:x, + function(i){ + + layout_attribute + + } + + + ), + nm = paste0(layout_element, c("", 1:x)) + ) + +} + + +chart_theme <- function( + dark) { + + if (dark) { + list( + paper_bgcolor = '#2b3139', + plot_bgcolor = '#2b3139', + font_color = '#848e9c', + grid_color = '#40454c' + ) + } else { + list( + paper_bgcolor = '#E3E3E3', + plot_bgcolor = '#E3E3E3', + font_color = '#A3A3A3', + grid_color = '#D3D3D3' + ) + } +} + + +bar <- function( + dark, + plot, + name, + market, + date_range, + ...) { + + # 0) chart theme + theme <- chart_theme(dark = dark) + + title_text <- ifelse( + !is.null(market), + yes = sprintf( + "Ticker: %s Market: %s
Period: %s", + name, + market, + date_range + ), + no = sprintf( + "Ticker: %s
Period: %s", + name, + date_range + ) + ) + + plot <- plotly::layout( + p = plot, + margin = list(l = 5, r = 5, b = 5, t = 65), + paper_bgcolor = theme$paper_bgcolor, + plot_bgcolor = theme$plot_bgcolor, + font = list( + size = 14, + color = theme$font_color + ), + legend = list( + orientation = 'h', + x = 0, + y = 100, + yref="container", + title = list( + text = "Indicators:", + font = list( + size = 16 + ) + ) + ), + title = list( + text = title_text, + font = list( + size = 20 + ), + x = 1, + xref = "paper", + xanchor = "right" + ) + + ) + + + do.call( + what = plotly::layout, + args = c( + list(plot), + chart_layout( + x = length(plot), + layout_element = "yaxis", + layout_attribute = list( + gridcolor = theme$grid_color # Was CCCCCC + ) + ), + chart_layout( + x = length(plot), + layout_element = "xaxis", + layout_attribute = list( + gridcolor = theme$grid_color# was C3 + ) + ) + ) + ) + +} + + +as_rgb <- function( + hex_color, + alpha = NULL) { + + # Remove the '#' if present and convert to RGB values + rgb_values <- grDevices::col2rgb(hex_color) + + # Format RGB values + rgb_string <- sprintf( + fmt = "rgb(%d, %d, %d)", + rgb_values[1, ], + rgb_values[2, ], + rgb_values[3, ] + ) + + # Check if alpha is provided + if (!is.null(alpha)) { + + assert( + alpha >= 0 & alpha <= 1, + error_message = c( + "x" = sprintf( + fmt = "{.arg alpha} has to be in ]0, 1[-range. Got {.val %s}.", + alpha + ) + ) + ) + + # Append alpha for rgba() format + rgb_string <- sprintf( + "rgba(%d, %d, %d, %.2f)", + rgb_values[1, ], + rgb_values[2, ], + rgb_values[3, ], + alpha + ) + } + + rgb_string +} + +normalize <- function( + x, + range, + value +) { + + # 0) get the minimum/maximum + # of the vector + min_x <- min(value, na.rm = TRUE) + max_x <- max(value, na.rm = TRUE) + + # 1) scale x within + # the range + scaled_x <- abs( + (x - min_x) / (max_x - min_x) + ) + + # factor + factor_x <- (max(range) - min(range)) + + # 3) create range + # and return + pmin( + pmax( + ceiling( + scaled_x * factor_x + ), + 1 + ), + 30 + ) + +} + + +check_indicator_call <- function( + system_calls = sys.calls(), + caller = match.call(envir = parent.frame()) + ) { + + # 0) get the entire call stack + # to determine the calling function + call_stack <- as.character( + lapply(system_calls, `[[`, 1) + ) + + # 1) get the calling calling + # function, ie. SMA, EMA etc + calling_function <- as.character( + sys.call(-1)[[1]] + ) + + # 2) check the location + # of chart + location_chart <- which(call_stack == "chart") + location_indicator <- which(call_stack == calling_function) + + + # 3) assert that the indicator + # is being called from the charting + # function, or some wrapper around + # chart + assert( + any(call_stack == "chart") & location_chart < location_indicator, + error_message = c( + "x" = sprintf( + "The {.fn %s}-function is called outside {.fn chart}", + call_stack + ), + + "i" = paste( + "Run", + cli::code_highlight( + code = "cryptoQuotes::chart(...)", + code_theme = "Chaos" + ), + "to build charts." + ) + ) + ) + +} # script end; diff --git a/R/pkg_startup.R b/R/pkg_startup.R deleted file mode 100644 index 4fbf0d2a..00000000 --- a/R/pkg_startup.R +++ /dev/null @@ -1,256 +0,0 @@ -# script: pkg_startup -# date: 2024-01-13 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Conflict resolution -# and verbose startup -# script start; - -# reordering of packages; -# -# This function reorders -# all strings so cryptoQuotes -# is listed first -reorder_cryptoQuotes <- function(strings) { - # Using order() with a logical vector to achieve the same result - strings[order(!grepl("cryptoQuotes", strings, ignore.case = TRUE))] -} - - -# request to submit -# bugreports not captured -# by the rlang or cli -request_bugreport <- function(){ - - cli::format_inline(message = paste( - #"\n \t", - cli::style_italic( - "\n\t\"All good people submits ", - cli::col_br_red("bug-reports"), - " on ", - cli::style_hyperlink( - text = cli::col_br_cyan("Github"), - url = "https://github.com/serkor1/cryptoQuotes/issues"), - " when they find non-{.val rlang} or non-{.val cli} formatted error-messages.\"", - cli::style_bold("\n\t- Confucious"), "\n" - ) - - ) - ) - -} - -# header; ##### -# -# This is the cryptoQuotes -# header that prints the line -# with pkgname and version -header <- function( - pkgname, - pkgversion) { - - cli::rule( - left = paste( - # Package Name - pkgname, - # package version - pkgversion - - ), - right = paste( - # Add a link to the release notes - cli::style_hyperlink( - text = 'release notes', - url = 'https://serkor1.github.io/cryptoQuotes/news/index.html' - ) - ), - line = 1, - line_col = cli::make_ansi_style( - "cyan" - ) - ) - -} - -# pkg information; ##### -# -# TODO: Consider wether this is too much -# information and verbosity -# -# -# This information contains -# links to the development blog, github source code -# and guides -pkg_information <- function(){ - - # 1) wrattep in format - # inline to ensure that the - # message be supressed at startup - cli::format_inline( - c( - # Source code link - paste( - cli::col_br_yellow(cli::symbol$star), - "Browse the", - cli::style_hyperlink( - text = cli::col_br_blue("source code"), - url = "https://github.com/serkor1/cryptoQuotes/" - ), - "\n" - ), - - # link to pkgdown website - paste( - cli::col_br_yellow(cli::symbol$star), - "Read the", - cli::style_hyperlink( - text = cli::col_br_blue("documentation"), - url = 'https://serkor1.github.io/cryptoQuotes/' - ), - "\n" - ), - - paste( - cli::col_br_yellow(cli::symbol$star), - "Join the", - cli::style_hyperlink( - text = cli::col_br_blue("discussion"), - url = 'https://github.com/serkor1/cryptoQuotes/discussions' - ) - ) - ) - ) -} - -# caution message; #### -# -# -# Caution about usages and limits -# -# 1) header; -caution_header <- function(){ - cli::rule( - left = cli::style_bold("Usage"), - line = 1, - line_col = cli::make_ansi_style( - "cyan" - ) - ) -} - -# 2) caution message; -caution_message <-function(){ - cli::format_inline( - c( - paste0( - cli::style_underline(cli::style_bold( - cli::col_red("Note:") - )), - " This API client uses public market data endpoints and is therefore completely ", - cli::col_green("free"), - " of charge.", - "\nLimit your calls within each ", - cli::col_br_cyan("exchange"), - " to ", - cli::col_br_cyan("5000"), - " over the course of 24 hours to avoid getting your IP ", - cli::style_underline(cli::col_red("blocked")),"!", - "\n" - ), - - paste( - "\nIf you expect to use", - cli::col_red('more'), "calls than this, please check the", - cli::col_blue("API documentation"), - "of the", cli::col_blue("exchange"), - "that you are interested in.", - "\n" - ) - ) - - ) -} - -# conflict handling and verbosity; #### -# -# -# It is expected that users who uses -# quantmod in conjunction with cryptoQuotes -# does this mainly for using cryptocurrencies -# with the quantmod functions - so all -# get* functions will get precendence over similarily named -# function across all libraries. -conflicting_pkg <- function() { - - # 1) check for conflicting - # packages - has_conflicts <- conflicted::conflict_scout() - - # 2) if there is conflicts; - if (!(!length(has_conflicts))) { - - # 2.1) prefer all get* function - # over all functions - conflicted::conflict_prefer_matching( - pattern = "^get", - winner = "cryptoQuotes", - quiet = TRUE - ) - - # 2.2) prefer all quantmod - # add* functions as, at the current state of - # cryptoQuotes, not all plotting functionality - # is up to par - conflicted::conflict_prefer_matching( - pattern = "^add", - winner = "quantmod", - losers = "cryptoQuotes", - quiet = TRUE - ) - - # 2.3) verbose conflict messaging - cli::cli_h1('Conflicts') - - # wrap in invisble to avoid - # NULL outputs; - invisible( - lapply( - X = names(has_conflicts), - FUN = function(name) { - - # concatenate the text - # in pkg::foo() form - text <- paste0( - cli::col_blue(has_conflicts[[name]]), "::", cli::col_br_green(name), "()" - ) - - # reorder such that - # cryptoQuotes is always firs; - text <- reorder_cryptoQuotes(strings = text) - - # alert the the user using - # cli danger - cli::cli_alert_danger( - paste(text, collapse = ', ') - ) - - - } - ) - ) - - - # 2.4) verbosing get* precendece - # over all other similar functions; - cli::cli_h1("Resolution") - cli::cli_alert_success( - text = cli::format_inline( - "All ", cli::col_blue('cryptoQuotes'), "::",cli::col_br_green("get*"),"()-functions are preferred over any other package." - ) - ) - } - -} - - - -# script end; diff --git a/R/sysdata.rda b/R/sysdata.rda new file mode 100644 index 0000000000000000000000000000000000000000..8353852c30c46144a07fb22cac3d142ebbca451a GIT binary patch literal 5271 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 literal 0 HcmV?d00001 diff --git a/R/utils.R b/R/utils.R index ef32628c..c948d611 100644 --- a/R/utils.R +++ b/R/utils.R @@ -204,8 +204,8 @@ endPoint <- function( #' @param ... additional parameters passed down the endpoint #' #' @details -#' This function can only be used to fetch time-based objects, and can therefore -#' not be used to get, for example, [available_tickers()]. +#' This function can only be used to fetch time-based objects, +#' and can therefore not be used to get, for example, [available_tickers()]. #' #' @family development tools #' @@ -280,7 +280,6 @@ fetch <- function( type = type, futures = futures, ... - ), query = parameters$query, path = parameters$path @@ -304,7 +303,6 @@ fetch <- function( what = c('array', 'matrix', 'data.frame') ) - # 2.2) extract data # from reponse: # @@ -312,13 +310,17 @@ fetch <- function( # then it is likely # that we are dealing with # an error, or Kraken - response <- tryCatch( - expr = { - response[[which(idx)]] + # + # This could be done using do.call + # maybe + switch (source, + kraken = { + response <- do.call( + data.frame, + response + ) }, - error = function(error){ - as.data.frame(response) - } + response <- response[[which(idx)]] ) diff --git a/R/zzz.R b/R/zzz.R index 8b713af1..badfd941 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -4,7 +4,6 @@ # objective: # script start; -# 1) on attach .onAttach <- function( libname, pkgname, @@ -17,36 +16,28 @@ xts_check_TZ = FALSE ) - # 1) package - # header - rlang::inform( - header( - pkgname = pkgname, - pkgversion = utils::packageVersion( - pkgname - ) + + cli::cli_inform( + message = pkg_header( + pkgname ), ..., class = "packageStartupMessage" ) - # 2) package information - # to the user - rlang::inform( - pkg_information(), + cli::cli_inform( + message = pkg_information(), ..., class = "packageStartupMessage" ) -} +} -# 1) on detach .onDetach <- function( libpath, ...) { - # 1) reset options # for xts suppressing # timezone messages @@ -55,4 +46,5 @@ ) } + # script end; diff --git a/README.Rmd b/README.Rmd index 09263f3e..dff5a4b6 100644 --- a/README.Rmd +++ b/README.Rmd @@ -2,36 +2,79 @@ output: github_document always_allow_html: true --- - - ```{r setup, include = FALSE} # set options +Sys.setenv(OPENSSL_CONF="/dev/null") + knitr::opts_chunk$set( collapse = FALSE, - comment = "#>", + comment = "#>", fig.path = "man/figures/README-", - message = FALSE, - warning = FALSE + message = FALSE, + warning = FALSE ) ``` -# cryptoQuotes: A streamlined access to OHLC-V market data and sentiment indicators in R cryptocurrency in R +# cryptoQuotes: Open access to cryptocurrency market data cryptocurrency in R -[![CRAN status](https://www.r-pkg.org/badges/version/cryptoQuotes)](https://www.cran-e.com/package/cryptoQuotes) -[![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/last-month/cryptoQuotes?color=blue)](https://www.cran-e.com/package/cryptoQuotes) +[![CRAN status](https://www.r-pkg.org/badges/version/cryptoQuotes)](https://CRAN.R-project.org/package=cryptoQuotes) +[![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/last-month/cryptoQuotes?color=blue)](https://r-pkg.org/pkg/cryptoQuotes) [![R-CMD-check](https://github.com/serkor1/cryptoQuotes/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/serkor1/cryptoQuotes/actions/workflows/R-CMD-check.yaml) -[![Codecov test coverage](https://codecov.io/gh/serkor1/cryptoQuotes/branch/main/graph/badge.svg)](https://app.codecov.io/gh/serkor1/cryptoQuotes?branch=main) -[![Lifecycle: experimental](https://img.shields.io/badge/lifecycle-experimental-orange.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) +[![codecov](https://codecov.io/gh/serkor1/cryptoQuotes/graph/badge.svg?token=D7NF1BPVL5)](https://app.codecov.io/gh/serkor1/cryptoQuotes) +[![Lifecycle: stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable) +![GitHub last commit (branch)](https://img.shields.io/github/last-commit/serkor1/cryptoQuotes/development) +## :information_source: About + +The `cryptoQuotes`-package is a high-level API client for accessing public market data endpoints on major cryptocurrency exchanges. It supports open, high, low, close and volume (OHLC-V) data and a variety of sentiment indicators; the market data is high quality and can be retrieved in intervals ranging from *seconds* to *months*. All the market data is accessed and processed without relying on crawlers, or API keys, ensuring an open, and reliable, access for researchers, traders and students alike. There are currently `r length(invisible(cryptoQuotes::available_exchanges(type = "ohlc")))` supported cryptocurrency exchanges, + +

+```{r, echo=FALSE} +## available exchanges +invisible( + all_exchanges <- cryptoQuotes::available_exchanges() +) + +# Convert the character vector to a single-row data frame +exchanges_df <- data.frame(t(all_exchanges)) + +# Set column names to be the exchange names +colnames(exchanges_df) <- all_exchanges + +# Create a horizontal table +kableExtra::kable_styling( + knitr::kable( + x = exchanges_df, + digits = 2, + col.names = NULL, + caption = 'Supported exchanges', + align = 'c', + table.attr = "style='width:100%;'", + format = 'html' + ), + full_width = TRUE, + position = 'center' +) +``` +
+ +All data is returned as [`xts`](https://github.com/joshuaulrich/xts)-objects which enables seamless interaction with with [`quantmod`](https://github.com/joshuaulrich/quantmod) and [`TTR`](https://github.com/joshuaulrich/TTR), for developing and evaluating trading strategies or general purpose cryptocurrency market analysis with a historical or temporal perspective. + ## :information_source: Overview -The `cryptoQuotes`-package is a high-level API-client to get current, and historical, cryptocurrency OHLC-V market and sentiment data in ```R```, without using web-crawlers or API keys. This ```R```-package uses `xts` and `zoo` under the hood and are compatible with `quantmod` and `TTR` out of the box. +The `cryptoQuotes`-package has *two* main features; retrieving cryptocurrency market data, and charting. The market data consists of *OHLC-V* data and sentiment indicators; including, but not limited to, cryptocurrency *fear and greed index*, *long-short ratio* and *open interest*. All market data is retrieved using the family of `get_*`-functions. To get a full overview of the package and functionality please see the documentation on [pkgdown](https://serkor1.github.io/cryptoQuotes/). + +> **Note:** Given the nature of crypotcurrency data and general legislative restrictions, some `exchanges` may not work in your geolocation. + +Below is a quick overview of the package and basic usage examples on retrieving and charting Bitcoin (BTC) *OHLC-V* and *long-short ratio* in 30 minute intervals. + +### :information_source: Cryptocurrency market data -### Supported exchanges and markets +#### OHLC-V All supported exchanges and markets are listed in the table below, alongside the available range of intervals available from the respective exchanges, @@ -189,8 +232,8 @@ kableExtra::kable_styling( x = data.frame( row.names = NULL, Exchange = exchange, - Spot = rep(x = cli::symbol$tick,length(exchange)), - Futures = rep(x = cli::symbol$tick,length(exchange)), + Spot = rep(x = ":white_check_mark:",length(exchange)), + Futures = rep(x = ":white_check_mark:",length(exchange)), `Available Intervals` = c(intervals), `Smallest Interval` = c(granularity(TRUE)), `Biggest Interval` = c(granularity(FALSE)) @@ -203,22 +246,21 @@ kableExtra::kable_styling( ``` -### :information_source: Basic Usage +
+Example: Bitcoin OHLC-V -#### OHLC-V Market Data - -Get USDT denominated Bitcoin spot market price from Binance with `30m`-intervals using the `get_quote()`-function, +Get USDT denominated Bitcoin (BTC) on the spot market from Binance in `30m`-intervals using the `get_quote()`-function, ```{r cryptocurrency market data in R, eval=TRUE} ## BTC OHLC prices ## from Binance spot market ## in 30 minute intervals BTC <- cryptoQuotes::get_quote( - ticker = 'BTCUSDT', - source = 'binance', - futures = FALSE, + ticker = 'BTCUSDT', + source = 'binance', + futures = FALSE, interval = '30m', - from = Sys.Date() - 1 + from = Sys.Date() - 1 ) ``` @@ -226,12 +268,12 @@ BTC <- cryptoQuotes::get_quote( ```{r print table, echo=FALSE, fig.alt="cryptocurrency prices in R"} kableExtra::kable_styling( knitr::kable( - caption = 'Bitcoin (BTC) OHLC-prices', + caption = 'Bitcoin (BTC) OHLC-V data', align = 'lcccc', table.attr = "style='width:100%;'", x = data.frame( cbind( - Index = paste(tail(zoo::index(BTC))), + index = paste(tail(zoo::index(BTC))), tail(zoo::coredata(BTC)) ),row.names = NULL ), @@ -242,12 +284,112 @@ kableExtra::kable_styling( ) ``` +__________ +
-#### Charting OHLC-V +#### Sentiment indicators -The `BTC`-object can be charted using the `chart()`-function, +The sentiment indicators available in the `cryptoQuotes`-package can be divided in two; *derived indicators* and *market indicators*. The former is calculated based on, for example, the price actions such as the *Moving Average Convergence Divergence* (MACD) indicator. The latter are public indicators such as the *long-short ratio* or *fear and greed index*; these are retrieved using the family of `get_*`-functions, while the derived indicators can be created using, for example, [`TTR`](https://github.com/joshuaulrich/TTR). -```{r chartquote, fig.align='center',fig.dpi=180, fig.alt="cryptocurrency charts in R"} +In this overview we are focusing on *market indicators* made public by the cryptocurrency exchanges. For a full overview of sentiment indicators please refer to the documentation on [pkgdown](https://serkor1.github.io/cryptoQuotes/). All supported *market indicators* by exchange are listed in the table below, + +
+```{r, echo = FALSE} +## 1) list all available +## exchanges and the links +available_endpoint <- data.frame( + Endpoint = c( + "Long-Short Ratio", + "Open Interest", + "Funding Rate" + ), + Binance = c( + ":white_check_mark:", + ":white_check_mark:", + ":white_check_mark:" + ), + Bitmart = c( + ":x:", + ":x:", + ":x:" + ), + Bybit = c( + ":white_check_mark:", + ":white_check_mark:", + ":white_check_mark:" + ), + Kraken = c( + ":white_check_mark:", + ":white_check_mark:", + ":x:" + ), + Kucoin = c( + ":x:", + ":x:", + ":white_check_mark:" + ) +) + +## 4) present table +## for as is +kableExtra::kable_styling( + knitr::kable( + digits = 0, + caption = 'Available sentiment indicators by exchange', + align = 'lccccc', + table.attr = "style='width:100%;'", + x = available_endpoint, + format = 'markdown' + ), + full_width = TRUE, + position = 'center' +) +``` +
+ +
+Example: Bitcoin Long-Short Ratio + +Get the *long-short ratio* on Bitcoin (BTC) using the `get_lsratio()`-function, + +```{r cryptocurrency sentiment indicators in R, eval=TRUE} +## BTC OHLC prices +## from Binance spot market +## in 30 minute intervals +BTC_LS <- cryptoQuotes::get_lsratio( + ticker = 'BTCUSDT', + source = 'binance', + interval = '30m', + from = Sys.Date() - 1 +) +``` + +
+```{r print LS table, echo=FALSE, fig.alt="cryptocurrency prices in R"} +kableExtra::kable_styling( + knitr::kable( + caption = 'Long-Short Ratio on Bitcoin (BTC)', + align = 'lccc', + table.attr = "style='width:100%;'", + x = data.frame( + cbind( + index = paste(tail(zoo::index(BTC_LS))), + tail(zoo::coredata(round(BTC_LS,3))) + ),row.names = NULL + ), + format = 'html' + ), + full_width = TRUE, + position = 'center' +) +``` +
+__________ +
+ +### :information_source: Charting + +```{r, echo=FALSE, include=FALSE} ## Chart BTC ## using klines, SMA, ## MACD and Bollinger Bands @@ -255,8 +397,8 @@ cryptoQuotes::chart( ticker = BTC, main = cryptoQuotes::kline(), sub = list( - cryptoQuotes::volume(), - cryptoQuotes::macd() + cryptoQuotes::lsr(ratio = BTC_LS), + cryptoQuotes::volume() ), indicator = list( cryptoQuotes::sma(n = 7), @@ -267,30 +409,85 @@ cryptoQuotes::chart( ) ``` +Charting in the `cryptoQuotes`-package is built on [`plotly`](https://github.com/plotly/plotly.R) for interactivity. It supports *light* and *dark* themes, and accounts for *color-deficiency* via the `options`-argument in the `chart()`-function. + +#### Charting with indicators + +The OHLC-V data and the sentiment indicator can be charted using the `chart()`-function, + +```{r chartquote, fig.align='center',fig.dpi=180, fig.alt="cryptocurrency charts in R"} +## Chart BTC +## using klines, SMA +## Bollinger Bands and +## long-short ratio +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::kline(), + sub = list( + cryptoQuotes::lsr(ratio = BTC_LS), + cryptoQuotes::volume() + ), + indicator = list( + cryptoQuotes::sma(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::sma(n = 21), + cryptoQuotes::bollinger_bands() + ) +) +``` + + +
+Colorblind friendly version +#### Charting with indicators (colorblind friendly) + +```{r chartquote(deficiency), fig.align='center', fig.dpi=180, fig.alt="cryptocurrency charts in R"} +## Chart BTC +## using klines, SMA +## Bollinger Bands and +## ling-short ratio with color-deficiency +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::kline(), + sub = list( + cryptoQuotes::lsr(ratio = BTC_LS), + cryptoQuotes::volume() + ), + indicator = list( + cryptoQuotes::sma(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::sma(n = 21), + cryptoQuotes::bollinger_bands() + ), + options = list( + deficiency = TRUE + ) +) +``` + +__________ +
+ ## :information_source: Installation -### Stable version +### :shield: Stable version ```{r stable version guide, eval = FALSE} -# install from CRAN +## install from CRAN install.packages( pkgs = 'cryptoQuotes', dependencies = TRUE ) ``` -### Development version +### :hammer_and_wrench: Development version ```{r development version guide, eval = FALSE} -# install from github +## install from github devtools::install_github( repo = 'https://github.com/serkor1/cryptoQuotes/', ref = 'development' ) ``` -## :warning: Disclaimer - -This `library` is still considered `experimental` but no breaking changes will be made on functions labelled as `stable` without appropriate action; please refer to the [release notes](NEWS.md), or submit an [issue](https://github.com/serkor1/cryptoQuotes/issues) if that promise is broken. - ## :information_source: Code of Conduct Please note that the `cryptoQuotes` project is released with a [Contributor Code of Conduct](https://serkor1.github.io/cryptoQuotes/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms. diff --git a/README.md b/README.md index 48293dbe..9ab287fd 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,93 @@ -# cryptoQuotes: A streamlined access to OHLC-V market data and sentiment indicators in R cryptocurrency in R +# cryptoQuotes: Open access to cryptocurrency market data cryptocurrency in R [![CRAN -status](https://www.r-pkg.org/badges/version/cryptoQuotes)](https://www.cran-e.com/package/cryptoQuotes) +status](https://www.r-pkg.org/badges/version/cryptoQuotes)](https://CRAN.R-project.org/package=cryptoQuotes) [![CRAN RStudio mirror -downloads](https://cranlogs.r-pkg.org/badges/last-month/cryptoQuotes?color=blue)](https://www.cran-e.com/package/cryptoQuotes) +downloads](https://cranlogs.r-pkg.org/badges/last-month/cryptoQuotes?color=blue)](https://r-pkg.org/pkg/cryptoQuotes) [![R-CMD-check](https://github.com/serkor1/cryptoQuotes/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/serkor1/cryptoQuotes/actions/workflows/R-CMD-check.yaml) -[![Codecov test -coverage](https://codecov.io/gh/serkor1/cryptoQuotes/branch/main/graph/badge.svg)](https://app.codecov.io/gh/serkor1/cryptoQuotes?branch=main) +[![codecov](https://codecov.io/gh/serkor1/cryptoQuotes/graph/badge.svg?token=D7NF1BPVL5)](https://app.codecov.io/gh/serkor1/cryptoQuotes) [![Lifecycle: -experimental](https://img.shields.io/badge/lifecycle-experimental-orange.svg)](https://lifecycle.r-lib.org/articles/stages.html#experimental) +stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable) +![GitHub last commit +(branch)](https://img.shields.io/github/last-commit/serkor1/cryptoQuotes/development) +## :information_source: About + +The `cryptoQuotes`-package is a high-level API client for accessing +public market data endpoints on major cryptocurrency exchanges. It +supports open, high, low, close and volume (OHLC-V) data and a variety +of sentiment indicators; the market data is high quality and can be +retrieved in intervals ranging from *seconds* to *months*. All the +market data is accessed and processed without relying on crawlers, or +API keys, ensuring an open, and reliable, access for researchers, +traders and students alike. There are currently 5 supported +cryptocurrency exchanges, + +
+ + + + + + + + + + + + +
+Supported exchanges +
+binance + +bitmart + +bybit + +kraken + +kucoin +
+ +
+ +All data is returned as +[`xts`](https://github.com/joshuaulrich/xts)-objects which enables +seamless interaction with with +[`quantmod`](https://github.com/joshuaulrich/quantmod) and +[`TTR`](https://github.com/joshuaulrich/TTR), for developing and +evaluating trading strategies or general purpose cryptocurrency market +analysis with a historical or temporal perspective. + ## :information_source: Overview -The `cryptoQuotes`-package is a high-level API-client to get current, -and historical, cryptocurrency OHLC-V market and sentiment data in `R`, -without using web-crawlers or API keys. This `R`-package uses `xts` and -`zoo` under the hood and are compatible with `quantmod` and `TTR` out of -the box. +The `cryptoQuotes`-package has *two* main features; retrieving +cryptocurrency market data, and charting. The market data consists of +*OHLC-V* data and sentiment indicators; including, but not limited to, +cryptocurrency *fear and greed index*, *long-short ratio* and *open +interest*. All market data is retrieved using the family of +`get_*`-functions. To get a full overview of the package and +functionality please see the documentation on +[pkgdown](https://serkor1.github.io/cryptoQuotes/). + +> **Note:** Given the nature of crypotcurrency data and general +> legislative restrictions, some `exchanges` may not work in your +> geolocation. -### Supported exchanges and markets +Below is a quick overview of the package and basic usage examples on +retrieving and charting Bitcoin (BTC) *OHLC-V* and *long-short ratio* in +30 minute intervals. + +### :information_source: Cryptocurrency market data + +#### OHLC-V All supported exchanges and markets are listed in the table below, alongside the available range of intervals available from the respective @@ -32,7 +95,7 @@ exchanges,
- +
@@ -64,10 +127,10 @@ Biggest Interval Binance
Supported exchanges, markets and intervals.
-âś” +:white_check_mark: -âś” +:white_check_mark: 16 @@ -84,10 +147,10 @@ Binance Bitmart -âś” +:white_check_mark: -âś” +:white_check_mark: 13 @@ -104,10 +167,10 @@ Bitmart Bybit -âś” +:white_check_mark: -âś” +:white_check_mark: 13 @@ -124,10 +187,10 @@ Bybit Kraken -âś” +:white_check_mark: -âś” +:white_check_mark: 10 @@ -144,10 +207,10 @@ Kraken Kucoin -âś” +:white_check_mark: -âś” +:white_check_mark: 13 @@ -164,11 +227,12 @@ Kucoin -### :information_source: Basic Usage - -#### OHLC-V Market Data +
+ +Example: Bitcoin OHLC-V + -Get USDT denominated Bitcoin spot market price from Binance with +Get USDT denominated Bitcoin (BTC) on the spot market from Binance in `30m`-intervals using the `get_quote()`-function, ``` r @@ -176,24 +240,24 @@ Get USDT denominated Bitcoin spot market price from Binance with ## from Binance spot market ## in 30 minute intervals BTC <- cryptoQuotes::get_quote( - ticker = 'BTCUSDT', - source = 'binance', - futures = FALSE, + ticker = 'BTCUSDT', + source = 'binance', + futures = FALSE, interval = '30m', - from = Sys.Date() - 1 + from = Sys.Date() - 1 ) ```
- +
+ + + + + + + + + + +
-Bitcoin (BTC) OHLC-prices +Bitcoin (BTC) OHLC-V data
-Index +index open @@ -215,122 +279,237 @@ volume
-2024-03-12 10:30:00 +2024-05-31 18:00:00 -71978.46 +67215.58 -72085.06 +67352.41 -71850.01 +66670 -71936 +67000.01 -818.1898 +2093.77494
-2024-03-12 11:00:00 +2024-05-31 18:30:00 -71936 +67000.01 -71959.12 +67221.53 -71647.14 +66876.8 -71705.63 +67200.01 -587.18566 +788.25693
-2024-03-12 11:30:00 +2024-05-31 19:00:00 -71705.63 +67200.01 -71999 +67459.66 -71705.62 +67160.3 -71864 +67417.98 -642.93822 +598.68095
-2024-03-12 12:00:00 +2024-05-31 19:30:00 -71864 +67417.98 -72376 +67455.93 -71860 +67287.97 -72062.98 +67342.77 -1368.19948 +287.26257
-2024-03-12 12:30:00 +2024-05-31 20:00:00 -72062.99 +67342.77 -72257.56 +67444.47 -72012.72 +67288.2 -72023.82 +67305.5 -673.04693 +383.04002 +
+2024-05-31 20:30:00 + +67305.5 + +67427.68 + +67170 + +67400 + +468.98276 +
+ +
+ +------------------------------------------------------------------------ + +
+ +#### Sentiment indicators + +The sentiment indicators available in the `cryptoQuotes`-package can be +divided in two; *derived indicators* and *market indicators*. The former +is calculated based on, for example, the price actions such as the +*Moving Average Convergence Divergence* (MACD) indicator. The latter are +public indicators such as the *long-short ratio* or *fear and greed +index*; these are retrieved using the family of `get_*`-functions, while +the derived indicators can be created using, for example, +[`TTR`](https://github.com/joshuaulrich/TTR). + +In this overview we are focusing on *market indicators* made public by +the cryptocurrency exchanges. For a full overview of sentiment +indicators please refer to the documentation on +[pkgdown](https://serkor1.github.io/cryptoQuotes/). All supported +*market indicators* by exchange are listed in the table below, + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -338,20 +517,165 @@ volume -#### Charting OHLC-V +
+ +Example: Bitcoin Long-Short Ratio + -The `BTC`-object can be charted using the `chart()`-function, +Get the *long-short ratio* on Bitcoin (BTC) using the +`get_lsratio()`-function, + +``` r +## BTC OHLC prices +## from Binance spot market +## in 30 minute intervals +BTC_LS <- cryptoQuotes::get_lsratio( + ticker = 'BTCUSDT', + source = 'binance', + interval = '30m', + from = Sys.Date() - 1 +) +``` + +
+ +
+Available sentiment indicators by exchange +
+Endpoint + +Binance + +Bitmart + +Bybit + +Kraken + +Kucoin +
+Long-Short Ratio + +:white_check_mark: + +:x: + +:white_check_mark: + +:white_check_mark: + +:x:
-2024-03-12 13:00:00 +Open Interest -72023.82 +:white_check_mark: -72144.14 +:x: -71576 +:white_check_mark: -71628.53 +:white_check_mark: +:x: +
-1283.8762 +Funding Rate + +:white_check_mark: + +:x: + +:white_check_mark: + +:x: + +:white_check_mark:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Long-Short Ratio on Bitcoin (BTC) +
+index + +long + +short + +ls_ratio +
+2024-05-31 18:00:00 + +0.679 + +0.321 + +2.114 +
+2024-05-31 18:30:00 + +0.687 + +0.313 + +2.199 +
+2024-05-31 19:00:00 + +0.696 + +0.304 + +2.289 +
+2024-05-31 19:30:00 + +0.699 + +0.301 + +2.323 +
+2024-05-31 20:00:00 + +0.696 + +0.304 + +2.288 +
+2024-05-31 20:30:00 + +0.696 + +0.304 + +2.293 +
+ +
+ +------------------------------------------------------------------------ + + + +### :information_source: Charting + +Charting in the `cryptoQuotes`-package is built on +[`plotly`](https://github.com/plotly/plotly.R) for interactivity. It +supports *light* and *dark* themes, and accounts for *color-deficiency* +via the `options`-argument in the `chart()`-function. + +#### Charting with indicators + +The OHLC-V data and the sentiment indicator can be charted using the +`chart()`-function, ``` r ## Chart BTC -## using klines, SMA, -## MACD and Bollinger Bands +## using klines, SMA +## Bollinger Bands and +## long-short ratio cryptoQuotes::chart( ticker = BTC, main = cryptoQuotes::kline(), sub = list( - cryptoQuotes::volume(), - cryptoQuotes::macd() + cryptoQuotes::lsr(ratio = BTC_LS), + cryptoQuotes::volume() ), indicator = list( cryptoQuotes::sma(n = 7), @@ -364,36 +688,65 @@ cryptoQuotes::chart( cryptocurrency charts in R +
+ +Colorblind friendly version + + +#### Charting with indicators (colorblind friendly) + +``` r +## Chart BTC +## using klines, SMA +## Bollinger Bands and +## ling-short ratio with color-deficiency +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::kline(), + sub = list( + cryptoQuotes::lsr(ratio = BTC_LS), + cryptoQuotes::volume() + ), + indicator = list( + cryptoQuotes::sma(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::sma(n = 21), + cryptoQuotes::bollinger_bands() + ), + options = list( + deficiency = TRUE + ) +) +``` + +cryptocurrency charts in R + +------------------------------------------------------------------------ + +
+ ## :information_source: Installation -### Stable version +### :shield: Stable version ``` r -# install from CRAN +## install from CRAN install.packages( pkgs = 'cryptoQuotes', dependencies = TRUE ) ``` -### Development version +### :hammer_and_wrench: Development version ``` r -# install from github +## install from github devtools::install_github( repo = 'https://github.com/serkor1/cryptoQuotes/', ref = 'development' ) ``` -## :warning: Disclaimer - -This `library` is still considered `experimental` but no breaking -changes will be made on functions labelled as `stable` without -appropriate action; please refer to the [release notes](NEWS.md), or -submit an [issue](https://github.com/serkor1/cryptoQuotes/issues) if -that promise is broken. - ## :information_source: Code of Conduct Please note that the `cryptoQuotes` project is released with a diff --git a/_pkgdown.yml b/_pkgdown.yml index 96c27a1e..6fc6aeaf 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -4,43 +4,87 @@ home: title: Cryptocurrency with R # description for google - description: A high-level API client to fetch historical cryptocurrency OHLC-V market data, and sentiment indicators, in R. + description: > + An open and unified access to cryptocurrency market data in R. navbar: type: inverse + structure: + left: [intro, usecase, custom-indicators, reference, articles, news] + right: [github] + + components: + usecase: + text: Usecase + href: articles/usecase.html + custom-indicators: + text: Custom Indicators + href: articles/custom_indicators.html + articles: + text: Articles + menu: + - text: Cryptocurrency Market Data + href: articles/01-article.html + - text: Cryptocurrency Charts + href: articles/02-article.html + - text: Time Zones + href: articles/03-article.html + - text: Converting xts-objects + href: articles/04-article.html + - text: cryptoQuotes x quantmod and TTR + href: articles/05-article.html + url: https://serkor1.github.io/cryptoQuotes/ + template: bootstrap: 5 bootswatch: flatly reference: -- title: Cryptocurrency sentiment and price data - desc: Functions that return cryptocurrency market data -- contents: has_concept('get-function') -- title: Supported calls - desc: All available API parameters +- title: Cryptocurrency Market Data + desc: > + The collection of functions to retrieve OHLC-V and sentiment data. +- contents: has_concept('get-functions') + +- title: Supported Calls + desc: > + The collection of functions to list available argument values in the + `interval`-, `source`- and `interval`-arguments. - contents: has_concept('supported calls') -- title: Main charts - desc: The main charts -- contents: has_concept(c('charting','price charts')) -- title: Subcharts - desc: The family of chart suited for subcharts -- contents: - - has_concept('subcharts') -- title: Charting indicators - desc: Adding indicators to charts -- contents: - - has_concept('chart indicators') - - -has_concept('price charts') - - -has_concept('subcharts') -- title: Convinience functions + +- title: Charting + desc: > + The collection of `chart`-functions are split 3; main charts (price chart), main chart + indicators and subchart indicators. All `charts` are initialised using the `chart`-function. + contents: + - chart + +- subtitle: Main Charts + desc: > + The collection of main chart functions for charting prices. + contents: + - kline + - ohlc + - pline + +- subtitle: Main Chart Indicators + desc: > + The collection of main chart indicators which are overlaid the main chart. + contents: + - has_concept('main chart indicators') + +- subtitle: Subchart Indicators + desc: > + The collection of subchart indicators which are charted as a subchart. + contents: + - has_concept('subchart indicators') + +- title: Utilities desc: Manipulate and calibrate objects -- contents: has_concept('convinience') +- contents: has_concept('utility') + - title: Datasets desc: Sample datasets returned by ```get_quote()``` and ```get_fgindex()``` -- contents: has_concept('data') -- title: Decprecated functions - desc: These functions has been deprecated since version 1.3.0, and will be permanently deleted in the subsequent versions -- contents: has_concept('deprecated') - +- contents: + - has_keyword('datasets') diff --git a/codemeta.json b/codemeta.json new file mode 100644 index 00000000..2e5c5836 --- /dev/null +++ b/codemeta.json @@ -0,0 +1,266 @@ +{ + "@context": "https://doi.org/10.5063/schema/codemeta-2.0", + "@type": "SoftwareSourceCode", + "identifier": "cryptoQuotes", + "description": " This high-level API client offers a streamlined access to public cryptocurrency market data and sentiment indicators. It features OHLC-V (Open, High, Low, Close, Volume) that comes with granularity ranging from seconds to months and essential sentiment indicators to develop and backtest trading strategies, or conduct detailed market analysis. By interacting directly with the major cryptocurrency exchanges this package ensures a reliable, and stable, flow of market information, eliminating the need for complex, low-level API interactions or webcrawlers.", + "name": "cryptoQuotes: A Streamlined Access to Cryptocurrency OHLC-V Market Data and Sentiment Indicators", + "relatedLink": ["https://serkor1.github.io/cryptoQuotes/", "https://CRAN.R-project.org/package=cryptoQuotes"], + "codeRepository": "https://github.com/serkor1/cryptoQuotes", + "issueTracker": "https://github.com/serkor1/cryptoQuotes/issues", + "license": "https://spdx.org/licenses/GPL-2.0", + "version": "1.3.1", + "programmingLanguage": { + "@type": "ComputerLanguage", + "name": "R", + "url": "https://r-project.org" + }, + "runtimePlatform": "R version 4.4.0 (2024-04-24)", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "author": [ + { + "@type": "Person", + "givenName": "Serkan", + "familyName": "Korkmaz", + "email": "serkor1@duck.com", + "@id": "https://orcid.org/0000-0002-5052-0982" + } + ], + "contributor": [ + { + "@type": "Person", + "givenName": "Serkan", + "familyName": "Korkmaz", + "email": "serkor1@duck.com", + "@id": "https://orcid.org/0000-0002-5052-0982" + }, + { + "@type": "Person", + "givenName": "Jonas", + "familyName": "Cuzulan Hirani", + "email": "jjh@vive.dk", + "@id": "https://orcid.org/0000-0002-9512-1993" + } + ], + "copyrightHolder": [ + { + "@type": "Person", + "givenName": "Serkan", + "familyName": "Korkmaz", + "email": "serkor1@duck.com", + "@id": "https://orcid.org/0000-0002-5052-0982" + } + ], + "maintainer": [ + { + "@type": "Person", + "givenName": "Serkan", + "familyName": "Korkmaz", + "email": "serkor1@duck.com", + "@id": "https://orcid.org/0000-0002-5052-0982" + } + ], + "softwareSuggestions": [ + { + "@type": "SoftwareApplication", + "identifier": "data.table", + "name": "data.table", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=data.table" + }, + { + "@type": "SoftwareApplication", + "identifier": "knitr", + "name": "knitr", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=knitr" + }, + { + "@type": "SoftwareApplication", + "identifier": "quantmod", + "name": "quantmod", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=quantmod" + }, + { + "@type": "SoftwareApplication", + "identifier": "rmarkdown", + "name": "rmarkdown", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=rmarkdown" + }, + { + "@type": "SoftwareApplication", + "identifier": "testthat", + "name": "testthat", + "version": ">= 3.0.0", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=testthat" + }, + { + "@type": "SoftwareApplication", + "identifier": "tidyverse", + "name": "tidyverse", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=tidyverse" + } + ], + "softwareRequirements": { + "1": { + "@type": "SoftwareApplication", + "identifier": "cli", + "name": "cli", + "version": ">= 3.6.2", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=cli" + }, + "2": { + "@type": "SoftwareApplication", + "identifier": "curl", + "name": "curl", + "version": ">= 5.2.1", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=curl" + }, + "3": { + "@type": "SoftwareApplication", + "identifier": "jsonlite", + "name": "jsonlite", + "version": ">= 1.8.8", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=jsonlite" + }, + "4": { + "@type": "SoftwareApplication", + "identifier": "lifecycle", + "name": "lifecycle", + "version": ">= 1.0.4", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=lifecycle" + }, + "5": { + "@type": "SoftwareApplication", + "identifier": "plotly", + "name": "plotly", + "version": ">= 4.10.4", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=plotly" + }, + "6": { + "@type": "SoftwareApplication", + "identifier": "TTR", + "name": "TTR", + "version": ">= 0.24.4", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=TTR" + }, + "7": { + "@type": "SoftwareApplication", + "identifier": "utils", + "name": "utils" + }, + "8": { + "@type": "SoftwareApplication", + "identifier": "xts", + "name": "xts", + "version": ">= 0.13.2", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=xts" + }, + "9": { + "@type": "SoftwareApplication", + "identifier": "zoo", + "name": "zoo", + "version": ">= 1.8-12", + "provider": { + "@id": "https://cran.r-project.org", + "@type": "Organization", + "name": "Comprehensive R Archive Network (CRAN)", + "url": "https://cran.r-project.org" + }, + "sameAs": "https://CRAN.R-project.org/package=zoo" + }, + "10": { + "@type": "SoftwareApplication", + "identifier": "R", + "name": "R", + "version": ">= 4.0.0" + }, + "SystemRequirements": null + }, + "fileSize": "808.095KB", + "releaseNotes": "https://github.com/serkor1/cryptoQuotes/blob/master/NEWS.md", + "readme": "https://github.com/serkor1/cryptoQuotes/blob/main/README.md", + "contIntegration": ["https://github.com/serkor1/cryptoQuotes/actions/workflows/R-CMD-check.yaml", "https://codecov.io/gh/serkor1/cryptoQuotes"], + "developmentStatus": "https://lifecycle.r-lib.org/articles/stages.html#experimental", + "keywords": ["cryptocurrencies", "cryptocurrency", "cryptocurrency-exchanges", "r", "binance", "binance-api", "kucoin", "kucoin-api", "kraken-api", "kraken-exchange-api", "bitmart", "bybit", "bybit-api", "rstats", "rstats-package"] +} diff --git a/cran-comments.md b/cran-comments.md index 42ef5b0f..85b962e4 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -2,22 +2,10 @@ 0 errors ✔ | 0 warnings ✔ | 1 note ✖ -### The note - -``` - The Title field should be in title case. Current version is: - 'A Streamlined Access to Cryptocurrency OHLC-V Market Data and Sentiment Indicators' - In title case that is: - 'A Streamlined Access to Cryptocurrency OHLC-v Market Data and Sentiment Indicators' -``` - -This `note` is related to `OHLC-V`, and since `OHLC-V` is an accepted shorthand for Open, High, Low, Close and Volume I believe this `note` should -be ignored. - -## Resubmission - -This is a resubmission. In this version I have updated many elements in the library, but -most importantly the unittests are being conducted in a manner that is robust to timing -errors. - - +❯ checking installed package size ... NOTE + installed size is 13.1Mb + sub-directories of 1Mb or more: + doc 11.9Mb + +This is beyond my technical knowledge, but here is a related SO-post: +https://stackoverflow.com/questions/38639266/r-cmd-check-unusual-checking-installed-package-size-note diff --git a/data-raw/ATOM.R b/data-raw/ATOM.R index 2afd7088..57e60323 100644 --- a/data-raw/ATOM.R +++ b/data-raw/ATOM.R @@ -1,11 +1,10 @@ ## code to prepare `ATOM` dataset goes here - # 1) generate ATOM # with 15 minute candles ATOM <- cryptoQuotes::get_quote( ticker = "ATOMUSDT", - source = "binance", + source = "bybit", futures = FALSE, interval = "15m", from = "2023-12-30", diff --git a/data-raw/BTC.R b/data-raw/BTC.R index 4ee652e9..281f912b 100644 --- a/data-raw/BTC.R +++ b/data-raw/BTC.R @@ -4,7 +4,7 @@ # with weekly candles BTC <- cryptoQuotes::get_quote( ticker = "BTCUSDT", - source = "binance", + source = "bybit", futures = FALSE, interval = "1w", from = "2023-01-01", diff --git a/data-raw/DOGE.R b/data-raw/DOGE.R index 54ba82fa..b5c8098c 100644 --- a/data-raw/DOGE.R +++ b/data-raw/DOGE.R @@ -7,6 +7,7 @@ # He tweeted at 06:18 UTC on January 14, 2022 DOGE <- get_quote( ticker = "DOGEUSDT", + source = "bybit", interval = "1m", from = as.POSIXct("2022-01-14 06:00:00", tz = "UTC"), to = as.POSIXct("2022-01-14 07:00:00", tz = "UTC") diff --git a/data-raw/control_data.R b/data-raw/control_data.R new file mode 100644 index 00000000..87069d5f --- /dev/null +++ b/data-raw/control_data.R @@ -0,0 +1,70 @@ +# script: control_data +# author: Serkan Korkmaz, serkor1@duck.com +# date: 2024-05-17 +# objective: The control data is an internal dataset +# for all get_*-functions in daily format to conduct +# thorough testing of charting functions and avoid +# unnecessary bugs +# +# NOTE: Run this function before each PUSH to development +# to incorporate changes to packages +# script start; + +# 1) define functions +# for naming datasets +funs <- c( + "quote", + "fgindex", + "lsratio", + "openinterest", + "fundingrate" +) + +# 2) run functions +# accordingly +control_data <- lapply( + X = funs, + FUN = function(FUN) { + + # 2.1) extract function + # and store as foo + foo <- get( + paste0("get_", FUN), + envir = asNamespace('cryptoQuotes') + ) + + if (!(FUN == "fgindex")) { + + foo( + ticker = "BTCUSDT", + source = "binance", + from = Sys.Date() - 100 + ) + + + } else { + + foo( + from = Sys.Date() - 100 + ) + + } + + + } +) + +# 3) set names +# of datasets +names(control_data) <- funs + +# write data; +usethis::use_data( + control_data, + overwrite = TRUE, + internal = TRUE +) + +# script end; + + diff --git a/data/ATOM.rda b/data/ATOM.rda index 9f8762ccc7d17671f42471c99eb26828ca3f5688..e5bfe11a1e540af0cc07eb6a2dec5132198230bf 100644 GIT binary patch literal 3161 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 literal 2559 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 literal 2007 zcmY+6dpOgJAIHD5i@7YhrpbI8#+1ccQYZS3ESIfgOfIFCluf#vaw$idO);S@5({l8 z6l1d>_tUOeX-}ybyd7j_v`8@CU>-qfgb_(EZv8DPGy#0e_*Zu;2k7C-q~u`E9PJW=#=uabLxblS6wae6XKJ;PtDMY{M<+8-c{J8f zT|9RJ=iMVfE z27p7TJhu-MX>>wTGz4I=M6DCp537vEPV^esOB|SVz%#X00A7AjBSIVzf z#&$*ojEdWzOlZ}zd*p4LwF~4s+wnPreTQS-8Qrfxt9Mq0)d!h z)|PC0dGKX7v;VtqrTD*`;6%XGBFq!NiPa?PECQT>m~?!Op+w?=J4IT3st?{m5(Xg@ zZZMsLDtVxIJw1pWv>qn3(aYqS-DSSfvF1B-1Qzc~>i|1YTk9x!NslyREt+tP7cKBk z$73kiW2WB*WQQ~1v#q_YL3=ArE#IVbuSI1v?5oj19QguwG{IxRR_Ytv>lM3{;T&|7 zRqwnn0*O*nRUa$-Ghzoc;X>oE+YmqEqD)}GcR@0j7iX-N%G7K4s9#={K+UMJHakC7 zNKNV3Npjw>NIItIDoRMqr_}n)S*TU2F#I#o1jSYHez%;nH}^_1z6;W<2rZ+P7;){b z`KF}lGj=(1--y9fw0rqup21MwcBHhf{?g0cE;K_mcc%K<=MevG$p&QaJETIx ze)Y+RIOXESX0D5u2})XW7vbc?A}K&=koIXkcOhw;bDP)9nduiT74~!D+a2Bujx+jY zLuI0ptJ$C4FV!-#e?DKJx$hI_6;tSy!}_LmDaZw*uwjC>&n~W`VLXuaO2_zMtwVQn z%~XJB_zE196NBRBOC-N`6Gf`;jvI{Yu;ulI8eQznH4s6)9N#^asXz|;**>WnLVT`s z8{c!z`s)X4C+RF0v&&Ux`vRtR-jhd{IF>6l*T%fU3nYA;=jNHASN7M=DnZwAlTz}H zF$Ar>Gm2HSqxa$iZI?Zok-47wW1IDMn1QM&8^VTw(M=i`hPS@!NxrMAP7PFzGZm$( z!O|2+JLnrl@1`svKPJ)H=N|R3bVV}iK^EYW5e+m!1eLE}1gEQ;_2Z{Ueof_`V59p< z(`LQkny`sI9m9?%N2ZLJlWKQHV_GB!LJrm|VB_}&9x%st9ik6-=k1u~YIL_6KQm8& zXkAp>-Z#_n=IKS*8avvKk5@493)O?K36n}hhGRl*wdReaXWIT*weF2r_Vblm9pp_P zZ1YQRck=Wuu3+5u>OfRg*{!3DG&Ksix>GStjT_1yK5C)=w5^ETjhU+JYn7R|ynG`c zA$+D9y`8j*iw8&6r*Y{3dZ2%+DlE~*^RaCoU~Z{j^D0x(A6Ho$CGjQP9q51Dn8ZP2 z5;>lQ6TEN;Or|}FS&_$KRkk1Yf3oIkb7M2yuVAUBvG1v)+8JjhKZYo= z(;_@L*!PpSOR9u#aN_9l)c(_WFAZa2MA;w1wE#iejS};!&t^Gp8 zCh!u7x@JOsM9|&?t0srD-MT^7Efs|?)yra*!H>48zN5UzoV%c;nIVy9}Z0|fk#Eg2fiDo2x_DysWYEQ9F9 zfP%pMG4t-knfD{kHYN7gr};jOV}XIbG7wi8XA>%^>JpfrO|84;T7CWNJ|uR~(!Z=Z mcKF*KwYhVC;qY}FB4nh1*@{OX8s0{#*n1| diff --git a/data/DOGE.rda b/data/DOGE.rda index 545887acce08b3141964833b52128a07d597da83..057b508fc5606390092f192b07d57c2373691f4c 100644 GIT binary patch literal 1699 zcmV;U23+|k}SOpnzx27uatXwYZ?0004?dVmH%00STZ00000 zZBJ9w(dh#q&@}Y`G&BdO4Lv|KF~k4>13&-(&93?ZO2JwN~r00SV?CV&7M27nC!000008V#h# z0017400U}@Mw8Mq14GnkXc_>}0iXbA27mwq)Bw-`001=5000dQ001-_YJfBv001-| zpb}C-nUva^15Gs000Te zhKntou@2rG9I;@WG$T-Do8D1^kckc|YOm_sloB$HEZfYg+LxC43Yjs^l)uSM22OWd`wlH!j7 zAOfoa^btzl!vTbZ#dQ7g2=1Av1VKPafZAP`PvAnflR+B%k)iq1PnFPZD~Ly1)aKNP zs1T1;PJm&Q5fkG}I3ipiTz-f3$MkO8X2lmNbnCcLg5v02Uo&Lgs)R-W>!OnzoP=RQ zd>c^M@v)g|#WQEpbsMfp(*&wuG4XGu1`&WcL|bTz1DS0NjbJjEWz{ z3bvHN(N2XFSsAYq`5J1ts%keB1q%MyOl@ToF{&jZs|+X5OmeTrW*$)>l1S$-Ko;V0 z&Dm9pw-YrxZ<#NiIZwWcGB=`NdeDMR(7?%}f8<{Xy8Hpm$D~#3Vnl3BFv~2q7%}sO ziNPZCIN+j66Jq7zApK>>Nib~}Ww_OAgyF9V4pI%dz9pWH?HA$Fkg3sx=v}BXRj0eu zal0c-Gf7LUV~7}S4205$q~Qp1Jgvz@<-WEvZWZfu$POm=Dvk<0FiAdOhzUit510|m z708{nARL#LcOtLW_fmDrJ1t^hH)41C8d#Pl0}5!xRAL6q56BD-aL4uwUYJzamG|0{ zLL_B5gj?yryVgUDc{2->0X~LPs8p>&8yC4}?c1dFy#64Rzs*-Ll^XQKa)wE$VRr=` z5i$e>5vhA3NJfy7>7Z{qghpb9lBvFeLVHQa5m^^0zxAFRYVk=)usWF)_isafra%`$ z7bqpXkq9_Q4y>QRju{T@9!L~2Pp|1@^PyC7|H_{7tF_^}KtaU>{yjmo``_qRh{gYWWmfWGod5Vubj-v}AL~3A=z-Cq!tSKTJHc z!S{g9AthXP1nN;$F8NEJOR8J?X9e7tUeB7{cu+i>6!70G7upfVQT^LySm;%(DLxMR zQFL2ohON`;=VILodX&##X`Gi(YAH>Jby@bWf$)3EJSe#f^<+camkGO6$uNhHluDO7 z2k8+%)nI~2eIG?=--C%JAa)qw--Db{#5nCg2js)vAqK~?)Boa`doUA2GMomB?BJFj z07{h(a4P38Rb|se3=-vvn8B`G9%NKC2P&N0a6E%AI*C(X7b*s*2Y1P`-I5eMk|evy z;GLj@!GY1GJ5FO9J5C)W)G7(3a~Jg2o*5J=1dxK|K#1jzbTyluKMYno&ZKg1O6RDG|U&1tWP*HNi5ulPGCSr10K@@I9THi2_}O th75WuTcBp>lxzW{d_@ZbOd literal 2534 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 saY&cpJTt>R7Up The time-index} +\item{open}{<\link{numeric}> Opening price} +\item{high}{<\link{numeric}> Highest price} +\item{low}{<\link{numeric}> Lowest price} +\item{close}{<\link{numeric}> Closing price} +\item{volume}{<\link{numeric}> Trading volume} +} } \usage{ ATOM } \description{ -A xts object with 15m OHLCV of USDT denominated ATOM with 97 rows and 5 columns, from 2023-12-30 to 2023-12-31. -} -\details{ -\describe{ -\item{Open}{Opening price} -\item{High}{Highest price} -\item{Low}{Lowest price} -\item{Close}{Closing price} -\item{Volume}{Volume} -} +This dataset contains time-series data for the ATOM (ATOM) +denominated in USDT (Tether), captured in 15-minute intervals. +The data spans from December 30 to December 31, 2023. } -\seealso{ -Other data: -\code{\link{BTC}}, -\code{\link{DOGE}}, -\code{\link{FGIndex}} +\examples{ +# Load the dataset +data("ATOM") + +# chart +chart( + ticker = ATOM, + main = kline(), + sub = list(volume()) +) } -\concept{data} \keyword{datasets} diff --git a/man/BTC.Rd b/man/BTC.Rd index dff63951..69386008 100644 --- a/man/BTC.Rd +++ b/man/BTC.Rd @@ -3,30 +3,36 @@ \docType{data} \name{BTC} \alias{BTC} -\title{USDT denominated Bitcoin(BTC) with 1 week intervals} +\title{USDT Denominated Bitcoin (BTCUSDT) Weekly Intervals} \format{ -An object of class \code{xts} (inherits from \code{zoo}) with 52 rows and 5 columns. +An \code{\link[xts:xts]{xts::xts()}}-object with 52 rows and 5 columns, + +\describe{ +\item{index}{<\link{POSIXct}> The time-index} +\item{open}{<\link{numeric}> Opening price} +\item{high}{<\link{numeric}> Highest price} +\item{low}{<\link{numeric}> Lowest price} +\item{close}{<\link{numeric}> Closing price} +\item{volume}{<\link{numeric}> Trading volume} +} } \usage{ BTC } \description{ -A xts object with weekly OHLCV of USDT denominated Bitcoin with 52 rows and 5 columns, from 2023-01-01 to 2023-12-31. -} -\details{ -\describe{ -\item{Open}{Opening price} -\item{High}{Highest price} -\item{Low}{Lowest price} -\item{Close}{Closing price} -\item{Volume}{Volume} -} +This dataset contains time-series data for Bitcoin (BTC) +denominated in USDT (Tether), captured in weekly intervals. +The data spans from January 1, 2023, to December 31, 2023. } -\seealso{ -Other data: -\code{\link{ATOM}}, -\code{\link{DOGE}}, -\code{\link{FGIndex}} +\examples{ +# Load the dataset +data("BTC") + +# chart +chart( + ticker = BTC, + main = kline(), + sub = list(volume()) +) } -\concept{data} \keyword{datasets} diff --git a/man/DOGE.Rd b/man/DOGE.Rd index c97383d0..4bcc7450 100644 --- a/man/DOGE.Rd +++ b/man/DOGE.Rd @@ -3,30 +3,36 @@ \docType{data} \name{DOGE} \alias{DOGE} -\title{USDT denominated DOGECOIN in 1m intervals} +\title{USDT Denominated DOGECOIN (DOGEUSDT) 1-Minute Intervals} \format{ -An object of class \code{xts} (inherits from \code{zoo}) with 61 rows and 5 columns. +An \code{\link[xts:xts]{xts::xts()}}-object with 61 rows and 5 columns, + +\describe{ +\item{index}{<\link{POSIXct}> The time-index} +\item{open}{<\link{numeric}> Opening price} +\item{high}{<\link{numeric}> Highest price} +\item{low}{<\link{numeric}> Lowest price} +\item{close}{<\link{numeric}> Closing price} +\item{volume}{<\link{numeric}> Trading volume} +} } \usage{ DOGE } \description{ -A xts object with 1m OHLCV of USDT denominated Dogecoin with 61 rows and 5 columns. -} -\details{ -\describe{ -\item{Open}{Opening price} -\item{High}{Highest price} -\item{Low}{Lowest price} -\item{Close}{Closing price} -\item{Volume}{Volume} -} +This dataset contains time-series data for the DOGECOIN (DOGE) +denominated in USDT (Tether), captured in 1-minute intervals. +The data spans 2022-01-14 07:00:00 CET to 2022-01-14 08:00:00 CET. } -\seealso{ -Other data: -\code{\link{ATOM}}, -\code{\link{BTC}}, -\code{\link{FGIndex}} +\examples{ +# Load the dataset +data("DOGE") + +# chart +chart( + ticker = DOGE, + main = kline(), + sub = list(volume()) +) } -\concept{data} \keyword{datasets} diff --git a/man/FGIndex.Rd b/man/FGIndex.Rd index 8071c705..4f525733 100644 --- a/man/FGIndex.Rd +++ b/man/FGIndex.Rd @@ -3,26 +3,40 @@ \docType{data} \name{FGIndex} \alias{FGIndex} -\title{Fear and Greed Index Values} +\title{Fear and Greed Index (FGI) values for the +cryptocurrency market in daily intervals} \format{ -An object of class \code{xts} (inherits from \code{zoo}) with 364 rows and 1 columns. +An \code{\link[xts:xts]{xts::xts()}}-object with 364 rows and 1 columns, + +\describe{ +\item{index}{<\link{POSIXct}> The time-index} +\item{fgi}{<\link{numeric}< The daily fear and greed index value} +} } \usage{ FGIndex } \description{ -A xts object with Fear and Greed Index value. It has 689 rows, and 1 colum. Extracted from 2023-01-01 to 2023-12-31 +This dataset contains daily values of the Fear and Greed Index for the year +2023, which is used to measure the sentiments of investors in the market. +The data spans from January 1, 2023, to December 31, 2023. } \details{ -\describe{ -\item{FGI}{Daily Fear and Greed Index Value} +The Fear and Greed Index goes from 0-100, and can be classified as follows, + +\itemize{ +\item 0-24, Extreme Fear +\item 25-44, Fear +\item 45-55, Neutral +\item 56-75, Greed +\item 76-100, Extreme Greed } } -\seealso{ -Other data: -\code{\link{ATOM}}, -\code{\link{BTC}}, -\code{\link{DOGE}} +\examples{ +# Load the dataset +data("FGIndex") + +# Get a summary of index values +summary(FGIndex) } -\concept{data} \keyword{datasets} diff --git a/man/GET.Rd b/man/GET.Rd index b55470c4..75be4caf 100644 --- a/man/GET.Rd +++ b/man/GET.Rd @@ -22,34 +22,28 @@ A \link{list} crated by \code{\link[jsonlite:fromJSON]{jsonlite::fromJSON()}} GET-requests } \examples{ -# script: scr_GET -# date: 2024-02-28 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: An example on how to use the GET-function -# mostly for internal purposes -# script start; - \dontrun{ + # script start; + exchange <- "bybit" futures <- FALSE - # 1) define baseUrl - # and endoint + # 1) define baseurl base_url <- cryptoQuotes:::baseUrl( - source = exchange, + source = exchange, futures = futures ) + # 2) define endpoint end_point <- cryptoQuotes:::endPoint( source = "bybit", futures = futures, - type = "ohlc" + type = "ohlc" ) - - # 2) define parameters - # that are passed into - # GET + # 2) define actual + # parameters based on + # API docs queries <- list( symbol = "BTCUSDT", category = "spot", @@ -57,19 +51,19 @@ GET-requests interval = "D" ) - # 3) perform GET request - GET( + cryptoQuotes:::GET( url = base_url, endpoint = end_point, query = queries ) -} -# script end; + # script end; +} } \seealso{ Other development tools: +\code{\link{chart_layout}()}, \code{\link{convert_date}()}, \code{\link{default_dates}()}, \code{\link{fetch}()}, diff --git a/man/add_event.Rd b/man/add_event.Rd index 6b93276e..c9acfd3f 100644 --- a/man/add_event.Rd +++ b/man/add_event.Rd @@ -2,44 +2,36 @@ % Please edit documentation in R/chart_event.R \name{add_event} \alias{add_event} -\title{add eventlines to -the chart} +\title{Add eventlines to the chart} \usage{ -add_event(event_data, ...) +add_event(data, ...) } \arguments{ -\item{event_data}{a \link{data.frame} with index, event and colors.} +\item{data}{a \link{data.frame}-type object with \code{index}, \code{event} +and \code{color} columns.} -\item{...}{arguments pass interally by \link{chart}, ignore.} +\item{...}{For internal use. Please ignore.} } \value{ -Invisbly returns a plotly object. +A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object with \code{shapes} and \code{annotations} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -Common types of event indicators include earnings release dates, dividend payouts, central bank interest rate decisions, chart pattern breakouts, and geopolitical events like elections or geopolitical tensions. -The choice of event indicators depends on the trader's or analyst's specific objectives and the factors they believe are most relevant to the asset's price movements. +A high-level \code{\link[plotly:layout]{plotly::layout()}}-function. +The function adds \code{shapes} and \code{annotations} to the main \code{\link[=chart]{chart()}}. } \details{ -TBA +The \link{data.frame} must include the following columns, +\itemize{ +\item \code{index} \link{integer} or \link{date}: corresponding to the event timing. +\item \code{event} \link{character}: the event label. +\item \code{color} \link{character}: the color of the event } -\section{Note}{ -The eventlines are drawn using \code{\link[plotly:layout]{plotly::layout()}}, so all existing -eventlines will be replaced each time you call \code{\link[=add_event]{add_event()}}. } - \examples{ -# script: scr_addEvents -# date: 2023-12-07 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Describe the usage -# of addEvents # script start; -# laod library -library(cryptoQuotes) - # 1) Generate random events # of buys and sells and convert # to data.frame @@ -48,8 +40,11 @@ library(cryptoQuotes) # but only base R is shown here to avoid # too many dependencies set.seed(1903) -event_data <- ATOM[ - sample(1:nrow(ATOM), size = 2) +event_data <- cryptoQuotes::ATOM[ + sample( + x = 1:nrow(cryptoQuotes::ATOM), + size = 2 + ) ] # 1.1) Extract the index @@ -61,7 +56,9 @@ index <- zoo::index( # 1.2) Convert the coredata # into a data.frame event_data <- as.data.frame( - zoo::coredata(event_data) + zoo::coredata( + event_data + ) ) # 1.3) Add the index into the data.frame @@ -83,28 +80,30 @@ event_data$color <- ifelse( event_data$event == 'Buy', yes = 'darkgrey', no = ifelse( - subset(event_data, event == 'Buy')$Close < subset(event_data, event == 'Sell')$Close, - yes = 'green', - no = 'red' + test = subset( + x = event_data, + event == 'Buy')$close < subset(x = event_data, event == 'Sell')$close, + yes = 'green', + no = 'red' ) ) # 1.6) modify the event to add # closing price at each event event_data$event <- paste0( - event_data$event, ' @', event_data$Close + event_data$event, ' @', event_data$close ) # 2) Chart the the klines # and add the buy and sell events -chart( - ticker = ATOM, - main = kline(), +cryptoQuotes::chart( + ticker = cryptoQuotes::ATOM, + main = cryptoQuotes::kline(), sub = list( - volume() + cryptoQuotes::volume() ), indicator = list( - bollinger_bands() + cryptoQuotes::bollinger_bands() ), event_data = event_data, options = list( @@ -121,6 +120,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -129,17 +129,37 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} -Other subcharts: +Other subchart indicators: \code{\link{fgi}()}, \code{\link{lsr}()}, \code{\link{macd}()}, \code{\link{rsi}()}, +\code{\link{smi}()}, \code{\link{volume}()} + +Other main chart indicators: +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{dema}()}, +\code{\link{donchian_channel}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{hma}()}, +\code{\link{sma}()}, +\code{\link{vwap}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} -\concept{subcharts} +\concept{main chart indicators} +\concept{subchart indicators} +\keyword{internal} diff --git a/man/alma.Rd b/man/alma.Rd index 12a3d694..9e786902 100644 --- a/man/alma.Rd +++ b/man/alma.Rd @@ -2,12 +2,19 @@ % Please edit documentation in R/chart_ma.R \name{alma} \alias{alma} -\title{Add Arnaud Legoux Moving Average to the chart} +\title{Add Arnaud Legoux Moving Average (ALMA) to the chart} \usage{ -alma(price = "close", n = 9, offset = 0.85, sigma = 6, internal = list(), ...) +alma( + price = "close", + n = 9, + offset = 0.85, + sigma = 6, + ... +) } \arguments{ -\item{price}{A \link{character}-vector of \link{length} 1. Close by default. The name of the vector to passed into \link[TTR:MovingAverages]{TTR::ALMA}} +\item{price}{A \link{character}-vector of \link{length} 1. "close" by default +The name of the vector to passed into \link[TTR:MovingAverages]{TTR::ALMA}.} \item{n}{Number of periods to average over. Must be between 1 and \code{nrow(x)}, inclusive.} @@ -16,62 +23,28 @@ alma(price = "close", n = 9, offset = 0.85, sigma = 6, internal = list(), ...) \item{sigma}{Standard deviation of the distribution.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} - -\item{...}{any other passthrough parameters} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. +A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that interacts with \link{TTR}'s moving average family of functions. +A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that +interacts with \link{TTR}'s moving average family of functions. +The function adds moving average indicators to the main \code{\link[=chart]{chart()}}. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), +cryptoQuotes::chart( + ticker = BTC, + main = kline(), indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE + cryptoQuotes::ema(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::wma(n = 21) ) ) @@ -83,6 +56,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -91,6 +65,7 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, @@ -102,8 +77,26 @@ Other moving average indicators: \code{\link{evwma}()}, \code{\link{hma}()}, \code{\link{sma}()}, +\code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} + +Other main chart indicators: +\code{\link{add_event}()}, +\code{\link{bollinger_bands}()}, +\code{\link{dema}()}, +\code{\link{donchian_channel}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{hma}()}, +\code{\link{sma}()}, +\code{\link{vwap}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} +\concept{main chart indicators} \concept{moving average indicators} diff --git a/man/assert.Rd b/man/assert.Rd index 6c1a4529..6405a6c1 100644 --- a/man/assert.Rd +++ b/man/assert.Rd @@ -7,8 +7,8 @@ assert(..., error_message = NULL) } \arguments{ -\item{...}{expressions >= 1. If named the names are used as error messages, otherwise -R's internal error-messages are thrown} +\item{...}{expressions >= 1. If named the names are used +as error messages, otherwise R's internal error-messages are thrown} \item{error_message}{character. An error message, supports \link{cli}-formatting.} } @@ -16,111 +16,87 @@ R's internal error-messages are thrown} \link{NULL} if all statements in ... are \link{TRUE} } \description{ -This function is a wrapper of \code{\link[=stopifnot]{stopifnot()}}, \code{\link[=tryCatch]{tryCatch()}} and \code{\link[cli:cli_abort]{cli::cli_abort()}} and asserts -the truthfulness of the passed expression(s). +This function is a wrapper of \code{\link[=stopifnot]{stopifnot()}}, \code{\link[=tryCatch]{tryCatch()}} and +\code{\link[cli:cli_abort]{cli::cli_abort()}} and asserts the truthfulness of the passed expression(s). } \examples{ -# script: Assert truthfullness -# of functions -# date: 2024-02-22 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Demonstrate the use of the error-function. This is -# mainly for contributers, and for my future self on how to use -# this function properly -# -# -# NOTE: As these are wrapped in try -# they are not properly formatted. -# script start; - - -# 1) unnamed assert -# expressions -foo <- function( +\dontrun{ + # script start; + + # 1) unnamed assert + # expressions + foo <- function( a, b) { - # assert without - # named expressions - cryptoQuotes:::assert( - is.numeric(a), - is.numeric(b) - ) + # assert without + # named expressions + cryptoQuotes:::assert( + is.numeric(a), + is.numeric(b) + ) - a + b + a + b -} + } -# 1.1) returns -# the regular R error -# messages in cli-format -try( + # 1.1) returns + # the regular R error + # messages in cli-format foo( a = "1", b = "2" ) -) - - -# 2) named assert -# expressions -foo <- function( + # 2) named assert + # expressions + foo <- function( a, b) { - cryptoQuotes:::assert( - "{.arg a} is not {.cls numeric}" = is.numeric(a), - "{.arg a} is not {.cls numeric}" = is.numeric(b) - ) - + cryptoQuotes:::assert( + "{.arg a} is not {.cls numeric}" = is.numeric(a), + "{.arg a} is not {.cls numeric}" = is.numeric(b) + ) - a + b + a + b -} + } -# 2.2) Returns -# custom error-messages -# in cli-format -try( + # 2.2) Returns + # custom error-messages + # in cli-format foo( a = "1", b = "2" ) -) - -# 3) custom error -# messages on -foo <- function( + # 3) custom error + # messages on + foo <- function( a) { - cryptoQuotes:::assert( - is.numeric(a), - error_message = sprintf( - fmt = "{.val \%s} is not a numeric value.", - a + cryptoQuotes:::assert( + is.numeric(a), + error_message = sprintf( + fmt = "{.val \%s} is not a numeric value.", + a + ) ) - ) - a + a -} + } -# 2.2) Returns -# custom error-messages with -# passed values in cli-format -try( + # 2.2) Returns + # custom error-messages with + # passed values in cli-format foo( a = "1" ) -) - - - - -# script end; + # script end; +} } \seealso{ \code{\link[=stopifnot]{stopifnot()}}, \code{\link[cli:cli_abort]{cli::cli_abort()}}, \code{\link[=tryCatch]{tryCatch()}} diff --git a/man/availableExchanges.Rd b/man/availableExchanges.Rd deleted file mode 100644 index f13c7a73..00000000 --- a/man/availableExchanges.Rd +++ /dev/null @@ -1,61 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/availableExchanges.R -\name{availableExchanges} -\alias{availableExchanges} -\title{Get available exchanges} -\usage{ -availableExchanges(type = "ohlc") -} -\arguments{ -\item{type}{\link{character}-vector of length 1. See details} -} -\value{ -An \code{\link[=invisible]{invisible()}} \link{character} vector containing available exchanges -} -\description{ -\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} - -Get a vector of all available exchanges passed into the source -argument of the get-functions. -} -\details{ -\subsection{Available types}{ -\itemize{ -\item ohlc: Open, High, Low, Close and Volume -\item lsratio: Long-Short ratio -\item fundingrate: Funding rates -\item interest: Open perpetual contracts on both sides -} -} - -\subsection{Limits}{ - -The endpoints supported by the \code{\link[=available_exchanges]{available_exchanges()}} are not uniform, -so exchanges available for, say, \code{\link[=get_lsratio]{get_lsratio()}} is not necessarily the same as those available for \code{\link[=get_quote]{get_quote()}} -} -} -\examples{ -# script: -# date: 2023-10-06 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: -# script start; - -## return all -## available exchanges -cryptoQuotes::available_exchanges() - -# script end; -} -\seealso{ -Other deprecated: -\code{\link{availableIntervals}()}, -\code{\link{availableTickers}()}, -\code{\link{getFGIndex}()}, -\code{\link{getLSRatio}()}, -\code{\link{getQuote}()} -} -\author{ -Serkan Korkmaz -} -\concept{deprecated} diff --git a/man/availableIntervals.Rd b/man/availableIntervals.Rd deleted file mode 100644 index 876b3149..00000000 --- a/man/availableIntervals.Rd +++ /dev/null @@ -1,75 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/availableIntervals.R -\name{availableIntervals} -\alias{availableIntervals} -\title{Get available intervals} -\usage{ -availableIntervals(source = "binance", type = "ohlc", futures = TRUE) -} -\arguments{ -\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} - -\item{type}{\link{character}-vector of length 1. See details} - -\item{futures}{A \link{logical}-vector of \link{length} 1. \link{TRUE} by default. Returns futures market if \link{TRUE}, spot market otherwise.} -} -\value{ -An \code{\link[=invisible]{invisible()}} \link{character} vector containing the available intervals on -the exchange, market and endpoint -} -\description{ -\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} -} -\details{ -\subsection{Available types}{ -\itemize{ -\item ohlc: Open, High, Low, Close and Volume -\item lsratio: Long-Short ratio -\item fundingrate: Funding rates -\item interest: Open perpetual contracts on both sides -} -} - -\subsection{Limits}{ - -The endpoints supported by the \code{\link[=available_exchanges]{available_exchanges()}} are not uniform, -so exchanges available for, say, \code{\link[=get_lsratio]{get_lsratio()}} is not necessarily the same as those available for \code{\link[=get_quote]{get_quote()}} -} -} -\examples{ -\dontrun{ - # script: - # date: 2023-10-06 - # author: Serkan Korkmaz, serkor1@duck.com - # objective: - # script start; - - # available intervals - # at kucoin futures market - cryptoQuotes::available_intervals( - source = 'kucoin', - futures = TRUE - ) - - # available intervals - # at kraken spot market - cryptoQuotes::available_intervals( - source = 'kraken', - futures = FALSE - ) - - # script end; -} -} -\seealso{ -Other deprecated: -\code{\link{availableExchanges}()}, -\code{\link{availableTickers}()}, -\code{\link{getFGIndex}()}, -\code{\link{getLSRatio}()}, -\code{\link{getQuote}()} -} -\author{ -Serkan Korkmaz -} -\concept{deprecated} diff --git a/man/availableTickers.Rd b/man/availableTickers.Rd deleted file mode 100644 index 49451558..00000000 --- a/man/availableTickers.Rd +++ /dev/null @@ -1,62 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/availableTickers.R -\name{availableTickers} -\alias{availableTickers} -\title{Get available cryptocurrency pairs} -\usage{ -availableTickers(source = "binance", futures = TRUE) -} -\arguments{ -\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} - -\item{futures}{A \link{logical}-vector of \link{length} 1. \link{TRUE} by default. Returns futures market if \link{TRUE}, spot market otherwise.} -} -\value{ -A \link{character}-vector of actively traded cryptocurrency pairs on the exchange, and the specified market. -} -\description{ -\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} - -This function returns all available -cryptocurrewncy pairs on the \link{available_exchanges} -} -\details{ -The naming-conventions across, and within, \code{\link[=available_exchanges]{available_exchanges()}} are not necessarily the same. This function lists -all actively traded tickers. -} -\examples{ -\dontrun{ - ## available tickers - ## in Binance spot market - head( - cryptoQuotes::available_tickers( - source = 'binance', - futures = FALSE - ) - ) - - ## available tickers - ## on Kraken futures market - head( - cryptoQuotes::available_tickers( - source = 'kraken', - futures = TRUE - ) - ) -} - - - -} -\seealso{ -Other deprecated: -\code{\link{availableExchanges}()}, -\code{\link{availableIntervals}()}, -\code{\link{getFGIndex}()}, -\code{\link{getLSRatio}()}, -\code{\link{getQuote}()} -} -\author{ -Serkan Korkmaz -} -\concept{deprecated} diff --git a/man/available_exchanges.Rd b/man/available_exchanges.Rd index 61aacd2c..8e4ebd97 100644 --- a/man/available_exchanges.Rd +++ b/man/available_exchanges.Rd @@ -4,50 +4,51 @@ \alias{available_exchanges} \title{Get available exchanges} \usage{ -## available exchanges -## by type available_exchanges( type = "ohlc" ) } \arguments{ -\item{type}{\link{character}-vector of length 1. See details} +\item{type}{\link{character}-vector of \link{length} 1. One of, +\itemize{ +\item \code{"ohlc"} - Available exchanges for Open, High, Low, Close and +Volume market data. See the \code{\link[=get_quote]{get_quote()}}-function. +\item \code{"lsratio"} - Available exchanges for Long-Short ratios. +See the \code{\link[=get_lsratio]{get_lsratio()}}-function. +\item \code{"fundingrate"} - Available exchanges for Funding rates. +See the \code{\link[=get_fundingrate]{get_fundingrate()}}-function. +\item \code{"interest"} - Available exchanges for Open interest on perpetual +contracts on both sides. See the \code{\link[=get_openinterest]{get_openinterest()}}-function. +}} } \value{ -An \code{\link[=invisible]{invisible()}} \link{character} vector containing available exchanges +An \code{\link[=invisible]{invisible()}} \link{character}-vector containing available exchanges } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#stable}{\figure{lifecycle-stable.svg}{options: alt='[Stable]'}}}{\strong{[Stable]}} -Get a vector of all available exchanges passed into the source +Get a \link{vector} of all available exchanges passed into the \code{source} argument of the get-functions. } \details{ -\subsection{Available types}{ -\itemize{ -\item ohlc: Open, High, Low, Close and Volume -\item lsratio: Long-Short ratio -\item fundingrate: Funding rates -\item interest: Open perpetual contracts on both sides -} -} - -\subsection{Limits}{ - The endpoints supported by the \code{\link[=available_exchanges]{available_exchanges()}} are not uniform, -so exchanges available for, say, \code{\link[=get_lsratio]{get_lsratio()}} is not necessarily the same as those available for \code{\link[=get_quote]{get_quote()}} -} +so exchanges available for, say, \code{\link[=get_lsratio]{get_lsratio()}} is not necessarily +the same as those available for \code{\link[=get_quote]{get_quote()}} } \examples{ -# script: -# date: 2023-10-06 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: # script start; -## return all -## available exchanges -cryptoQuotes::available_exchanges() +# 1) available exchanges +# on ohlc-v endpoint +cryptoQuotes::available_exchanges( + type = "ohlc" + ) + +# 2) available exchanges +# on long-short ratios +cryptoQuotes::available_exchanges( + type = "lsratio" +) # script end; } diff --git a/man/available_intervals.Rd b/man/available_intervals.Rd index 97c23b4a..26858f58 100644 --- a/man/available_intervals.Rd +++ b/man/available_intervals.Rd @@ -4,60 +4,71 @@ \alias{available_intervals} \title{Get available intervals} \usage{ -available_intervals(source = "binance", type = "ohlc", futures = TRUE) +available_intervals( + source = "binance", + type = "ohlc", + futures = TRUE +) } \arguments{ -\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} +\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. +See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} -\item{type}{\link{character}-vector of length 1. See details} +\item{type}{\link{character}-vector of \link{length} 1. One of, +\itemize{ +\item \code{"ohlc"} - Available exchanges for Open, High, Low, Close and +Volume market data. See the \code{\link[=get_quote]{get_quote()}}-function. +\item \code{"lsratio"} - Available exchanges for Long-Short ratios. +See the \code{\link[=get_lsratio]{get_lsratio()}}-function. +\item \code{"fundingrate"} - Available exchanges for Funding rates. +See the \code{\link[=get_fundingrate]{get_fundingrate()}}-function. +\item \code{"interest"} - Available exchanges for Open interest on perpetual +contracts on both sides. See the \code{\link[=get_openinterest]{get_openinterest()}}-function. +}} -\item{futures}{A \link{logical}-vector of \link{length} 1. \link{TRUE} by default. Returns futures market if \link{TRUE}, spot market otherwise.} +\item{futures}{A \link{logical}-vector of \link{length} 1. \link{TRUE} by default. +Returns futures market if \link{TRUE}, spot market otherwise.} } \value{ -An \code{\link[=invisible]{invisible()}} \link{character} vector containing the available intervals on -the exchange, market and endpoint +An \code{\link[=invisible]{invisible()}} \link{character}-vector containing the available intervals on +the exchange, market and endpoint. + +\strong{Sample output} + +\if{html}{\out{
}}\preformatted{#> i Available Intervals at "bybit" (futures): +#> v 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 12h, 1d, 1M, 1w +#> [1] "1m" "3m" "5m" "15m" "30m" "1h" +}\if{html}{\out{
}} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#stable}{\figure{lifecycle-stable.svg}{options: alt='[Stable]'}}}{\strong{[Stable]}} -Get available intervals for the \code{\link[=available_tickers]{available_tickers()}} on the \code{\link[=available_exchanges]{available_exchanges()}}. +Get available intervals for the \code{\link[=available_tickers]{available_tickers()}} +on the \code{\link[=available_exchanges]{available_exchanges()}}. } \details{ -\subsection{Available types}{ -\itemize{ -\item ohlc: Open, High, Low, Close and Volume -\item lsratio: Long-Short ratio -\item fundingrate: Funding rates -\item interest: Open perpetual contracts on both sides -} -} - -\subsection{Limits}{ - The endpoints supported by the \code{\link[=available_exchanges]{available_exchanges()}} are not uniform, -so exchanges available for, say, \code{\link[=get_lsratio]{get_lsratio()}} is not necessarily the same as those available for \code{\link[=get_quote]{get_quote()}} -} +so exchanges available for, say, \code{\link[=get_lsratio]{get_lsratio()}} is not necessarily +the same as those available for \code{\link[=get_quote]{get_quote()}} } \examples{ \dontrun{ - # script: - # date: 2023-10-06 - # author: Serkan Korkmaz, serkor1@duck.com - # objective: # script start; # available intervals # at kucoin futures market cryptoQuotes::available_intervals( - source = 'kucoin', - futures = TRUE + source = 'kucoin', + futures = TRUE, + type = "ohlc" ) # available intervals # at kraken spot market cryptoQuotes::available_intervals( - source = 'kraken', - futures = FALSE + source = 'kraken', + futures = FALSE, + type = "ohlc" ) # script end; diff --git a/man/available_tickers.Rd b/man/available_tickers.Rd index 791e9575..03197e3e 100644 --- a/man/available_tickers.Rd +++ b/man/available_tickers.Rd @@ -2,43 +2,52 @@ % Please edit documentation in R/available_tickers.R \name{available_tickers} \alias{available_tickers} -\title{Get available cryptocurrency pairs} +\title{Get actively traded cryptocurrency pairs} \usage{ available_tickers(source = "binance", futures = TRUE) } \arguments{ -\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} +\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. +See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} -\item{futures}{A \link{logical}-vector of \link{length} 1. \link{TRUE} by default. Returns futures market if \link{TRUE}, spot market otherwise.} +\item{futures}{A \link{logical}-vector of \link{length} 1. \link{TRUE} by default. +Returns futures market if \link{TRUE}, spot market otherwise.} } \value{ -A \link{character}-vector of actively traded cryptocurrency pairs on the exchange, and the specified market. +A \link{character}-vector of actively traded cryptocurrency pairs on the exchange, +and the specified market. + +\strong{Sample output} + +\if{html}{\out{
}}\preformatted{#> [1] "10000000AIDOGEUSDT" "1000000MOGUSDT" "10000COQUSDT" +#> [4] "10000LADYSUSDT" "10000NFTUSDT" "10000SATSUSDT" +}\if{html}{\out{
}} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#stable}{\figure{lifecycle-stable.svg}{options: alt='[Stable]'}}}{\strong{[Stable]}} -Get available cryptocurrency pairs +Get actively traded cryptocurrency pairs on the \code{\link[=available_exchanges]{available_exchanges()}}. } \details{ -The naming-conventions across, and within, \code{\link[=available_exchanges]{available_exchanges()}} are not necessarily the same. This function lists -all actively traded tickers. +The naming-conventions across, and within, \code{\link[=available_exchanges]{available_exchanges()}} are not +necessarily the same. This function lists all actively traded tickers. } \examples{ \dontrun{ - ## available tickers - ## in Binance spot market + # 1) available tickers + # in Binance spot market head( cryptoQuotes::available_tickers( - source = 'binance', + source = 'binance', futures = FALSE ) ) - ## available tickers - ## on Kraken futures market + # 2) available tickers + # on Kraken futures market head( cryptoQuotes::available_tickers( - source = 'kraken', + source = 'kraken', futures = TRUE ) ) diff --git a/man/bollinger_bands.Rd b/man/bollinger_bands.Rd index 2b5593c7..29d5dbb8 100644 --- a/man/bollinger_bands.Rd +++ b/man/bollinger_bands.Rd @@ -5,7 +5,13 @@ \title{Add Bollinger Bands to the chart} \usage{ -bollinger_bands(n = 20, sd = 2, maType = "SMA", internal = list(), ...) +bollinger_bands( + n = 20, + sd = 2, + maType = "SMA", + color = '#4682b4', + ... +) } \arguments{ \item{n}{Number of periods for moving average.} @@ -14,63 +20,31 @@ bollinger_bands(n = 20, sd = 2, maType = "SMA", internal = list(), ...) \item{maType}{A function or a string naming the function to be called.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} +\item{color}{A \link{character}-vector of \link{length} 1. "#4682b4" by default.} \item{...}{Other arguments to be passed to the \code{maType} function.} } \value{ -Invisbly returns a plotly object. +An \link{invisible} \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -Bollinger Bands provide a visual representation of price volatility and are widely used by traders -and investors to assess potential price reversals and trade opportunities in various financial markets, including stocks, forex, and commodities. +A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that interacts +with the \code{\link[TTR:bollingerBands]{TTR::BBands()}}-function. The function adds bollinger bands +to the main \code{\link[=chart]{chart()}}. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), - indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE +# Charting BTC using +# candlesticks as main +# chart +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::kline(), + sub = list( + cryptoQuotes::volume() ) ) @@ -82,6 +56,7 @@ Other chart indicators: \code{\link{alma}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -90,9 +65,27 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} + +Other main chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{dema}()}, +\code{\link{donchian_channel}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{hma}()}, +\code{\link{sma}()}, +\code{\link{vwap}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} +\concept{main chart indicators} diff --git a/man/calibrate_window.Rd b/man/calibrate_window.Rd index af4118e0..74392426 100644 --- a/man/calibrate_window.Rd +++ b/man/calibrate_window.Rd @@ -24,19 +24,8 @@ This function is a high-level wrapper of \link{do.call} and \link{lapply} which modifies each xts object stored in a \code{\link[=list]{list()}}. } \examples{ -# script: scr_FUN -# date: 2023-12-27 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Demonstrate the use of the convinience -# funtions # script start; -# by default the Fear and Greed Index -# is given daily. So to align these values -# with, say, weekly candles it has to be aggregated -# -# In this example the built-in data are used - # 1) check index of BTCUSDT and # the Fear and Greed Index setequal( @@ -47,8 +36,8 @@ setequal( # 2) to align the indices, # we use the convincience functions # by splitting the FGI by the BTC index. -FGIndex <- split_window( - xts = FGIndex, +FGIndex <- cryptoQuotes::split_window( + xts = cryptoQuotes::FGIndex, by = zoo::index(BTC), # Remove upper bounds of the @@ -64,7 +53,7 @@ FGIndex <- split_window( # 3) as splitWindow returns a list # it needs to passed into calibrateWindow # to ensure comparability -FGIndex <- calibrate_window( +FGIndex <- cryptoQuotes::calibrate_window( list = FGIndex, # As each element in the list can include @@ -79,22 +68,19 @@ FGIndex <- calibrate_window( # 3) check if candles aligns # accordingly -setequal( - zoo::index(BTC), - zoo::index(FGIndex) +stopifnot( + setequal( + zoo::index(BTC), + zoo::index(FGIndex) + ) ) -# As the dates are now aligned -# and the Fear and Greed Index being summarised by -# the first value, the Fear and Greed Index is the opening -# Fear and Greed Index value, at each candle. - # script end; } \seealso{ -Other convinience: +Other utility: \code{\link{remove_bound}()}, \code{\link{split_window}()} } -\concept{convinience} +\concept{utility} diff --git a/man/chart.Rd b/man/chart.Rd index fffc2157..0625b19f 100644 --- a/man/chart.Rd +++ b/man/chart.Rd @@ -2,92 +2,96 @@ % Please edit documentation in R/chart.R \name{chart} \alias{chart} -\title{Build interactive financial charts} +\title{Build an interactive financial chart} \usage{ chart( ticker, - main = kline(), - sub = list(volume()), - indicator = list(bollinger_bands()), + main = list(kline()), + sub = list(), + indicator = list(), event_data = NULL, options = list() ) } \arguments{ -\item{ticker}{A \code{\link[xts:xts]{xts::xts()}}-object with Open, High, Low, Close and Volume columns.} +\item{ticker}{An object with Open, High, Low, Close and Volume columns that +can be coerced to a \code{\link[xts:xts]{xts::xts()}}-object.} -\item{main}{A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. \code{\link[=kline]{kline()}} by default.} +\item{main}{A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-function. \code{\link[=kline]{kline()}} by default.} -\item{sub}{An optional \link{list} of \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object(s) wrapped in \code{\link[rlang:expr]{rlang::expr()}}.} +\item{sub}{An optional \link{list} of \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-function(s).} -\item{indicator}{An optional \link{list} of \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object(s) wrapped in \code{\link[rlang:expr]{rlang::expr()}}.} +\item{indicator}{An optional \link{list} of \code{\link[plotly:add_trace]{plotly::add_lines()}}-function(s).} -\item{event_data}{An optional \link{data.frame} with event line(s) to be added to the \code{\link[=chart]{chart()}}. See \code{\link[=add_event]{add_event()}} for more details.} +\item{event_data}{An optional \link{data.frame} with event line(s) to be added +to the \code{\link[=chart]{chart()}}. See \code{\link[=add_event]{add_event()}} for more details.} \item{options}{An optional \link{list} of \code{\link[=chart]{chart()}}-options. See details below.} } \value{ -Returns a \code{\link[plotly:plot_ly]{plotly::plot_ly()}} object. +A \code{\link[plotly:plot_ly]{plotly::plot_ly()}} object. + +\strong{Sample Output} +\if{html}{ + \out{}\figure{README-chartquote-1.png}{options: style="width:750px;max-width:75\%;"}\out{} +} +\if{latex}{ + \out{\begin{center}}\figure{README-chartquote-1.png}\out{\end{center}} +} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -\code{\link[=chart]{chart()}} creates interactive financial charts using \code{\link[plotly:plot_ly]{plotly::plot_ly()}} as backend. It's a high-level function which collects -and structures the passed chart elements. +A high-level \code{\link[plotly:plot_ly]{plotly::plot_ly()}}- and \code{\link[plotly:subplot]{plotly::subplot()}}-wrapper function +for building interactive financial charts using +the affiliated \link{chart}-functions. The \link{chart} consists of a main chart, and +an optional subchart. The main chart supports overlaying various trading +indicators like \link{sma} and \link{bollinger_bands}. } \details{ \subsection{Options}{ \itemize{ -\item \code{dark} A \link{logical}-value of \link{length} 1. \link{TRUE} by default. Sets the overall theme of the \code{\link[=chart]{chart()}} -\item \code{slider} A \link{logical}-value of \link{length} 1. \link{FALSE} by default. If \link{TRUE}, a \code{\link[plotly:rangeslider]{plotly::rangeslider()}} is added. -\item \code{deficiency} A \link{logical}-value of \link{length} 1. \link{FALSE} by default. If \link{TRUE}, all \code{\link[=chart]{chart()}}-elements are colorblind friendly -\item \code{size} A \link{numeric}-value of \link{length} 1. The relative size of the main chart. 0.6 by default. Must be between 0 and 1, non-inclusive. +\item \code{dark} A <\link{logical}>-value of \link{length} 1. \link{TRUE} by default. +Sets the overall theme of the \code{\link[=chart]{chart()}} +\item \code{slider} A <\link{logical}>-value of \link{length} 1. \link{FALSE} by default. +If \link{TRUE}, a \code{\link[plotly:rangeslider]{plotly::rangeslider()}} is added +\item \code{deficiency} A <\link{logical}>-value of \link{length} 1. \link{FALSE} by default. +If \link{TRUE}, all \code{\link[=chart]{chart()}}-elements are colorblind friendly +\item \code{size} A <\link{numeric}>-value of \link{length} 1. The relative size of the +main chart. 0.6 by default. Must be between 0 and 1, non-inclusive } } + +\subsection{Charting Events}{ + +If \code{event_data} is passed, vertical eventlines with appropriate labels and +coloring are added to the \code{\link[=chart]{chart()}}. +This function is rigid, as it will fail if event, label and +index columns are not passed. + +For more details please see \code{\link[=add_event]{add_event()}}. +} } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( +# 1) charting weekly +# BTC using candlesticks +# and indicators +cryptoQuotes::chart( ticker = BTC, - main = macd(), + main = cryptoQuotes::kline(), sub = list( - volume(), - kline() + cryptoQuotes::volume(), + cryptoQuotes::macd() ), indicator = list( - bollinger_bands(), - sma() + cryptoQuotes::bollinger_bands(), + cryptoQuotes::sma(), + cryptoQuotes::alma() ), options = list( - dark = TRUE, + dark = TRUE, deficiency = FALSE ) ) @@ -95,11 +99,12 @@ chart( # script end; } \seealso{ -Other chart indicators: +Other chart indicators: \code{\link{add_event}()}, \code{\link{alma}()}, \code{\link{bollinger_bands}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -108,14 +113,16 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} -Other price charts: +Other price charts: \code{\link{kline}()}, -\code{\link{ohlc}()} +\code{\link{ohlc}()}, +\code{\link{pline}()} } \author{ Serkan Korkmaz diff --git a/man/chart_layout.Rd b/man/chart_layout.Rd new file mode 100644 index 00000000..ef8b9792 --- /dev/null +++ b/man/chart_layout.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/helper.R +\name{chart_layout} +\alias{chart_layout} +\title{Create a list of layout elements on subcharts} +\usage{ +chart_layout(x, layout_element, layout_attribute) +} +\arguments{ +\item{x}{\link{integer}-vector of \link{length} 1.} + +\item{layout_element}{\link{character}-vector of \link{length} 1. +\link[plotly:layout]{plotly::layout} elements. See example.} + +\item{layout_attribute}{\link{character}-vector of \link{length} 1. +\link[plotly:layout]{plotly::layout} element value. See example.} +} +\value{ +A \link{list} of layout elements. +} +\description{ +Create a list of layout elements on subcharts +} +\examples{ +\dontrun{ +chart_layout( + x = 1:plot_list_length, + layout_element = "yaxis", + layout_attribute = list( + gridcolor = if (dark) "#40454c" else '#D3D3D3' # Was CCCCCC + ) +) +} + + +} +\seealso{ +Other development tools: +\code{\link{GET}()}, +\code{\link{convert_date}()}, +\code{\link{default_dates}()}, +\code{\link{fetch}()}, +\code{\link{flatten}()}, +\code{\link{is.date}()} +} +\concept{development tools} +\keyword{internal} diff --git a/man/convert_date.Rd b/man/convert_date.Rd index 69f7e3fe..5c90ef28 100644 --- a/man/convert_date.Rd +++ b/man/convert_date.Rd @@ -25,6 +25,7 @@ that its a return value \seealso{ Other development tools: \code{\link{GET}()}, +\code{\link{chart_layout}()}, \code{\link{default_dates}()}, \code{\link{fetch}()}, \code{\link{flatten}()}, diff --git a/man/default_dates.Rd b/man/default_dates.Rd index e3e89cdc..0979b9d0 100644 --- a/man/default_dates.Rd +++ b/man/default_dates.Rd @@ -7,13 +7,17 @@ default_dates(interval, from = NULL, to = NULL, length = 200, limit = NULL) } \arguments{ -\item{interval}{A \link{character}-vector of \link{length} 1. \verb{1d} by default. See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} +\item{interval}{A \link{character}-vector of \link{length} 1. \verb{1d} by default. +See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} -\item{from}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{from}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} -\item{to}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{to}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} -\item{length}{a \link{numeric}-value of \link{length} 1. The desired distance between \code{from} and \code{to}.} +\item{length}{a \link{numeric}-value of \link{length} 1. +The desired distance between \code{from} and \code{to}.} } \value{ A vector of minimum and maximum dates. @@ -28,6 +32,7 @@ compliance on the limits \seealso{ Other development tools: \code{\link{GET}()}, +\code{\link{chart_layout}()}, \code{\link{convert_date}()}, \code{\link{fetch}()}, \code{\link{flatten}()}, diff --git a/man/dema.Rd b/man/dema.Rd index 4f351804..f15aef88 100644 --- a/man/dema.Rd +++ b/man/dema.Rd @@ -2,19 +2,20 @@ % Please edit documentation in R/chart_ma.R \name{dema} \alias{dema} -\title{Add Double Exponential Moving Average to the chart} +\title{Add Double Exponential Moving Average (DEMA) to the chart} \usage{ dema( - price = "close", - n = 10, - v = 1, - wilder = FALSE, - ratio = NULL, - internal = list() + price = "close", + n = 10, + v = 1, + wilder = FALSE, + ratio = NULL, + ... ) } \arguments{ -\item{price}{A \link{character}-vector of \link{length} 1. Close by default. The name of the vector to passed into \link[TTR:MovingAverages]{TTR::DEMA}} +\item{price}{A \link{character}-vector of \link{length} 1. "close" by default. +The name of the vector to passed into \link[TTR:MovingAverages]{TTR::DEMA}.} \item{n}{Number of periods to average over. Must be between 1 and \code{nrow(x)}, inclusive.} @@ -27,60 +28,28 @@ calculated; see notes.} \item{ratio}{A smoothing/decay ratio. \code{ratio} overrides \code{wilder} in \code{EMA}.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. +A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that interacts with \link{TTR}'s moving average family of functions. +A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that +interacts with \link{TTR}'s moving average family of functions. +The function adds moving average indicators to the main \code{\link[=chart]{chart()}}. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), +cryptoQuotes::chart( + ticker = BTC, + main = kline(), indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), - indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE + cryptoQuotes::ema(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::wma(n = 21) ) ) @@ -92,6 +61,7 @@ Other chart indicators: \code{\link{alma}()}, \code{\link{bollinger_bands}()}, \code{\link{chart}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -100,6 +70,7 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, @@ -111,8 +82,26 @@ Other moving average indicators: \code{\link{evwma}()}, \code{\link{hma}()}, \code{\link{sma}()}, +\code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} + +Other main chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{donchian_channel}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{hma}()}, +\code{\link{sma}()}, +\code{\link{vwap}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} +\concept{main chart indicators} \concept{moving average indicators} diff --git a/man/donchian_channel.Rd b/man/donchian_channel.Rd new file mode 100644 index 00000000..fcb1929f --- /dev/null +++ b/man/donchian_channel.Rd @@ -0,0 +1,90 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chart_donchian.R +\name{donchian_channel} +\alias{donchian_channel} +\title{Add Donchian Channels +to the chart} +\usage{ +donchian_channel( + n = 10, + include.lag = FALSE, + color = '#4682b4', + ... +) +} +\arguments{ +\item{n}{Number of periods for moving average.} + +\item{include.lag}{Should values be lagged so that today's prices are not +included in the calculation? See Note.} + +\item{color}{A \link{character}-vector of \link{length} 1. "#4682b4" by default.} + +\item{...}{For internal use. Please ignore.} +} +\value{ +An \link{invisible} \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object. +} +\description{ +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} + +A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that interacts +with the \code{\link[TTR:DonchianChannel]{TTR::DonchianChannel()}}-function. +The function adds Donchian Channels +to the main \code{\link[=chart]{chart()}}. +} +\examples{ +# script start; + +# Charting BTC using +# candlesticks as main +# chart +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::kline(), + sub = list( + cryptoQuotes::volume() + ) +) + +# script end; +} +\seealso{ +Other chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{chart}()}, +\code{\link{dema}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{fgi}()}, +\code{\link{hma}()}, +\code{\link{lsr}()}, +\code{\link{macd}()}, +\code{\link{rsi}()}, +\code{\link{sma}()}, +\code{\link{smi}()}, +\code{\link{volume}()}, +\code{\link{vwap}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} + +Other main chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{dema}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{hma}()}, +\code{\link{sma}()}, +\code{\link{vwap}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} +} +\author{ +Serkan Korkmaz +} +\concept{chart indicators} +\concept{main chart indicators} diff --git a/man/ema.Rd b/man/ema.Rd index 2ca720db..b72b2a88 100644 --- a/man/ema.Rd +++ b/man/ema.Rd @@ -2,19 +2,19 @@ % Please edit documentation in R/chart_ma.R \name{ema} \alias{ema} -\title{Add Exponentially Weighted Moving Average to the charts} +\title{Add Exponentially-Weighted Moving Average (EMA) to the chart} \usage{ ema( - price = "Close", - n = 10, - wilder = FALSE, - ratio = NULL, - internal = list(), - ... + price = "close", + n = 10, + wilder = FALSE, + ratio = NULL, + ... ) } \arguments{ -\item{price}{A \link{character}-vector of \link{length} 1. Close by default. The name of the vector to passed into \link[TTR:MovingAverages]{TTR::EMA}} +\item{price}{A \link{character}-vector of \link{length} 1. "close" by default. +The name of the vector to passed into \link[TTR:MovingAverages]{TTR::EMA}.} \item{n}{Number of periods to average over. Must be between 1 and \code{nrow(x)}, inclusive.} @@ -25,62 +25,28 @@ calculated; see notes.} \item{ratio}{A smoothing/decay ratio. \code{ratio} overrides \code{wilder} in \code{EMA}.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} - -\item{...}{any other passthrough parameters} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. +A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that interacts with \link{TTR}'s moving average family of functions. +A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that +interacts with \link{TTR}'s moving average family of functions. +The function adds moving average indicators to the main \code{\link[=chart]{chart()}}. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), +cryptoQuotes::chart( + ticker = BTC, + main = kline(), indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE + cryptoQuotes::ema(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::wma(n = 21) ) ) @@ -93,6 +59,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, \code{\link{hma}()}, @@ -100,6 +67,7 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, @@ -111,8 +79,26 @@ Other moving average indicators: \code{\link{evwma}()}, \code{\link{hma}()}, \code{\link{sma}()}, +\code{\link{vwap}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} + +Other main chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{dema}()}, +\code{\link{donchian_channel}()}, +\code{\link{evwma}()}, +\code{\link{hma}()}, +\code{\link{sma}()}, +\code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} } +\author{ +Serkan Korkmaz +} \concept{chart indicators} +\concept{main chart indicators} \concept{moving average indicators} diff --git a/man/evwma.Rd b/man/evwma.Rd index f8ef2f3e..cdfbcd98 100644 --- a/man/evwma.Rd +++ b/man/evwma.Rd @@ -2,72 +2,43 @@ % Please edit documentation in R/chart_ma.R \name{evwma} \alias{evwma} -\title{Add Elastic Volume-weighted Moving Average to the chart} +\title{Add Elastic Volume-Weighted Moving Average (EVWMA) to the chart} \usage{ -evwma(price = "Close", n = 10, internal = list(), ...) +evwma( + price = "close", + n = 10, + ... +) } \arguments{ -\item{price}{A \link{character}-vector of \link{length} 1. Close by default. The name of the vector to passed into \link[TTR:MovingAverages]{TTR::EVWMA}} +\item{price}{A \link{character}-vector of \link{length} 1. "close" by default. +The name of the vector to passed into \link[TTR:MovingAverages]{TTR::EVWMA}} \item{n}{Number of periods to average over. Must be between 1 and \code{nrow(x)}, inclusive.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} - -\item{...}{any other passthrough parameters} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. +A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that interacts with \link{TTR}'s moving average family of functions. +A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that +interacts with \link{TTR}'s moving average family of functions. +The function adds moving average indicators to the main \code{\link[=chart]{chart()}}. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), +cryptoQuotes::chart( + ticker = BTC, + main = kline(), indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE + cryptoQuotes::ema(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::wma(n = 21) ) ) @@ -80,6 +51,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{fgi}()}, \code{\link{hma}()}, @@ -87,6 +59,7 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, @@ -98,8 +71,26 @@ Other moving average indicators: \code{\link{ema}()}, \code{\link{hma}()}, \code{\link{sma}()}, +\code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} + +Other main chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{dema}()}, +\code{\link{donchian_channel}()}, +\code{\link{ema}()}, +\code{\link{hma}()}, +\code{\link{sma}()}, +\code{\link{vwap}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} +\concept{main chart indicators} \concept{moving average indicators} diff --git a/man/examples/devtools_flatten.R b/man/examples/devtools_flatten.R index 5bd6e753..34928576 100644 --- a/man/examples/devtools_flatten.R +++ b/man/examples/devtools_flatten.R @@ -1,8 +1,3 @@ -# script: flattten -# date: 2024-03-03 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Give an example -# of the flatten-function # script start; # 1) create a nested list @@ -20,5 +15,4 @@ cryptoQuotes:::flatten( nested_list ) - # script end; diff --git a/man/examples/scr_FGIndex.R b/man/examples/scr_FGIndex.R index 74afba10..09843b6e 100644 --- a/man/examples/scr_FGIndex.R +++ b/man/examples/scr_FGIndex.R @@ -1,9 +1,4 @@ \dontrun{ - # script: Fear and Greed Index - # date: 2023-12-26 - # author: Serkan Korkmaz, serkor1@duck.com - # objective: Retrieve and Plot the - # index # script start; # 1) get the fear and greed index diff --git a/man/examples/scr_FUN.R b/man/examples/scr_FUN.R index d7842089..773371f0 100644 --- a/man/examples/scr_FUN.R +++ b/man/examples/scr_FUN.R @@ -1,16 +1,5 @@ -# script: scr_FUN -# date: 2023-12-27 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Demonstrate the use of the convinience -# funtions # script start; -# by default the Fear and Greed Index -# is given daily. So to align these values -# with, say, weekly candles it has to be aggregated -# -# In this example the built-in data are used - # 1) check index of BTCUSDT and # the Fear and Greed Index setequal( @@ -21,8 +10,8 @@ setequal( # 2) to align the indices, # we use the convincience functions # by splitting the FGI by the BTC index. -FGIndex <- split_window( - xts = FGIndex, +FGIndex <- cryptoQuotes::split_window( + xts = cryptoQuotes::FGIndex, by = zoo::index(BTC), # Remove upper bounds of the @@ -38,7 +27,7 @@ FGIndex <- split_window( # 3) as splitWindow returns a list # it needs to passed into calibrateWindow # to ensure comparability -FGIndex <- calibrate_window( +FGIndex <- cryptoQuotes::calibrate_window( list = FGIndex, # As each element in the list can include @@ -53,15 +42,12 @@ FGIndex <- calibrate_window( # 3) check if candles aligns # accordingly -setequal( - zoo::index(BTC), - zoo::index(FGIndex) +stopifnot( + setequal( + zoo::index(BTC), + zoo::index(FGIndex) + ) ) -# As the dates are now aligned -# and the Fear and Greed Index being summarised by -# the first value, the Fear and Greed Index is the opening -# Fear and Greed Index value, at each candle. - # script end; diff --git a/man/examples/scr_GET.R b/man/examples/scr_GET.R index de18230a..4a1b3730 100644 --- a/man/examples/scr_GET.R +++ b/man/examples/scr_GET.R @@ -1,31 +1,25 @@ -# script: scr_GET -# date: 2024-02-28 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: An example on how to use the GET-function -# mostly for internal purposes -# script start; - \dontrun{ + # script start; + exchange <- "bybit" futures <- FALSE - # 1) define baseUrl - # and endoint + # 1) define baseurl base_url <- cryptoQuotes:::baseUrl( - source = exchange, + source = exchange, futures = futures ) + # 2) define endpoint end_point <- cryptoQuotes:::endPoint( source = "bybit", futures = futures, - type = "ohlc" + type = "ohlc" ) - - # 2) define parameters - # that are passed into - # GET + # 2) define actual + # parameters based on + # API docs queries <- list( symbol = "BTCUSDT", category = "spot", @@ -33,13 +27,12 @@ interval = "D" ) - # 3) perform GET request - GET( + cryptoQuotes:::GET( url = base_url, endpoint = end_point, query = queries ) -} -# script end; + # script end; +} diff --git a/man/examples/scr_LSR.R b/man/examples/scr_LSR.R index f4c3fe86..ab3dd6ab 100644 --- a/man/examples/scr_LSR.R +++ b/man/examples/scr_LSR.R @@ -1,45 +1,13 @@ \dontrun{ - # Example on loading - # long-short ratio - # for the last days - # on the 15 minute candle - # wrapped in try to avoid - # failure on Github + # script start; - # 1) long-short ratio - # on BTCUSDT pair - ls_ratio <- cryptoQuotes::get_lsratio( - ticker = 'BTCUSDT', + LS_BTC <- cryptoQuotes::get_lsratio( + ticker = 'BTCUSDT', interval = '15m', - from = Sys.Date() - 1, - to = Sys.Date() + from = Sys.Date() - 1, + to = Sys.Date() ) - # 2) BTCSDT in same period - # as the long-short ratio; - BTC <- cryptoQuotes::get_quote( - ticker = 'BTCUSDT', - futures = TRUE, - interval = '15m', - from = Sys.Date() - 1, - to = Sys.Date() - ) - - # 3) plot BTCUSDT-pair - # with long-short ratio - cryptoQuotes::chart( - ticker = BTC, - main = cryptoQuotes::kline(), - sub = list( - cryptoQuotes::lsr(ratio = ls_ratio), - cryptoQuotes::volume() - ), - indicator = list( - cryptoQuotes::bollinger_bands() - ) - ) + # end of scrtipt; } - - -# end of scrtipt; diff --git a/man/examples/scr_MAindicator.R b/man/examples/scr_MAindicator.R new file mode 100644 index 00000000..47c2b989 --- /dev/null +++ b/man/examples/scr_MAindicator.R @@ -0,0 +1,13 @@ +# script start; + +cryptoQuotes::chart( + ticker = BTC, + main = kline(), + indicator = list( + cryptoQuotes::ema(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::wma(n = 21) + ) +) + +# script end; diff --git a/man/examples/scr_addEvents.R b/man/examples/scr_addEvents.R index a0deaa29..6f02c3a2 100644 --- a/man/examples/scr_addEvents.R +++ b/man/examples/scr_addEvents.R @@ -1,13 +1,5 @@ -# script: scr_addEvents -# date: 2023-12-07 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Describe the usage -# of addEvents # script start; -# laod library -library(cryptoQuotes) - # 1) Generate random events # of buys and sells and convert # to data.frame @@ -16,8 +8,11 @@ library(cryptoQuotes) # but only base R is shown here to avoid # too many dependencies set.seed(1903) -event_data <- ATOM[ - sample(1:nrow(ATOM), size = 2) +event_data <- cryptoQuotes::ATOM[ + sample( + x = 1:nrow(cryptoQuotes::ATOM), + size = 2 + ) ] # 1.1) Extract the index @@ -29,7 +24,9 @@ index <- zoo::index( # 1.2) Convert the coredata # into a data.frame event_data <- as.data.frame( - zoo::coredata(event_data) + zoo::coredata( + event_data + ) ) # 1.3) Add the index into the data.frame @@ -51,28 +48,30 @@ event_data$color <- ifelse( event_data$event == 'Buy', yes = 'darkgrey', no = ifelse( - subset(event_data, event == 'Buy')$Close < subset(event_data, event == 'Sell')$Close, - yes = 'green', - no = 'red' + test = subset( + x = event_data, + event == 'Buy')$close < subset(x = event_data, event == 'Sell')$close, + yes = 'green', + no = 'red' ) ) # 1.6) modify the event to add # closing price at each event event_data$event <- paste0( - event_data$event, ' @', event_data$Close + event_data$event, ' @', event_data$close ) # 2) Chart the the klines # and add the buy and sell events -chart( - ticker = ATOM, - main = kline(), +cryptoQuotes::chart( + ticker = cryptoQuotes::ATOM, + main = cryptoQuotes::kline(), sub = list( - volume() + cryptoQuotes::volume() ), indicator = list( - bollinger_bands() + cryptoQuotes::bollinger_bands() ), event_data = event_data, options = list( diff --git a/man/examples/scr_assert.R b/man/examples/scr_assert.R index 5844b1e1..5d23cb33 100644 --- a/man/examples/scr_assert.R +++ b/man/examples/scr_assert.R @@ -1,101 +1,77 @@ -# script: Assert truthfullness -# of functions -# date: 2024-02-22 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Demonstrate the use of the error-function. This is -# mainly for contributers, and for my future self on how to use -# this function properly -# -# -# NOTE: As these are wrapped in try -# they are not properly formatted. -# script start; - - -# 1) unnamed assert -# expressions -foo <- function( +\dontrun{ + # script start; + + # 1) unnamed assert + # expressions + foo <- function( a, b) { - # assert without - # named expressions - cryptoQuotes:::assert( - is.numeric(a), - is.numeric(b) - ) + # assert without + # named expressions + cryptoQuotes:::assert( + is.numeric(a), + is.numeric(b) + ) - a + b + a + b -} + } -# 1.1) returns -# the regular R error -# messages in cli-format -try( + # 1.1) returns + # the regular R error + # messages in cli-format foo( a = "1", b = "2" ) -) - - -# 2) named assert -# expressions -foo <- function( + # 2) named assert + # expressions + foo <- function( a, b) { - cryptoQuotes:::assert( - "{.arg a} is not {.cls numeric}" = is.numeric(a), - "{.arg a} is not {.cls numeric}" = is.numeric(b) - ) - + cryptoQuotes:::assert( + "{.arg a} is not {.cls numeric}" = is.numeric(a), + "{.arg a} is not {.cls numeric}" = is.numeric(b) + ) - a + b + a + b -} + } -# 2.2) Returns -# custom error-messages -# in cli-format -try( + # 2.2) Returns + # custom error-messages + # in cli-format foo( a = "1", b = "2" ) -) - -# 3) custom error -# messages on -foo <- function( + # 3) custom error + # messages on + foo <- function( a) { - cryptoQuotes:::assert( - is.numeric(a), - error_message = sprintf( - fmt = "{.val %s} is not a numeric value.", - a + cryptoQuotes:::assert( + is.numeric(a), + error_message = sprintf( + fmt = "{.val %s} is not a numeric value.", + a + ) ) - ) - a + a -} + } -# 2.2) Returns -# custom error-messages with -# passed values in cli-format -try( + # 2.2) Returns + # custom error-messages with + # passed values in cli-format foo( a = "1" ) -) - - - - -# script end; + # script end; +} diff --git a/man/examples/scr_availableExchanges.R b/man/examples/scr_availableExchanges.R index 2c9e0bd8..c7858168 100644 --- a/man/examples/scr_availableExchanges.R +++ b/man/examples/scr_availableExchanges.R @@ -1,11 +1,15 @@ -# script: -# date: 2023-10-06 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: # script start; -## return all -## available exchanges -cryptoQuotes::available_exchanges() +# 1) available exchanges +# on ohlc-v endpoint +cryptoQuotes::available_exchanges( + type = "ohlc" + ) + +# 2) available exchanges +# on long-short ratios +cryptoQuotes::available_exchanges( + type = "lsratio" +) # script end; diff --git a/man/examples/scr_availableIntervals.R b/man/examples/scr_availableIntervals.R index cb6426fb..94a43865 100644 --- a/man/examples/scr_availableIntervals.R +++ b/man/examples/scr_availableIntervals.R @@ -1,22 +1,20 @@ \dontrun{ - # script: - # date: 2023-10-06 - # author: Serkan Korkmaz, serkor1@duck.com - # objective: # script start; # available intervals # at kucoin futures market cryptoQuotes::available_intervals( - source = 'kucoin', - futures = TRUE + source = 'kucoin', + futures = TRUE, + type = "ohlc" ) # available intervals # at kraken spot market cryptoQuotes::available_intervals( - source = 'kraken', - futures = FALSE + source = 'kraken', + futures = FALSE, + type = "ohlc" ) # script end; diff --git a/man/examples/scr_availableTickers.R b/man/examples/scr_availableTickers.R index d3dfe3e2..34bcefb9 100644 --- a/man/examples/scr_availableTickers.R +++ b/man/examples/scr_availableTickers.R @@ -1,18 +1,18 @@ \dontrun{ - ## available tickers - ## in Binance spot market + # 1) available tickers + # in Binance spot market head( cryptoQuotes::available_tickers( - source = 'binance', + source = 'binance', futures = FALSE ) ) - ## available tickers - ## on Kraken futures market + # 2) available tickers + # on Kraken futures market head( cryptoQuotes::available_tickers( - source = 'kraken', + source = 'kraken', futures = TRUE ) ) diff --git a/man/examples/scr_chartFGIndex.R b/man/examples/scr_chartFGIndex.R new file mode 100644 index 00000000..7dab24b6 --- /dev/null +++ b/man/examples/scr_chartFGIndex.R @@ -0,0 +1,34 @@ +\dontrun{ + # script start; + + # 1) get the fear and greed index + # for the last 14 days + FGIndex <- cryptoQuotes::get_fgindex( + from = Sys.Date() - 14 + ) + + # 2) get the BTC price + # for the last 14 days + BTC <- cryptoQuotes::get_quote( + ticker = "BTCUSDT", + source = "bybit", + futures = FALSE, + from = Sys.Date() - 14 + ) + + # 3) chart the daily BTC + # along side the Fear and + # Greed Index + cryptoQuotes::chart( + ticker = BTC, + main = kline(), + sub = list( + fgi( + FGIndex + ) + ) + ) + + # script end; +} + diff --git a/man/examples/scr_chartLSR.R b/man/examples/scr_chartLSR.R new file mode 100644 index 00000000..b6ee883a --- /dev/null +++ b/man/examples/scr_chartLSR.R @@ -0,0 +1,37 @@ +\dontrun{ + # script start; + + # 1) long-short ratio + # on BTCUSDT pair + LS_BTC <- cryptoQuotes::get_lsratio( + ticker = 'BTCUSDT', + interval = '15m', + from = Sys.Date() - 1, + to = Sys.Date() + ) + + # 2) BTCSDT in same period + # as the long-short ratio; + BTC <- cryptoQuotes::get_quote( + ticker = 'BTCUSDT', + futures = TRUE, + interval = '15m', + from = Sys.Date() - 1, + to = Sys.Date() + ) + + # 3) plot BTCUSDT-pair + # with long-short ratio + cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::kline(), + sub = list( + cryptoQuotes::lsr( + ratio = LS_BTC + ) + ) + ) + + # end of scrtipt; +} + diff --git a/man/examples/scr_charting.R b/man/examples/scr_charting.R index 69836337..7bdb3636 100644 --- a/man/examples/scr_charting.R +++ b/man/examples/scr_charting.R @@ -1,45 +1,22 @@ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( +# 1) charting weekly +# BTC using candlesticks +# and indicators +cryptoQuotes::chart( ticker = BTC, - main = kline(), + main = cryptoQuotes::kline(), sub = list( - volume(), - macd() + cryptoQuotes::volume(), + cryptoQuotes::macd() ), indicator = list( - bollinger_bands(), - sma(), - alma() + cryptoQuotes::bollinger_bands(), + cryptoQuotes::sma(), + cryptoQuotes::alma() ), options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), - indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, + dark = TRUE, deficiency = FALSE ) ) diff --git a/man/examples/scr_getFundingrate.R b/man/examples/scr_getFundingrate.R index f7652822..cd129084 100644 --- a/man/examples/scr_getFundingrate.R +++ b/man/examples/scr_getFundingrate.R @@ -1,24 +1,21 @@ \dontrun{ -# script: Funding Rate example -# date: 2024-03-01 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Fetch -# funding rate from one of the available -# exchanges # script start; # 1) check available # exchanges for funding rates -available_exchanges(type = "fundingrate") +cryptoQuotes::available_exchanges( + type = "fundingrate" + ) # 2) get BTC funding rate # for the last 7 days tail( - BTC <- get_fundingrate( + BTC <- cryptoQuotes::get_fundingrate( ticker = "BTCUSDT", source = "binance", from = Sys.Date() - 7 ) ) + # script end; } diff --git a/man/examples/scr_getOpeninterest.R b/man/examples/scr_getOpeninterest.R index afd6c213..788d5681 100644 --- a/man/examples/scr_getOpeninterest.R +++ b/man/examples/scr_getOpeninterest.R @@ -1,20 +1,16 @@ \dontrun{ - # script: Open Interest Example - # date: 2024-03-03 - # author: Serkan Korkmaz, serkor1@duck.com - # objective: Fetch - # funding rate from one of the available - # exchanges # script start; # 1) check available # exchanges for open interest - available_exchanges(type = 'interest') + cryptoQuotes::available_exchanges( + type = 'interest' + ) # 2) get BTC funding rate # for the last 7 days tail( - BTC <- get_openinterest( + BTC <- cryptoQuotes::get_openinterest( ticker = "BTCUSDT", source = "binance", from = Sys.Date() - 7 diff --git a/man/examples/scr_getQuote.R b/man/examples/scr_getQuote.R index 28eebc65..62a2f498 100644 --- a/man/examples/scr_getQuote.R +++ b/man/examples/scr_getQuote.R @@ -1,34 +1,20 @@ \dontrun{ -# script: scr_getQuote -# date: 2024-02-29 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Demonstrate the basic -# usage of the get_quote-function -# script start; + # script start; - - # 1) Load BTC spot - # from Kucoin with 30 minute - # intervals - BTC <- cryptoQuotes::get_quote( - ticker = 'BTCUSDT', - source = 'binance', - interval = '30m', - futures = FALSE, - from = Sys.Date() - 1 - ) - - # 2) chart the spot price - # using the chart - # function - cryptoQuotes::chart( - ticker = BTC, - main = cryptoQuotes::kline(), - indicator = list( - cryptoQuotes::volume(), - cryptoQuotes::bollinger_bands() + # get quote on + # BTCUSDT pair from + # Binance in 30m + # intervals from the + # last 24 hours + tail( + BTC <- cryptoQuotes::get_quote( + ticker = 'BTCUSDT', + source = 'binance', + interval = '30m', + futures = FALSE, + from = Sys.Date() - 1 ) ) -# script end; + # script end; } diff --git a/man/examples/scr_klinechart.R b/man/examples/scr_klinechart.R new file mode 100644 index 00000000..f370c1dc --- /dev/null +++ b/man/examples/scr_klinechart.R @@ -0,0 +1,14 @@ +# script start; + +# Charting BTC using +# candlesticks as main +# chart +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::kline(), + sub = list( + cryptoQuotes::volume() + ) +) + +# script end; diff --git a/man/examples/scr_ohlcchart.R b/man/examples/scr_ohlcchart.R new file mode 100644 index 00000000..9241313d --- /dev/null +++ b/man/examples/scr_ohlcchart.R @@ -0,0 +1,14 @@ +# script start; + +# Charting BTC using +# OHLC-bars as main +# chart +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::ohlc(), + sub = list( + cryptoQuotes::volume() + ) +) + +# script end; diff --git a/man/examples/scr_plinechart.R b/man/examples/scr_plinechart.R new file mode 100644 index 00000000..b799e2e1 --- /dev/null +++ b/man/examples/scr_plinechart.R @@ -0,0 +1,14 @@ +# script start; + +# Charting BTC using +# line charts with closing price +# as main chart +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::pline(), + sub = list( + cryptoQuotes::volume() + ) +) + +# script end; diff --git a/man/fetch.Rd b/man/fetch.Rd index 9aa0c20d..ca415c91 100644 --- a/man/fetch.Rd +++ b/man/fetch.Rd @@ -7,19 +7,35 @@ fetch(ticker, source, futures, interval, type, to, from, ...) } \arguments{ -\item{ticker}{An \link{character}-vector of \link{length} 1. See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} +\item{ticker}{A \link{character}-vector of \link{length} 1. +See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} -\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} +\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. +See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} -\item{futures}{A \link{logical}-vector of \link{length} 1. \link{TRUE} by default. Returns futures market if \link{TRUE}, spot market otherwise.} +\item{futures}{A \link{logical}-vector of \link{length} 1. \link{TRUE} by default. +Returns futures market if \link{TRUE}, spot market otherwise.} -\item{interval}{A \link{character}-vector of \link{length} 1. \verb{1d} by default. See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} +\item{interval}{A \link{character}-vector of \link{length} 1. \verb{1d} by default. +See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} -\item{type}{\link{character}-vector of length 1. See details} +\item{type}{\link{character}-vector of \link{length} 1. One of, +\itemize{ +\item \code{"ohlc"} - Available exchanges for Open, High, Low, Close and +Volume market data. See the \code{\link[=get_quote]{get_quote()}}-function. +\item \code{"lsratio"} - Available exchanges for Long-Short ratios. +See the \code{\link[=get_lsratio]{get_lsratio()}}-function. +\item \code{"fundingrate"} - Available exchanges for Funding rates. +See the \code{\link[=get_fundingrate]{get_fundingrate()}}-function. +\item \code{"interest"} - Available exchanges for Open interest on perpetual +contracts on both sides. See the \code{\link[=get_openinterest]{get_openinterest()}}-function. +}} -\item{to}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{to}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} -\item{from}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{from}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} \item{...}{additional parameters passed down the endpoint} } @@ -33,12 +49,13 @@ This function is a high-level wrapper around the development tools available and should reduce the amount of coding. } \details{ -This function can only be used to fetch time-based objects, and can therefore -not be used to get, for example, \code{\link[=available_tickers]{available_tickers()}}. +This function can only be used to fetch time-based objects, +and can therefore not be used to get, for example, \code{\link[=available_tickers]{available_tickers()}}. } \seealso{ Other development tools: \code{\link{GET}()}, +\code{\link{chart_layout}()}, \code{\link{convert_date}()}, \code{\link{default_dates}()}, \code{\link{flatten}()}, diff --git a/man/fgi.Rd b/man/fgi.Rd index b1708a29..85b346f5 100644 --- a/man/fgi.Rd +++ b/man/fgi.Rd @@ -4,24 +4,26 @@ \alias{fgi} \title{Chart the Fear and Greed Index} \usage{ -fgi(index, internal = list()) +fgi(index, ...) } \arguments{ -\item{index}{The Fear and Greed Index created by \code{\link[=getFGIndex]{getFGIndex()}}} +\item{index}{A \code{\link[xts:xts]{xts::xts()}}-object. See \code{\link[=get_fgindex]{get_fgindex()}} for more details.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} +\item{...}{For internal use. Please ignore.} } \value{ -Invisbly returns a plotly object. +An \link{invisible} \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -The fear and greed index is a market sentiment indicator that measures investor emotions to -gauge whether they are generally fearful (indicating potential selling pressure) or greedy (indicating potential buying enthusiasm) +A high-level \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-wrapper function. +The function adds a subchart with the \verb{fear and greed}-index. } \details{ -The Fear and Greed Index goes from 0-100, and can be classifed as follows +\subsection{Classification}{ + +The Fear and Greed Index goes from 0-100, and can be classified as follows, \itemize{ \item 0-24, Extreme Fear @@ -31,20 +33,52 @@ The Fear and Greed Index goes from 0-100, and can be classifed as follows \item 76-100, Extreme Greed } } + +\subsection{About the Fear and Greed Index}{ + +The fear and greed index is a market sentiment indicator that measures +investor emotions to gauge whether they are generally fearful +(indicating potential selling pressure) or +greedy (indicating potential buying enthusiasm). +} + +\subsection{Source}{ + +This index is fetched from +\href{https://alternative.me/crypto/fear-and-greed-index/}{alternative.me}, +and can be different from the one provided by +\href{https://coinmarketcap.com/charts/#fear-and-greed-index}{coinmarketcap}. +} +} \examples{ \dontrun{ - # script: Fear and Greed Index - # date: 2023-12-26 - # author: Serkan Korkmaz, serkor1@duck.com - # objective: Retrieve and Plot the - # index # script start; # 1) get the fear and greed index - # for the last 7 days - tail( - fgi <- cryptoQuotes::get_fgindex( - from = Sys.Date() - 7 + # for the last 14 days + FGIndex <- cryptoQuotes::get_fgindex( + from = Sys.Date() - 14 + ) + + # 2) get the BTC price + # for the last 14 days + BTC <- cryptoQuotes::get_quote( + ticker = "BTCUSDT", + source = "bybit", + futures = FALSE, + from = Sys.Date() - 14 + ) + + # 3) chart the daily BTC + # along side the Fear and + # Greed Index + cryptoQuotes::chart( + ticker = BTC, + main = kline(), + sub = list( + fgi( + FGIndex + ) ) ) @@ -59,6 +93,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{hma}()}, @@ -66,6 +101,7 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, @@ -74,13 +110,17 @@ Other chart indicators: Other sentiment indicators: \code{\link{lsr}()} -Other subcharts: +Other subchart indicators: \code{\link{add_event}()}, \code{\link{lsr}()}, \code{\link{macd}()}, \code{\link{rsi}()}, +\code{\link{smi}()}, \code{\link{volume}()} } +\author{ +Serkan Korkmaz +} \concept{chart indicators} \concept{sentiment indicators} -\concept{subcharts} +\concept{subchart indicators} diff --git a/man/figures/NEWS-unnamed-chunk-2-1.png b/man/figures/NEWS-unnamed-chunk-2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..40eb6491a47a921f7b5878aa610c1e8126fd993d GIT binary patch literal 55095 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 LNkvXXu0mjf`E^s; literal 0 HcmV?d00001 diff --git a/man/figures/NEWS-unnamed-chunk-4-1.png b/man/figures/NEWS-unnamed-chunk-4-1.png new file mode 100644 index 0000000000000000000000000000000000000000..29409b54a46bdead1fea5bbe513027dfff8cbb23 GIT binary patch literal 52705 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 literal 0 HcmV?d00001 diff --git a/man/figures/README-chartquote(deficieny)-1.png b/man/figures/README-chartquote(deficieny)-1.png new file mode 100644 index 0000000000000000000000000000000000000000..20e4ba58d0634400e5437a30e6924db88035a18e GIT binary patch literal 72655 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 smJd$;-{vYl{{egcKSnC}rEE!Kfqa~j{<k^lez literal 0 HcmV?d00001 diff --git a/man/figures/README-chartquote-1.png b/man/figures/README-chartquote-1.png index 0e32d6664b7c7662b017248ab1b78f56e8584163..0c72bff2c94fb005f5842f095a297885c9b137bf 100644 GIT binary patch literal 132952 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 VR3Gl8nQBb7piEQj|LxBY1Y$ zchs*Lo7)8Pa~VlpF&m`~+~nk;=LuKY{!K+F3= z%m2VPG)~}6mxAkJ#<@NPRc8a<4u1CelXD#JN7QY}RNgoP_D;bv7ppSi>CMl096I%s z(;<-@y7fl})42xC%rku&^2DSg;?q40PW}LbM2hPI5kSJYT(uAz#$wMuHU3RR|W^|h5@rd5Q1u*_ElsepqeRjB}H*HJ8^&UPW*$y+~a)1hT)fv=j2iadjIr zQ~FMLKxHXb@9o#o4ZRF|FCSo2)5!YFWwZ-l^JLbb$cg-%VrvQ`BY~muoc6W>dYk;) z*sta(cM0mYJdEke`=KoNfBa}SNV-(FR+=~^wQ`9r95v2@Jzqug`AM@>=)k3i7xupa zeVWXa8cPH`(joDnys6iBzGM;6su^M! zRTf*z?7>abl;@Mh%demP_qegu5Gd$zb*F?1quv~C;h|Qf9pC&`Mxl-ccbh11z_k3o7*_<-`csVYz>&f z$&k`Q<_!BEAbhT1pH^m}o`F?AE9&v6YgG_I!i%tkKlRDa>K&1-5e$SY4IO2U54)3y z+Zxz=H4(qQ1iv?Sdb?PKIBCEQd?o+^{)M!4Ay49DIOUNo{O^=w`;KwCGsmoc>c2^? zb0Uq#(wz^I##|N!>__0_QI3DbR9!I5HoWZg>Ub#o*8BACbZlLHQ$M+-CPFnsUylTL z6R}ARWyYVPjG|_z?Cdct77%!O5_~!sdB}QNhn)@=ZW=&gE-sZSO8d~0Cx|!C{YPVR z-P+|>?Edrv9FY#{@)xQ0=Zi7GqA^6yGPO7IO+GQFUBbI9mj#uqZ zRXgl#Q1R+1ZIA~ufIdRK7RXfe#F3Zw>9N-M0kbcU_72K1Yd~qSr!*4sE|0n&nQzJU zo}FNgg&Ucm5$%7s29G{h`N?uf9a(n-7dd))82F(DwKi2hGKr|_R~C!3c7ntM73~Wd zmfft=J3ad3WF2~(1IpK!4g_Ssl*EzAf)X8IAyf*8q4O9rJ(Be0Xu-@E=?1eM^ zA)}BjM}V6!iGDGS_bS-A@^lI!d!4ehFjZXzEO;d0$iOqKjmlBM#{r1mNI8b$wd^yE zHmYh|)UdxxvZ0291ZwxJPxAO<$#r>Xt&oy!02txGkZeQm$BJa9 zEvLUfao22T=F+rlRpz|11Ok|T!xe$N+93Rm@y2I)DpPIG=xeHK){O{@7H)dw)SMmI z^wLrv=Ljr6!!miK8i1Z8yxM>G7;e%@Kam?^2C_nmE8)r+Py}OO#$d`#;tCsl3XjDUSHKlc#R}hC9h{A|Ad!|RG|=`u z%dt7u#~Ykw6zP);*%ZxiL33JGt!{`YP_u3~v{KbB!<{ZK7*33hnrQgzk>C>>!3iF! zx*5n2sw|KHLG)u9l^vnmut!Oq@AeiftJ?AR=WCsgt_ZKP=}HsE+>vLw6g9QI=RG}g zi*x)|UfmW+FTFE3VEavip!?&YKF3QFPXG4^7@*1R$F1RD*ZPwk2+F@wHR~hZ?`mtK z1DyMT8v+IBbvAGPLvG@+F3=FXR-7Z0YC10{gI1J+Pgg$ZXXQAYsJ>+c=WP>B4hUMCWT8MDd$)~R+m+q4}|F%E7K(nV(aTMyQaX> z;(}pOk%_H6m{6feZ8oJkPF**O61iA=<(}p^9kTMeUN#$`Kk&JgmNkz7SsXEWO=mZg z5Lzo4;n=(#PXpSF2v4GoHJrGu?l*b7tLt23^H%HDCjZ|H0JbPObuo9@gX=#!3aK5$ zb+Q?CxyF{X`ljg`)xMg*_re?FHCB?22qpcr#?Yiv4*ViL-{kU2 z)~JI&zoLN7pENUbH&|7SqU;0~AW=8g>?8g zZC2UE+qjo)MkDQSThe$P39)NihJU$dYFFY@UH1(0Ypy!KpAV&Yv8dTr%CC9()2Vy+ z8d<-aDjkh8q8db^v*$JJe%3qqmN{}ZgU$obHdLwQz`4{ikxpPVdu@p{KR_h85x=m( zwCA_cC-Z(yp{?jx@_&pR@;mVo_+0xiwIk1a6P zpO>&%RDf#R?57Btxro+o@}d#U?#;*Ph-BWVT9DS&{FxARI+yFBpnG_1;~)otUtzD) zD`vc^ZFWU3nTDME{Yn*hLDK1Y+)v@aNc>2bL#KcT-t~1WkfOKxQhNm7_57gV6q$~x z-|r@T!8HCaO{ee@Z`qU4Itov|3o`_~Im4x>5_Jz<_bK+TP2E45YI-Z8b(q2`dfxLo znm$ez@Oj*l17%s;A8HbFd0E@>LNphgSJ?@Z@yUWST`37RG4KRpvC&hpZg8vO`?fJ* zt#fwZVE|l`AP&$~s>*`gQG~QsQkiAor3%vh+ScHbQi&j&um8Z^PoXJeWdKmg9vU12 zgq&YT|E)_bM%3e-pdmLQ{SR2sh)^6RQ7$V{5Hh!gLM6dpDsF^;^WZBSh5B|l zT({zbzCb3x>ic2meRTJ6Z8Lg1eT)6%So!e=c~t@_FfHhZqXNqm7$_A{qL$G(U4I2mbFj9HBewkHVe1H{Wv0LUuMMC&9whd z`jR~<#W+>pQofjC;B(1?0M(eTNJ(!Vj;S94#IclcjRXeVemmC+^KJkQO+ zwhy>z!dxGu1d!+9Pf$OM`0AF=C*hq>@Lb_rpF%K%Ms4)D!kG~{8|)M<2l9xJ>wXz} zQXlkUM9}7>u+S6|SVy0={4T*>O9gMhb&V5B1Ke|PA=NAcKx5#?{zZQuK0nw! zP2Pmlxn7Jxxe+&-(S^45j6G5#aKCoUhcVD@L*HwSl4i?)$jMkWXM{zyw4A&?D4o%% z&Lloh3ig=lcbws?vC&`E3E3H~xnu(AhSQRCp3Zpz!gJLB^*dB!(7xnhxw*sAEgDMH zi7DsI;56zpH2N+u@EWQ|bo`vfMs!=*xrh0YDp_P5VCY&870?@k8qL-b!wPnE(kQKn z*b@z_%RlATcXlV-c)GUmUH^>DYPVHyDSX-+J;?NZy?_NZo^|S(3(9yL|57R~G!6H* zy_ql_QwVA7VqQtGIz*m8taUVC?cbjEVETiChsosvKU5oYL7)# zQ=Z@-Y|U=3-WwI*{LJt7Ho7y>ak*CeH5o0N)v;k|2xmj!X&YfUey5KeiF3wHZ{+EO zMkCND!CnC#Ho+dXNtP+m$We@OvxH5IJsFNmJegiavT(RoOpE(oT=!YB@6rzy3OM?H zd%7bPQ+b1!4+$r|=}xCH_N~I61Ik|} zKUY!ovi)Skn0FP9$Zj(Tq02*U>~PzD<)@&LgmJot(0U+-~8!$cgAhDFW?!~ zkESFq4k>!Bq}Z%E#3KKUg-EdBh0qRxUqzZlH;(kI)mEKhsZ)r*}lP8r*pUjnsc5BUJKvkz%O8Nr&!)m>>t!rLs@Ox}#tV z%_X_GRm?~J-Ez11+qF{B9X)){k z>Imkkc&zO?j#J&|vDuI=Jjg21Z&F;vkqpV>P9+&;)^SX_(lY2F!p4*w^br06tXC@! zXD4vbhKRh$Aei2)5#!=rmsLyq&%x^{lkL{`IY|s2wR>@XwHNOptRTD9Bc4?% z@Qva>r!(vo+CIyPR=R6u06RC8%dP$h%KCCZ4IgZ#9L5fZnmy(zA>>44h;i*Kwh42G zNOmt_Jt)ri4Ai7w-sy4ir)z*3*t~gLLrcCiD*_oHR-wy;Y?6(warJGpNyBH>#N);7 zJ7~eN!IX(Hdc50kv+Il{d+a|a4W$b+;aprhK+h?J3aV&5P%NW}56IgchZWk|3uGEv z^eR9AO$=&uwbMGa;m4QF2k*Pd(r_U1(qCcVIMWz~MxVtkSOqpKODdN>>&TV+!f^}$ zVGBE*>bpq1Yr_fClzn82Hih#aX;a!}^w-DN*ZKvB@N898ZPmLDC5t$dPBgeEA|69* z6@^NtAI`!RAL9j z(h`ancPQTA?plg#@!;<6&X@Oo_pX(7l0R8lnLT@-Gc%8{oPAvL2zU73!JTlZT4BYc z*V=o8<)NV9@s%afY#D1u?Z=z|y#ix{mpJnwT}Jzlfz7(SWKiCkACmS@yM<)&*Be%X zvdTPofC*?(q+-+-j3h};{>=^p7*@~TJ68}Q|0jA&f_Uhgt6_ux9R8X|Ks+~2`B3)`Kmvei4rNS(QA;fR z7>#_Bf)WF-sKR`;J}&i2)jlqRlmoS$-I0g=eCPzBRZrtZY;4PNn6~XR=MGBhxKDpE zpLx&2QSM;|q3vPv*YZdWvOvtq zVmrU^?707Vj3Q~o`DPmB;n3$?MlT8x2;8NXjydLl*R!`{@@(SkXqDmjpZ-&QU`i#P z1#KLWq)21CTS6Q4%TQdRNwzV~7Ub#UZcNwWZwwnya<4<~n{|2H+xpmDf31I@klxs6 z5~z4aqGQsN1Ip&nEW zuy1dWwzK`_sUwN=yPZ3xJtkaN1mxZ26&hi1!At@RSTu#!Y9e-kn=CiGW}zP)lq__WeD3DQRErb3;r`)EA=BdP4UaRRSSB z0x>5?v2~G48BWfyo9s#nv}hgs15w`TfIr;A=HuG=Yd4RRGC6FQyMrB|PmvLtP;bw`_afZ;l)fRLShB57?9nkt=k1W08I3I!evuQ(@SeENbwpWD1FWR0hqdlqx5I zH5>g9dCO|lG=ECx1CV*0W$V(^%E@>S=g~2>8f2H;C`;g4eu}pk{_`F$H}M`}P$n*E zna1E?%C`iaLTvf42Y5ULf=Yxonp6#&z+x0TE*v;yptSTe3?@)Zlk&#lVZh$?zLz7h zPiu@nn1Z-;9c9;FDXkK+HJuW%Y8!s#%rr9EaUJbuT)vFtQpfq)IJGJy!h3w|^B0VE zNl`KoBoFXg-OkTw3*#3KA0w{H8$EUARkoN}@e=ylY(if`2TpFJug`b(#nOM=3u;>` z@;Et&5XZyxFqz6BShd5)K?E+`XC~Ke4)v1iqSqut+*{z&370PYG3xlboFv zY{sQ)$!Fpf6~%R;wI{!5@FDIXlTqck$Hh<}c*A>s>1q0mM!rrL7#ydC4Z%-@pa4=} ziatx?6D`2{>H!IDX|EAB7bbXBr_^j>!?p_(&PQJewCAs+8&t=bdp(L){XF-w$~p(1 z@Z^ag-l_P3nR7lCxtqXD&Gn{0j*ir1>!w?zo2cy15JuGoyi8V2g%aba@ z^{*2d!m;OxlDt;aQ1?WS|C_jN)u23@RMjxYSxANZ2DUcVN* z^oVnz!dudccE*@8{zLzT&BPN}r>v4{q)qxul^nbQMHKc*sPTYWt5klO03eexU*1rA z19+=n>!l7SFTWN;L_(F{Z+ytDQ4DYI_=YFEf1R2kV)fJl2{-bUeQ(Z75JarZ^^oVL z8Qo*vs0l}?_7Gi;{{MUVgrx*v4C~vw*)r<>*7HUTF_9? zPFxToU@rL>{&qfp*L9mc(ec$Ow+if1$alVDU;vzN{Jjn$PB(DHt^8R@+DYIbzWqZf z-K_?tvkQe$2&QJYgLg|*&m8{(hrvxN+ z>~OMBXYRN4<%1Dgx0G;>-AO>uwA3oW!KvrJ6Z@Ay_<=~9{>w-9A@NtbLc?tp|UfuTg@bre^d3}(>s$y7ikZr zX0FIEs-5g7e?F32-Mt;xa^#bT|4VeYFHm!11-mk_B+LL|0mH7eXhEjAC5G=7*&&H_ z8;#QKV|J~2x{DB;h8y~=DxN*YzRWyu{^;Ck5{~+#mTlg5dzPfXVjXC`450qE=^^R2 z(`8M+0NI9K$)6Q}R@RrU`u~Nsp*G2iowfzlxibtwMuBcYRszt~fe1iTlA@)Rwc^tr zSS|HpGspV;jKvp^oKv>!%aL55==AD;O8y$E)_5{13I|5p`^QeJERIKbjGad5Vwuie z0!XBcN)08Ccs6uBs340m4$z;C7@{=?X(pJIw|@p(w$mRuWF3eR61069$<$FV<${Z1 zUi9r26*gDU&L4m7H@)mzAJC5U2!YJ2ES@R0Ae@bbVnnZ{E#HCXR@G7C-Y0y$Iwe>$ z&wX-jst`Zz;N26r7Bp#8Njs@hyC2+@k~>x(``Py`FpfzqKKEaQ^?t6$j4SR#(5=$r zH}qKyM2Hre^Z>_mXIrpI)Oe_M2BGMRxNoabe9?>e9gCR>d)F0KUo~LNr}u#`s-DC- zY`_{^e+}p%ke~P8xeGdCWX!2SE;;3t`JS(YGrL}u{PBpXk!oQE@+L~yg9av(Y!PcY z=TzUp_CkN=EN6fVZGwZg&SvwFf7MC&)@GomiKm95TKi+Dt}H?9-+IQ}=z4OOzjVh# zML2P}6yQa+fA&uM;tC=|L6j+~GuV;EZA&Gqz7RLFU&|mwe)lyEqk0=B==K zrL}z}adqL>Wc)R7uJ2&uA$+Vo8}xJ|md1vk>nlwtjY5!dkdQ%y15+tYf4(#Xg_$69 z=d;Wm+zPIU0iWr2!woAiQrT6#-jt_$Fj6LTYxSCrY&IpDOm|zIuB{T1nNjuay&?>5 z#*DhY)KF6mdRnYJsJR>`d|fzHAesNjK3{0SkP#>ol5(-jt zn{q-TbuHJ7)I;}yKqYS^=&)W)?M~8L(rjI))W9z5_U(DXQ?*@|Wu8}tA){%~W37Bh z6}l5_2WmO>Va*yZ(*K5>`rCag@d{>3Do_7BgvB5PgBdu{$~LC^gcG5iaiumcEc?Fp zQ_EqJ`)~Og>P#2|L|ML1Ok|bftL6@zA6!)o6VWs^qapE5R)y32}Pli~makD(X|8RBgS|5dU-^WzU$?kE+=WDoKfXuw9e4kZa z*OUPy#oPXjJ0i@sQc1k+^*dRXf`fy#;NnY-9(xzOvQuIA@#@phLmWZ9xp_75XSoJgpXTdIjMcM>r*j;& za%-8QePRcL#fW9ZAmmT*SC(*)SZkxQJf@a2&3qV;7AmpbM99OBgg$ebYRl_riZ0jPL3CB1Kfvrtf5B>Q7Be1k}2@n zwq`?feDiXMbt&C4>CSwo};RK{19MpI{wYU@@`?i zbr};X==DzxC8Fcxdclpi?}0@bO78sjtUVdZ`-G<_@N(P#v$!V6u8&cnzw;V#;1i+RS!rmTsZA~u*|RKs{kWOD zYi~KaWMvF|hk%nC-&Ab;q~%y@JqXB^##iO6-mOc-oXy{Pyj|UmC*{7Ml`$fK0}+C1 ztbgFcVh?=D)iq~MgZP-*rBIJI^6m&_zT{q4L;Pvu$`;Z_#eL_V3d-#LkMNtNe$xNg zn%vtg>C`%5;De9dvMlRZmdJab8&v%~_`(p`301){4q}-;1D%3s!dRtYo{+`mPWhRtOkv~CNh|<@en*~14d-x=LJ6eZcB1JW9jAc%} za2F)xw$o-Uw%yvHLqv#k{3@M0XXR9R(_qgCRZz5wPk9NQm0`l}-AhwDef`q~(fG5v zS^sd1;oMBr4kyVcIu8XhxKnbHpwIEHbn)A}l(;lv(_MZRDir@Dcv&wl$q}jVuZzpjuG$x}eNfd=tfoX`u(7dsp9nXN)Xy$Ud=P z*xm8Zj^D@lgj%TprRVdU3{=r#?;?dX%R9t#&~Anuc#5ZV`#S}3_l&0o8YZ(|^X`LI zePJ^KXjaAv4?eZ)spwC)4M1>^Yor{pw&Ln){z_ez*Am5@nR;Ahncrl6H$n$Ji)b=P z3z@i!NP736&#~Q>dKg{^UVLo!$4IU3C^!k_&<4(y!sFATf8rtojYK7BTNZ{~Xaz}( zZ2lA0aJ1>9`9o|O(1Z%HvlX=Rv?@?!jAE^OJ_PR&lJUt47@bXYLH17wIr^}f?T??V z)vh!53>}6PmoJT*-!Vi4{Qp3DLwP)1FYpO;@4CP2x$t?L8*;gC-Ktc5j(^zJnr~1> zy>iMC{`9#gUS!O-s-OQQB9v1ks(`Mul;{kzKMJ3<68jxZ|kj0LwEEw zJENW;Mo`5!a5 zbti&eV1b_>U+dm3QXOBmDm3N>T=V!WL#lk50Eco<1dAQ<`@bl5R>(?}@&%HZBtC5<)AA zfdnObb2&I5BsZ5?XV5}J1_7w+YaHff%7p2CK50O`D_?!sytho%j4b>>=2bnaT!qSR z^uQC1ky;?~CB0xWD8>PaUM^^-Fxk6emICP=4t6s#eiMB zl5r%kBe|P}mv6?QNItK9f;8atS5wJ^5DxhH-`?u#K`XUeN8&IO->3K6@y?0aWoyZ; z=kv1|+sIc=%0Z@7seyU)@L1MSxVg|``s3z#zP?8NQtu)&f5bTK){s_;)OB1L}A zod7W1fHWF;M;ITf!|+CDY%ySeryIW&Hf9Hm~jUxle6U{Ap2c?dCN(-2CJPnNKb2k^aeU zEgLNQnrwg8W=pBr;~hT`Iz9u9

RNY-6n!#;>7Wub(_%FcDB_wOOPZNEy+g=jr`# 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∋AK759&dvlNP6Zk zjXkZ9TuS?I4*c|0fge#ReK|X0D~a4`3HQ=lUtad#=qpslpXMu`;WfTE;1CS=m>~Z1 zlg5H0_|fy0L@ln1fP)Q@p6EaJcaID!`fZ1NUN}v;m)woX>RI?+w$x)%W6#kk zJlFPMbEx&a#=~){+K`t+>ydl^N3Y$H+NxRYpVp#=kQ#4~jo(du>a4fO!_QLvH~x6w z{n@BU8}F|n^|+I~QWn?@0B!E%;PV=)i1+Ujgbd1abU&P5dKO>LW5IBU zmqI*cn^EMib~*o}$SUr1@)aI#A3FZSU#wGjm{&r0sJE}Y-El_YaWb^dZ~TGe{@oisH;6XXdjyMLn3Y)DL0@|#qm=F_Ie$(l+yf29IL zdcUQ=$Aas~mNq-X*QCy5*Q>)tOKmePdXt&0>OiC=D#kcZYLC2eotWB#q@Do6MdJ)PrNv=v>%d&%WtBqUgco$REpA_YuN-sE@I zyAOX=`2yF#Gk~_n{EX&2~ z0dqzk6={l9zD8!9Q>W4!xd(O~L)s0!;WbMEi&V+bZV&&p_{&1n-7OzN|JZ)Z$9^l1 z{1Wrm@E8x8a(}?WUEJv-4Ms_IuKiF}P)9zM!N)^4Q@xD@_!aR+?Gqs0!Ux z3k&(IAKJf|_w1=6LYVdZEJ_VnNLDVi{)r%YlB~Hg7seJEa<8B>?G_G>oLtz-C$1PU z8jLV!U#)1%-H|D33)+2E`{x>GS$dnb98~Lvddh4w+AOA`@Yl`6YF>wBe*2#+97dJsx_AF4x^hmW@OpwL}@ zBL{Yp&j!3q8x8-)wEVK93;4p~RSL>#^jU1t977djjQuJ{+CA=)@7M7b$=8=v>PswU2QTJ zKgaFp>$EG3!5O1MY`Q*-j}CWU8t_v~6u(&CjS)v$7{ZG-+$!CvLUIha*{LEVraXD* zVj1^Nu3M_>AnOxrrl;YhHExxGf1t zAA*~)Cx35ShoAS1@6rm))ExWaXRE^L*^Ch zV0l_8KRzunjuzGo)M3Rd%8j%2LIL-#*YrC zYjV(ipowbr4t81m=#|Z;a9c+3KlmEU?{LXhkm}4$u=r5vR{z8*U>z-8K?LQsdd%^}dWcdVdR`&5R`dH!4G7ZqEeP81r_YJB~LA zA&2R?gend)to=`D(}VHx#i}B*O;+Sy;=Kc4e&wiZb`-Ed<|F?8Y_7S>+{y55ng7tV zuU(KXwr})KXJ1eXO#+O27?Nzg=|5thtj6&<2WHINxZ{{8_JTaR+2J$B5t=o$72Qgh z{x;MQqAy6DD;$}?=dR?S(Aq7nMl9XjTKzeTD(G9~>u0VD{Q*U7zar>bSpOY$Ukfia zx&NVd#$-A={0eve?NKCa;=pfsO$h6=`@MvLJv<2S>QaSAwVZHMy2o#$!+cA>VP7ZZ zmhq!N?jdfIYMeEDPXzsAN`?qn7pd?j=Aa_~%;at9)+AHjX^t47?`oTOXLi5)|LzyR zRBc)qRuNW>4nDQTE4?@=x5-={+%>WXL%r@;!7>bW~@mhR%H zUsef3sswVJ2?*~{M|SXVl?2{YwfI0Iero*I$gxh!`(aKh;GNUXV9B4ewb(om(BgWp z0ud_T;0q})2Mw7U2?NmzrE6jMQhPC)9f`Vrt{c}%|9AHgt3g%3;0zP99j;mPIe3#L zo{})@f%u208n?Nc>$S9t!3Lb^#m@`fddfP*6csX8Y~ab>K|Ohe3~ePw8}BD`8XT7x z7=d}i#b0&x5g||b|BHP_GhY?7hiE%Rm&DHf-2OEnFf{-x^MmWfsvK985WYTH^A0ty z08jRgmvulYA)rvm0C0Lp8GRxHpeUp-^Wzf%>U6DR|Jmsbga7j3!(B*rE{vzOxiR0r zK0-J07*dKcAON^A0~_;YG*t|H5Z+|@k`WP#M2$O^ysFL5AbLaqX+L}YIeQZe&Hu9D z0gSV^3^~#EF7rwB>0KbsU%P(T(w$d#Or@dO+U?l!8bHE>mVggK=7>{2+uKCb?g|4B zBoW;hR23#M}}>ASNcz<|uP&yzjA&gKcie=Q?+Df(Azi2k&hyRtoc5|9;oyZ>`yl zmZG|XslcbFEOC58&y~ZI*i!{F@}Ki`EPT(dpwJyAk{AyI#D=XZi6ldWQ^1S4pVMoeG~gXL@;~% z)EA@f+Gqn8y7+k~&3u!8`M^UV7GK}Jv@sB@XRj=nKcdsn zM_s~s6QMu@I@9%?tmrNUA7BaFj<`FbN)-IR@Q3JLO(6j4^l*Cx6*`7RuC3-5?_*cl zgZ?k$c(YW90LS9vpc&~Gi;35mcU@4558nPSY7{tdjgCm*uws+6aUrN zb*BIG0-&H!o*O>P`z1#~Y=#N2<#%^mm|lSYo+1TrJKxmfwYq3Ce|<1=nQ!9z$1yZ$ z;EP^jUKa!X#QtJ-^ZwG83Z=5iN4K&cV@xT1%9A3mW)@=MMK7Hdrrr&9r`)g-?yC04 z%{X2yHux<>qbACnByGLy*dSsoNPW!gHmXYz2rF>x5iB);1$4Wj-*@I1q%ajew@NZD z9-@SOUzs$7q}tfU8>n~8Q^|YpnF#)yHko(5QfQ(`<9|FnhhcOX7{}W6ei+)oPcAkh!|7JfX&DR;wLS?W`)hL?`e$f#VO6>*X!m&?Y-AyGZK z!*GQL5ei@mW}Di!uq-2&Z*8#E8tNtn`~~BDCCHgG%kK`TgE`;glOs{fIi# zJ?bqM5(P&Z3Ies)5d!QG>j$rnxmg?Ur?jKIQ+9(K@_tJVC%cMGLuGekouqK#=JC&> zio#0*9bLsuG)*0ouLME`^*R)D&CPIWxD%2TkC{vLm%Bj{)UgJPj9w`bq37`IwHPj; z1inMff*!+J$;&V8*y@?#8Ag|6r4nsB*HK;GTTZLP__Nfqil2U%Y`mA*QHIg;tI}*Q z60NrchIwg8y%S5F&ly2v91Y_;`Um9uNDFlNL(T-DsuNqgS9g2u=I$9*?=5GF*X{3_ zaz7Xw!?y*5A=1Cvd57Xu?Wg4O8ien*XiD;zy8Wi=*A`DULi)F91Q?8oG;=4aCDE_s zJX*}0^x2qyv}h@6CSj*(g6w!wk`3b}DWwG9r$ZW222#mq-sif~6o9_3+iQWK1yz!n zVF?r=;44W_>Pax|P$gI#Yf50+9{M8Rue!{@bg=y{b7RaNLhEOfH+jYKSxi)MdgXHM zYg7bOF}T^M@_FGzn}7JfzzV4kIosgXuiH@GwZFv={F+a==U?yK!Lw)#;b17V9U=o* zsH5*$dF2>W02Mh!wuEMsKEJ=O5CO)%=jGesg4O=?0MV7lg{_3Zt(%j3WVf_#038e= zY|nr=Soc!1Dux8$T@cQ^SLEk9=O_T|bqf>7VUj$4ceN504ymB(#aHRu@8MI%q2N4Gdz#bGmY~mHcLJq*FqO3HfDa>ygWmo|X{lk`NZ;HT0wAtAk)P>@_ zV%56r*p=%63Ym_dzin`2s<3}1Hx2{O31w}G!RnrGl3x1V%#9OWzXr6Lm%@1n0)O_M zrA8w3`9KdEDlJlZkLC}btdaKA6M2%7%XY%(H|mNC$-@41|DyflcxbNq{i(a5DUqS2 zrC(anj^2^&;GQv=y(YZ+1g3}82AnT#mlg7(YDSa@<1n2$E{os|3SdhWT;>^(T_-V3=fCjg zjXu-ef=%lOL zW0}69hU%x^iBZjimv!Viz9A!QsMq^xJ`vICPETRV-T6n=ZG&orWxQe>kxXj9;fo9oV)CD-ASk zx80cuuyoBG{lku~qxNnwk0^6X7!li=modt$wJEGq5a0wSrfTDPBKfSkx^NT3*M2%f z$STuYzaLe70=E;GF8$OVY+S=Lpu5?*Sl_4%<8Xy_ zv*~3RLM=@3_ zgo!-KkJ60qQ;GGSh5ZAXefOb1oA@<^AlNxKlT5v-`n?3EFv0WF*!0i$Gl%=LL=3*8 zTf(ZOr!LpZY+epnfDT#&-@YvTvY?xmjQpOpy!Z9(eu4RA&jE9Xn1FD%<-YqMt1=b%yZ-;7P*E9w!9utazHjVQ}QO7I3F>U!4w`2{RV%l|VY|Bqv z(aXElRj)=HTr$_pbIeKm@gic$Z|4ViQo2duM6fjD-2OsQjW5#-kSy(TEJ;dcS%u`7 zK+FNGRJ-W;Vd|t&k;oT!rIeoU`~vZmu!IE4fs-5JHu(;Le!J*5hf}+U-Qp|Vy3&f9 zcq-MWhVoGO`ubUi8F17^n;(O{csiotv&cN|y28%faxxiwHAQAUD8{Yiz2&Ah?M`wa z-#HkSr&F=zBt)-mXajJ|eS#@HykY}9`R}8}pYr~^vHmtx`WYnk&l;+qGW=iik9>P% z+`?&;sMSwak(AToWxc5hKDw>b`p|MW=#aE=WsL|)YNzJCE_m~-<IlM!KXKD2fBR^vO8T_nAZ}{Gc2nl8ir`-irHtSJNmoEx z_^vu8cR}H*p$gqo^R$mzKeCxxKyo34z&2iDbop;wUt9Up^wuhflt{j;uG_Sab#6<)D{nb>BGw@>NhdJUWxG zMi||8Ue}yA{4n*lQ)m}de7wR0Q=`C-%cpx9_4D82J0U?hr6*=X6{(JsV4xqRULp@t z@9XR9cm2BB0!#YHsPA`IgCt8kN829c?8fK|Z6fjpF6KqPYhv8%{Af0&SxCF(E9~J|}peC8rDJ;EQh_ zasDAXeac{h&c!#7Uygb8Ecjgyf9dJW1xUijZ!Q?VRctD?zY6>unVa2SZ=wOA0j)S8 z@|_qEthcuA)lG!+k$VsFnb7^lJTefZ)_PH1zCukIo8?CMW*Ts?kc{cH8pJp%@p9AGV15o8sErl8|18L-ylm2W>mXYCPTAzc@#-oe0IQ~oEipGA z%AoUIU3pR(630_f>M0NHAoCKZ$!XL2c}-aacz|Q2-w!2Vp|eWIhaxuDH~LnGSD)8i z1p)&8e95poeNAtI-0#9pR?Z#=ASN+RQ7gd$HDayi{$C-LSO$HrU}!D_sVAuGC(j-2 zc|$9DKrK+ci0gBs?Qi{sFBLSoa2uEMfG*K%M|@u94NIO)4a)!T%HMv6KB`WJYVWb% zW#!3hRKNW9FOvm3kq{BFQs?a+p^a8urUxS~<%ikWA6i@%6o*k7j# zLY8lyi>qaegq~&h%Kpf%hu_>ppH>n8Jo?m71^`^V^Bo-o8~pLv^R$`;KqAYzs3PPa z2V7X`fbopi_y2YjZS$IAZU#=->5{C{kf_0RBsxNvrH#g=6=`NI&ws%+_ZemuX3j~H z-be1;{Q(tQ26x(tH-?OkJwl7~trgwW-3oG&$BgDN z{LAXHNOQ#AQ`uZAQxYEsmNk5< zIZ^!|-d@|h9R9F98UaqgmaYp2GR3<5B*3K3yE$c6j@FnP>(f0dV1<}tnUO2Q=JNyk zRGx&95t5}c?Zz<}VJn#E=(H*0^JN48Y3tJWx8TOhkS z_1rRuR%}VAjKwRMm{hJAVr2Z>ke?W<(6^wItl9~B0&aUSVL8Q<7 zQhX2rT+@sjYw7nXeQh}e6l}=(K?G8P`m=UJel}geN|D1Oi^Iy_0OwYHt%y)JA?a!X zCeme%N|j&afb7{iW*;oqd^h;qB#L%wu{gCQ;hkz_V{{VOQQ)P?5r!(Y-@~id-$|d6 zG3H-0VirtMaV&bVf0;RN_!AU@s1I?Lb3dSHgI_tb_Nac`*rSUI-9qDsnOrKaXY2pM zn7#8*ut8$G{e$-u*K}-NSfQ%$o{#8Bnb(c7Edp77#o+DQ4J1=F7U+Cz-&nAfjo`5>n+hF=KE1m5 zn=Q}SJOc<86W2Sy^oH;s-X>5dgC#+)ne*MWvTuh%yDDRGg~&F#^fn91fE4czm3o8&p)?DGZK zN>icrM~~4YoF*fRhvKk}>FC^NBdb7#UDy!iPOJV@p}vWjt}~b2s$7!(V(H00Vp{?J z*-i5+{=F8lXH)(4;lG8S&-_$@zRc89;mrn2k9U2FPsY&K zxi-eAD2|1xB6PX$Jj8TeuvS^6s$YPwv@ZygD*FiCmnq(Tx?o5TIBM=6DOiV-0c2j4y8J*O ze#jRiG}Y6an$nru|7Lx`b+o^DCEW~1x9|kvJ$@~Kec8&@&SvC}e}ee3J3#|8Q@!I) zbj+B$Z}EKhhzujC_X0FJDJe8K!xfEOuc9^HjXw4zmggNwn=f0GsxM#5GLS6LT|GXp zCfHPg+`0;&;)UVK{ifo#tZIw>D{!W6uNf;mZv4X|{Jx`%Bb@tMs7OLxL%-N1NMPij zwkKco4>?VFtr%5(MB_HDvw)xQ{5;l#7|3pIB(?@jT|^CM)|UHl&>m~pwj<;rX#Bv{ z2z`A)2E6q5JH5(JvK^{ovzS1y#du1?LWGmKqujztne~tJxslgs;<$PWFo^ zuwNLo`^55sN~K`x_mv=5V}h5Q`qQg`8VL{3!iF5=+ghJ|!RSaAgpYT{oQ0O4PI5N| zCp;LdkH(qnD>t05xu&u6WP^1N*B*0cK^#ciIb{uRcO}mrrLJv zyf9i(w0FQbSH5FDN#0Oa_T4{8smXh{~k5uP<_(Me4!^L7Ds}c1K zV6jRHi6aY{iY^ZM z8{qdnn|*XsiSSjjQk#%iiN^1pW#bP$xjGT=>xxbRcbC8X57{(mH!PBOaDxJKCF_@B z>{Ujcpa>>F-X}tFHYNj2<0EySqxnMpveH>l=hJ*gPyI@Todgf4q4X7V254Phf49?_ z@TeFjNG)(9xuT*SHvTB;BhW|q(cr=JUu9}S%SBJWiIvfmAE=92=|n&=NaV}aHV%%r zWxbHwz{O^dUZ^kTf-;fs@mBcZkr*EMBmpOwzA5V^lio4n;WPV2V;pyyE6i)c)F~ng zbkWgLfa0aXYYpM&g~L2`>*i+U*uAQiILo9QW5FkComua&4Z_3r?)Ze)lRt8M;8(;D zszw!Xfo~Mxhs;2-j*U8;>?(}ZR&R$FUJE$hOvS!FuGodP)*{NWcK$!)GiFAf{jEKg zTNaT9?(`L!CHn*z+$H%6t2a*J29i2UJsX`4*^n5<98w6B4cj zs<1;Wwt2`NiAjt8a2l@^67<=cEwrh0U+J*wS%p46+`_5zmPm{qdGwlAmLWIJE9xD3 zy_^r4z%JTpRcIZXYL>PoVpTAe&-YiphL+?>c$y)BfU3Hqa?aXZQzd*#SQ8-Bmyh50MCJu@bqc8`Lg5ai# z|IGO?S-rTAPQWZ+x!R4n`shzu%#9*#cITTM839NK;SSqQu+`+%VuIRHS6UwoUoiVB@ z(g9o7K0B5Y0!BE`ysk>|J;VK)23ygbg3lbZ$q4H~_^M7Z-t`BFy5?r-%6C=bVg7!3L1@0}OE?gR)BNdZI?Fycd!? z1O-u zaykK#!XJh;`;T{KBtV4e<=ZcPX0rfLT}YS3{}DP6%tb5M-wrGlZ~!Nj`` zalE6(`wLh72EXz~cS(Hk+{ZZ8R9=g`T3Lqp88fMHu8_Up+G^`kP!Zzw)XjwTxa-ey_4Q-uWlt)bXRb{^n&ZHL>W2d&u0_nO}oYO)0cf*3#?rGL|K zx@9t=A=`?NLmh3Hln?=^{*K;r>x9zq%kSbS)7}~+A_5iv=C>>;=-nIyTdVx{bB1|= zJp|&Vjf1l?5g-bm>_JHpe5&hwP=E72^*9QSZB@uVKSL{eHID)W%(LEUgt9c#!Q!r zH;FU=FmkzK@s>LFdl;nfKaLe)XtB24v3e~t@>|&X#?^iHmFO%$h5I7p?jROR))Kc52Hs^XU%uB~rqD1?f02vnQ>nI;BWfrErVh3!6j_ zQC;3e6e{tk>LgxL;?4_m?6p@Rf;pcyahdPR!$=DD4Q!s}V7fa=^J-a>5i>PbzP#D?pvguhx{_6~n(V>&aotfh@<$O>c z-Bs~T3gtQH2fIs}CS}$d7~Kn8Z0g^sa%(s}4KOGgOezZ16T{rRM>PlL`3OZ(xR-u$+N zU`P9LJUf-VP5Ihp0Z0f});5Z=9C}ZdKDKJsYpyl){92YXX1Oyq?oC8U02r(>X2i=( z)$K$G1q5uDW1dGTth;ka)QX(^n!*t@GuA6mvB}4aPzj}~Rp`4Yg0ISEWFE;%fBl4TL&lelC$Z{K zJ^2~4_Y5rI&j-=$IGY`QHnvn0Z#qm7t29g_f0VPEj+C6W$i ztP^ROTeMJXm9K!yeDTTo%ji{s8^UG>$X}_xGpMQ^55r9#?z8ikq}*X53_e2 zl{TqE>+NCTUh9k9Y$k4? zde&)BK?wNiq;Hy_M7yi)x(i-rvv^m_KM80^cN`O#))?Lam^p-@{SQvPb$LKpprPVT z|7?M7M{rH^)bT9aUk$Ci%6&H=rG1_PHCfuKZ^Uj~W}_Te!qi2(Us@rKy(MeLM97!EcsJ4z?{5!hGqDh zu{Rhy=g&5>TBw)7#dz2}Iz&H!7-z_rZv3FUE6{I^KQ;=TCX3 zR|uGX7mYPK0)AZmNhIJL=xI>QPSCKvt!m{8cwTG^%#HNDg3m!Y-X}VZegWG&1Is$w zD))Pn)HpyHI?4XU3qii3#-_f}npZySnZ0=J0CUc6ykA?oua_CvqLCBSvGtBJt^|M( z-47A1H}0<5OS5egc50L9^-1WWld#*_ZpEiRS1NAA%9d{&VtpUYGrrnHy=nCU=aH;f zq27V)U@3y>S-vIp%t8AHJcRh6j*-K!J|3REJ>8&Pfh6>9&&PLLXf`AZEP?QC-QLit zT8f6fiM>4y zth7nd=)Ld7{ytm!vc4&qAEgIMc04_%SCF~z!lC6##DTx{3@Y`7Oi5jvHh+?G`0S;h zvy(VV0uCqT0c}^ngYtZ@XPGim;5M6A39#>c14;!^0zktfHCn_}X?DY+P>uCVKhW!y zc{y;V8{{?J%V%MR9bG*8U2^Ylh>l*BZU&rtEk;n^3$k&Zqhh-o*wyvZP57-Fo=28( z%a*~Qp^Nx4j-INtFLLDI?0BSP@~BQEcOH)_5R$Fi2h$m)WkLi9rv>%oX8Je|w(9pd z{b<^aMO+K?MMEp!0;bJhZeh9XJjCyWbz{#vHsI~gm6c08axNG0tLo48p4aFU4*aSu zmXtNJt*qkFh08H7+O9^ZNZ$|GD#7|?LO!!|G!R`oD@1 z1c?-X!9SnMzgie;>Sa>5(q+Rmc_&s$pi-Qm*dKEIPr!oxG8>yro1Dw|)913TQ}#Cb z8J|f;w9Dg!K+HI(Wb!{Pz&mEUt;pgJJ{YimSufz9SM!+KUi?6RsIt!!($ zNJsdt;c5ieGb|Ttj%C`%{g3!jd<7NP9`6jKoaaI;kX4N0l~mG8 zl$1CNb&A9mg~8rFX{h`^{CR(+1S~or=@&~=_(_b|x4l|bU(|0#qqAP=>RZ5H!WUd@ zAYZ%Fh3hOqjeKi9*pR|oE`RQ^^*Uc4ew@h+taU$U+%?e}`UCu}Q`_W9<9b1zTF+AW zs;XECz4KeJZy|z_&)~?(c?VN>tZeelAP7_){6H(UoaPv#>=r7`m&jaW%(N^C&I$6w zPgJaAbgY$wz*AoS&_!I4i<0}KZ6|P039q1r7K1=TT+8-1y4Pj>va-j2J$PDQ77|za zdT;xl_&XY6eKf_!4HK`8Dferb;j9QEk$z_y;0~_CU$;<_WNOy$R7^u8SpWa2asw z^WOo7p1{|Z$|pp#+QA(Pceoo+q0)CRmgtX> zsCQ!fpN|EKHz)9CAG$j^ejO)VPab&4O#8tTG;ktS!0NL74}WSTgMNI1M#7asQSSs; z$oVTsD!xvpL0Q+qM_!G@uAjbMcm1=$t!!GT zJ{S3rp*p`IL0|ltM;ElBxc(-Gexmn}~vn&SZNBhkVem-~pxGS=(4A zP);wNp^>UQI^OFyFa2RGctuW_DI%=amoB5OO1r?Z2sO9b{nzF$=9NO~85S8TeaVK> z0A*jgT+sPyFShmG_@_+mJz(+USpT3+a%aR$<5uKC4X7&CwLd>4g7MFvZ#;SYOcro9 z=Fs5<`{Kz;2zTTVZZ?L(QRv&d#+;8;pE_rTLW5Vj?d{o#K9h8MGZ^jz%--<{l&PYZFH z{sNNu08>&kX)i8)vTPCW9QgTd=#u)YRZ(kLSMhrN3#l{EqE&IIE;CA{0p;zS zJf4~?4wTQGk&ro7I*kf#TF@6bYI2W~s_CY9!LWAoV*4Pq^3`kd5c$IFD*&iizOfSg zVSBK7;VQ;6UX`(YV3grEy-_89(GRz(u}}rY>gj!258v~}G6yeJ&yDz_;-U+1eIG%` zSoZC^pkbcTD;(CQ$3n@_>H2l~8wrtovJw`%;sP38qH&*uJhxXoUbsvK9S8=iup+N3 zF$Xxmkp3{ZtPU!_&34RmbTJ`UM69bO54ZHM=lMO{vbb4taeT-O8la_4^O&1Qz_?hJ zq>3T}ojtt+=A~f2++9iS{M{@*srItkY&73`h`!`(b~XTidQcLut^P~)kL{-FPqqcv zcJ;kfkktXEh~deD(_Ry|6_f1yCPpLkDt$)$cZx4Fb7gDRVfDf9SSdIcK6CgjWge_H zUc^DOQxm=${4UXr#~u&r{q41!&EwSYUOtD~0l!QunNM37Uf-s@>@i`!e^nO0nnuSZ2NnSn%xlvnPT;6{ zsss(1_oh1>Xp8(jrWcl~w$v~&$G<`9tC0it9Nn%D!2lYJFNlwMw`r8a;SKpPY*O%5buGCi~ur zH&~T!i!;&X8h}(P?6H0HQ$fCs^sfPZIlC|YD>Pa#RddnM+wm)J_8qe1%E|&B<)!bV zUt7OyEDJ}=dTbBWr)Ewi*wFp+7nXC(>%C=N`dIgar>PkOI5U;p_o#7S?D>?iug0E z_OY}=96Rv7tNU#q|$D^`W|{=p%mGa6hxKIs40=zW(xz)c;CBPRSi zN#)!AY7_1f^7mUwt*=f(l*Um->6J~FXK<7uNRN$$G2ff==k>&={-CuJfCqmLc1Q`E zvyf9soYc1RZ<0XX+RqP^lfZ9C^O8Oxlw<#B=beO*r62s3?D}Y$F|TX|t|rWsLK!mL z|HyA_XjFvrN?;r9M6FYme34FpJ40JC*>S9)0txCa(QO$}{DBZ`U;b8>U&#X(42qge zF1?Qhwah+6sG@>!WC5sEgUiyYFAd>>sUm2i%!A%dRnfYj-gF?)S^5P(Xh9tAxY+i? z)k*;X5swkpDnBG{03*+uac|1WlDlbBibItQz)#KRtu!6Ia+ta&Nv|3Rt^-6MB~Tif z!r0xEaiPnl0PMvn_J!O2etvS~)5EP-(FsI>MN%gcj-!n(3;`ffZy}-C{^zx_flG%Y zITX3yGci%b%60@SHhck>_aJ9gxhz2c)f-g$NNvr;D!mHF=L&^Z`Fi-mm=uME*4jMn zq41*%lW>WbqZ!@buKU$)NHTwdszP(cNJ2joZyJ@FANQO*_D9Up%KCnsIv@n-QKZ1e z`R={B&7(uv`fC8ZPL<`3{azk2@_5DLGSNm>_w_yqYmD?Hg+pU(8P8-lgt+MDUUy7~BW?Vc=ApiQRF>*EeF1;O66t&b#n^N~C4} zK%hf_ItrsMocM0^;|p_Af(NhrqTWSEtCFCh4k}z0Ca1Hq{)efB>qR~e37Zoer~OqI z*8$&aPf88U5vvF9){Z;$4tvr@`bF$aPzH}z;^omZmk*&_7MHaiPX&!^xl2VLRKs*d zX9M@kiUfN5gk-T+=O40;qkPti#+)D2+0}J!YN)V>jP|>5$txM(*@4&n97{hS#OFTU9x2e|)rwYgIcPgHWunmszAEdNr|fEZ?g3 zw<7pF!RqVQbsTShqA;d^%zN6q@>EBVx|sls75zdzfHI=R9@S{+&Vk&ylo5L zc~W|kJD>8XiX~AJ2U>PD&kNh2MCN>CYYPh7cxgya505sF#|woXWAD>2Ra724GBTP} zsF}##&Km)(>stYrR{|$T^@?Ioq4D`s9E{< z_AOp7?!IU2o2|`W34#21W3)S8<@yY|E8=Y0z6|#;xhd@H~NIBRmdm-C&3gKeoRt<3-YBz(i9|C>Nc9{J75DtYcZU&?)&L4B@X zofj+znzE3RNsDtvi51BwTZic(No#AUm%qwFrJMD5**Taq%TnVKP=15|P|`AWO?E0Z zRcN+IM{@KiaWqYMk8Sr~8h<|r6hbH?ADe$`(Bu8vhEd&-f`_uk!-@)9ng7mVFDk!dF{`wnpX(~{DB&RvJSlKjLUlZPqmh$kd_nNB% zFIGuGmrT|0g`k)EoE4j=K9F<}Op(GME8jIr?pT2Rl3-0#-8h8SoRN6#EHIH|UDd6P{p{`~p7P)nH3 zrPE2jTB%70`-A7Nz#Jx@u^oLQA!oj=>Se`Rt>L81^Fv$Y`k#x-^Hz(QKqGZZ=y3g0 zTmD3~RyMB`!QD*Vc_^wMhNb+F3RQGV)6K{wkW&IJkVWuuX*W_3c*4Ihw0%e3|Nl69 z3!u1~Z(o!s5P}2`!G;jr-AM)r?(ROgyN6`(5L^Zg?hxGF86>zvaCi5&$@l$F-B-8X zJLlf6f*P2;cX#hz{afB^NQ@i^_>?CRSK(&(L-gd!8m$kzg$(7Q>-zL)v;9h0>fL6< z&AvB1!EvIMOjC`8YM9e)r^%o>BEr2*k3<$A1fsh7KLAz99)EV~x4x?swesCNrpdW# z;Rp{HD}Yi9v^c3zL8%fMoU^l+7ojUPKW*X*l)P^OfCIL=j4QDo>?cE-uh)Epnj)xK z*Uy|}U%4UjXB-Xehysepv~5VveK{^dCJW$u@z#ILR>SfK%tf~QIgm-wUwkHsc3bMB zDh-wIfm}Le2AnWQXZ6^UhN21m^}=&lc~hZM@BMjBoB^o0cim`{4nfPOoqNT`aScz# z=c-fsb+WPr>XRWP1isrTY0064K@uwq&Z^3H8;raB#$6X+0lW{YNASkBCoW_J`P$H4 zH9TOXUS337lQk;{bJQ$LB|z-_Qz?HhL`mbgFcG&$RrWjNLE=&!!=YjRox$IKFJ$R z2MHNy4j$a}=7bLN*YRAW;P2FKByAkp(>Xsyz&DPt4IfxSt2AgcK5&|$gM9!L#9uW@ z?Mp15H282EH%G3vkT~}Co0FS22aKDZY_O~9+^6SFzYE!yH0;1sAIN;m;9(Pf9PsT4 zu`U&+sfgEGN0j^=MhM*lXp;gaPK_NTk@kcDU%X;Sph_pONxu2*Dw4YM4>a_7EK)n{WfeHh+z*;EmP#e1m8Q}Ob-d1xlwJF6w%C= znpNtg^5Q9}`=wyCZT!k+SK6DZsI&Vl!t+(SAeWBo;Ol$A%Y!~!Cej$%8zLa`x~MGw z@IHXSGD#wMsUMwGl)g|SwUo7}f{)V@Rt%CvLu{Bsi0`E|zKaMXYBV~Y(FeuIvUXkz70QV+8I z*nw=vu531KeY=GL)wC_>_=q^tmD#)@Fp{lfK{~Fr*d1N(n*n2)L=hV*ePWCI{bj?K zsY@<+BqzW-?uR(&%bSUYWfbPOnr}6%at=``M+VbqH`D5EIb(qS09! z&Ti{^9RPn1eZ7Dj-Wu&t%g4wnSwzvTK>^b$9PQO+c*v~Vet5I&cx|5?bm<8K2TD;$ zcVq}9(`XZ;AznRAYoEzbkc_*({HaxHkvyK+n-xV7hfAR3b2a+zT)@H3Ei`BGP5Nz4 zD)-HRi;Z;Z>YVveFyQGq(%AW%=&Da{Wdhem-qdluf;AgQFN7&s#{4xENK`|8qES#R_S)ybg_RqU_xC8Yr??N?cS8)s|>6>L&8y*zcb zc_A2>ue%dxc`m$*v5_zNpy3w9{OSUm9<$0mTxLtp4z3!XVV3snI$?pWoAwG@H){5N z==wA}7A*3HqZzcP{md9jN^zyb2v$mXx*GBI87(H7|2J%qFnPqXhwc6G%}cNnDFHHy zA6cmqgJNzOO-Fh}(>@wRhSx1kNb>yDT>EoVAK{Gg7M>y4ZT z&s`rCNmY>nY;fSHb%dCotl&dHKT<4){YGQ+o%PnlfV6g}A3^n~1QK&%GIydm2R9N( z99NS}u_tDG4ep%ea-LEBaF%q6%R9t(cBQIo8Qm9cpSAvRF=v>g|7V2~MScNiRn=*y zp**oJMwrO_{+G{DcSgQ$>3vJPI`;kRwy%OEP=Y1iFa6eWP<)aJ0?t~)XEg|tB2z59 z&ATd>ok(^%*M|k@xGyCRqSb?oR*o*g5#(Z5v$KT`XeGTo-zKpfYi~V$e^s{ADVuug z3^lqiT>pt`hD_LTHOTUvGbawjQnN2nNh58UmakjNdL+hRkYP$Tq}->mL}P&S^HDgh zb`vJ#D)k4#py73&!d8(%?3E(WaIruGow{TWk5m{&`fyJ{{%eM~A)~U{n|^_k`ojFB zxZRIPEl4k(dCe1*nv!d`;UR?@kAFkl1Xe=qstptjUkUlZ0s|+X=<1QZL4WbAR7{u( z6ZqHp?*|FPQqxEo!ti)*nAEjb3b{1;h25|im+*&WJ0Q4*m^0+%N~vkf2C`qS5@78W z%d(I8NJXGUPnb^C%t)ACqg5qeoq^Ij5>ON}OcL0(pkfWn!D1dayz?wKJ zttg@WDcZABYI#cHni_Pvo=sKN_59ecn0TYOi-3sn+mrwX3DI9rjI{8FNsmF+#AK3N zm$i@0Lgca8k-c4A$E~Hfpw*g{9Bb?CV9|D|p{AROFrRxkx4P3rk=f3+6TP}>T zD|Jx_|6(Hh3qcA1P~=(N;KcEH-TR3W*(nLhN6d_@TzhX#Fbd3)VoCZ9StsQS_hZchAE3ExFQh0iQ*(TPt|7AZXTb$Bg?Y5;xngh`xFn;u& zb=q{S>9&uaGKuLM_o}12P1Dv@n1IGsh4VWJnv0$F){Zx53Z7}Ex!rHsq!B%zEs^4c ziHaEH3FnLD;2OFjY5_C>4absAlGoJiUn)ym93V%&m~fny%dCiwK;h)9zQH zdM(@hZ3quvf`*k78^HR;lG&XF!&PZjwL(s#Av@a{x)g6wvNt9#qmAri(lYH2m4(|r z^&OzTphkfW=RPMsZgo)=m6} zF$_<~vmfz6`)#IY{|7wWJj6*56hBxA8csxSHS-m~f#LbRy5-0m60has)5u92!TlP$ zR>}T_d@1BOIBkLTq1&|=u?v@QDbkzZ4=jG}wuo!gX=2M4Xz|juh*{DUl;x+YMXbQo z5%)Fu4tm^6U0qm;z6hRPc;I1y*=7jEl-Xrm>g0mF#JqpgwRAU+3cSL>VGU=z-jWiT= zc7C13OP@E-pU7M*S)%3SRzxB@B7;P-l=pZ!wcVGZd}?>*qGVu$mZjwoW%#oTAhQl% zBHw!2I(5e-;m$(lN4o->sQI!>bpXR(jr3 z=Fo1Q^||0JvRiFe78Ny0gbL8EArq2)jb7B>Lw?|+RwBi=IQ1{Ixs6_&og9Vr%nf~0 zTa^e+Gn)L7aHKW{*^2D#(Dl0eoy6_5#c4e=W_N9NG36nR3HvH8Ics5#tS~lLi@Kp} zE2XR)F}t@|Q+iixBDlA2$pCQL^+F2FqvF`2BiF+GJ|-7yp$K_H4(?dS#r0no3Quf| z_mtLG*`zh4ilq3|HC5@Nf;BYg1Y~{4g=3T^au7jg3C?Qu{C7Vb3mU8`Cnps3=!Ucy ztjptHUhhG}+rY}|>YsFVeQa!eN^0j1h^X>%jkf{fSDgJ}6qzE>Xx{amCPrgoVd0|v zLbH%R8PsP(R{+WHG#u7(@L1=Yy&OVr2jCdS+YS8|JwHR#7r#_8feW!Z0#jmE=_sx% z(sLvh(b7%e;*WliGS|(La9=?+ndFQPgx;>Nr{L+{wi#>zyQp)mem%_5g)Km6Y?azL zPS;sM+bgIWYpQDCwnI>Glf61efqLEg^vsbWs#jIFelJo|MlAJVyFiwAspBn5@lADQ zPC;Rv{?ElXA)kvIj-wy>s)9ng$I*i|&vwu3+>eFpnFOLlGR!=t4Gh{SRz?D}qqEQ8 zzE-kLM{-in6DyBXr{`iY(nrm; z?rJYS4Jh{iJY5!nOr)j89ysze^qbZyWy_hpa<)8xjk?Z`Po`)s$`OW9^2}I0 zT+B^cyL>EQ>ehdu$ofEI%s|oKykVP^)2T6Wl);CxPvDDBu|T4HJ`QF z0uvl5J_BJkMl)b~4z{y%lb)a}1bEjKe;R4$lC6kAkXBwV!TFKLJODvk`dBYRIvJQ^ z%^hE^dw6yaO56LHj-KaamhrDYZ@M0-eiRnXwbRmS+76sFrL5G0lJT1b43}i#E)!Db zbQ}aem*?=~B%x4jLb**<#I3YjYUdo8GOF^a}G4hjj}J*{pK?DMP$X zu?;jR=LP^SZ=!eAqtMb(&EuNLs~;;gI2c?oZdFbya_jVYKpo~=$EUn0?(VH$Uzk8Dm)7EdLkq4=lxM!CM@p=( z6xXg-n55Q&$_FQkv>hOefIpgMn}D0}N9Wx7MUBnPXl)puy>T6yh+j$VdR~~ot+)-< zFb*yjI7uZ6uK#edw=wT^;b%}9o>yf$e8D+?=^6YBZsBbFz)^jGq;Q{*kX}$CP}J1a zv4L*2XzhItlLe9s(=x$D^it^WWs^0IW_GHj6RRv#z@i?D?2~+z=Hr8>vZ5yNSTU~C zzJh8U_pP8U|LMIH2cMG`e^jdvI8OFi2^auo6Tf;ncr_4FJ!e0dDQ;Y<){xbCeAwpF zd}9qH2GSJen=DKnY&xiUAb~WB8uIgdmJZ_w(7=IeG>irLCS4jUM`|W;T%L&BB6@+_ z!#eP{x`I*QP*auaS;h$Jz5+_-G$#}IL^|0(SN6u(Ha}U{RrjsgKtk+D9}f(?=d7{k zHNTPUa+>aPuD1Jo+&Gc>F6>CStgeYUBG9GEGMT&F{VX8|@xdX1{p1?p73@)v8bU9f zYKLK7AO3@e3`EsYGoPJ{fc@r&dp{Jsu9c(vmh@JqDoc)J+f#mnyoPkh@ek>O516f8 zd$MMg(^%!QT-W>bi32#5iX*Heh+5~q-X3h25FLrk+;D!`&?jAiSXO!ykPC{V9L_uI; zIJ|mV)D-xddF%VYIzBufFrReqeTRNU=3$8K$z(Ae><|M-xL$UO*k^sFi>XhZz`zNF ze)CKdql+**71@%;uGLCekTc(5PqyvnzYugBuIRFdge0Ti*KaS%dUq|^pZP1S^C`fN z;X|BS*Y!U0u5j2}&0Wvq(c@%bNf|K``{$wI!NGG;-83{P$e<F%t#?kamj*YgM^pfcxYE)ePDI1+K;bk_cvVH@}m)2;{jWQiOyEV}tFAizFwv z6>ew~753{I!gB|2ht)PeRU?)9%jK14zJ~*x{6iIsqmR31R3`D{i1H$5N6WVL)}n;p z(0%1;K&2>!s$GqiW=RmnacjUuY}~=1j;6NZ?Vom!otBJ;cVxLkiFe zzt26&fUMaM!)7}XwBy!s^w_VHeD0ZT8t>v9lQVuOcwUXSMakUm9IwrK5(Bmi{g*B9 zzEj3#`<>gX`em#7d58A1A@B2Pf}8;bQ#wkZJ~;1|@N&})L(@%4$cV|wjZmD<@zkWQ zjV-SgK_kE=J|SJr-o+V-{DOvylGJZcT~*g>J3nrkX=IS>?aoXgPfU!zrZxY@u;~5H zNe!&CwA^G8ZC@1JvpdZ`Tb*bkm8brW@USkZHQWQuHbQ>oB0xi9Hbx=_zGgY|o7**| zXI(n`^k@2l+;WAwb?yCH>vT}HC5Pl%en0y-0K*!pVxvK7Z1z1e#MDKFJ6q;nK1Y2Q zcqMctzYEyQ0PSn&9XS-60L~hv%4|6HWbq>vzFz4RpmSy`p;sz1wun6{Z$0lGCF`{X z#@4mtSHXS$Ze4{FI9&$AgJ?Th%{QtL?yzn~h7#$LYg(Fu?VbJ0?T}DiuTs0P?7nFK zWr_7~NFW^>CKJ|p`+exFH6GW=ruR*qL_%cd>W=IXA^M^6yms%6n9C3^>w1|{r zM>Rw;7P4d!VsT=b_J->0j4LRB9y32YnSAT!=fEZGClu|{Vn$Ug#;E?iJAM5}vea>A zf<^|I!OX1mx#u&b77Mx}3Dq6;YLT|I5C)$8u*uZ%-*N=6KPM#8`!qikDHk}GOFplqUE+#m4bxbu>vL6mSTx3&D5d#`kvxX6=eE^%dpSdFinxcf(=OvwpDp^?2tPEHY0u`5@D{p##ePpu%n7k1qyCK(_oRm?~` zdWmLPra0Xn_nT+Xa7otehHPz@`L~>lrwv1+C7jVU+8p2>!PHA3mE>iEy<`_1+ez&b z4@50Y7@7DeWhx&l>sMn_w&U`ll#2<7x)}hoSB~btC33~i3|Gou-Pn-uajU(Q!bb04(C$S^~-UR+}t9xdE`^Ad02EhHbcs6DW@33+zKhD)wi0=eAV%VIsnqFkza> zO;nhfwkw~v+ZlP-EbOXAJ8dReC|pj)q)&VWQr54DlhLFU^S2qw}A$^&MlZ^ z-x4QeBZCMTRMSRq@g>Sx2K>K15!H1uy#UKad^V9ooe^SzWj+(Iq1p@+%>b7Qlf_6H z1sC$%p%uWb#Ubkx+i;mr9sN}}L6h6HsE`r1n{_*buGfn`Ml@ns>0h6Ym%{JuF7-LB7UuGlc53)^fK(pN z5)eQ)Jx0q8L;TxU8-j|o9nnM5NHFdK_rs#t-j2%3&O}a^K5}r8ib|1C>3_?GjczzHY1(T&+5?dbkOIk*Dp~)nPa&oT>&t+=ij!@ByvVIbrq`& zN6o=vPEJ4aj#(iptop1c(I!24uWSjBIvo3ZxtaPo_ zX?t4&2^1m6^d_u3eW~txxgRiGr-uMRqQC1Sm_#Tsq2W<7Dcm(bWOCw}8_mzQ*A2ts zudH1x!ZB(+d#EeL6J$DIUMda`@vQQ+L}4h(2H?OvcuKj3YFsErS$QKb0oogIlV+XS zq2uz|jwZFaDvQ3K#L7wTWTAO7^VK?Si9l&p6Bpr+Dvpc$MU=%$FHmC|+g)MKZy-V} z-wJoMo1{oz;?mQ%w9x&KcrrYjo@xXa`vc~YE1f%4z$ueI22dZUC0rOYPd@TJv?qOJ zGeEpKZvwY2d7^&b^DZw3&nT9Yy|Vdwdynmx%_?8{ts8WzJ}MA{0v}n z7QfQMgzgnqzkV`VK*t#kHJO}@Lweqj%QqvjgNTfMh=I z?bF7q^%09=?~$2Nb!9<%SY}bI47exKh6KjrG>I0@UfGqPvGV<`a`#~K{LH*MzggYT z3fg5uH_>GLc-TgYiz63i{dS+vwEI9-jFZ&<;_LyJ&msLaAn|J39~lai05Nz6?Di{m zYL>Wf8IF|#kwJ-7`%;)_pw-!|#FvPrl5y4s=O=ofI|tV1o?t36U_O3b^Qy zIw{WWX%t~~IKe8Vit_f1{{_QXcCL5gnQv+NGHprXndMv`pk6%$4dHch-ryTAMnolJ z#zOJBJM+KyPE{%B;Tey#;b3|91=(-eTXfN)#LHpVE>wLw2v6(6hN8(pLV|W@*K0nO zcxUlIGpV=>;_$i?NByb*aH1&RRRDJFLl0qttv^;UQc8xnxR|CVdSk!3>wsh9nOboO z;FnLAP#8VE=Sr&uA8t(+JA*HC5}o-4nz|{id{A2IZw^cGX@l`9S~3uFEM7o`t4{PAwp% z4DugrvJNG9bn6byKQYP0F09X6U`k_Ye|lY zI3)S3pce2gSuHe(cN4O*6QG9pH5ideAYI+zP@*?^Qp8zu;m0!Ho!@=y#P(vCG0BoHL(y$L(T8$bYMj3__`T`ZiW0(+B{))FvNEH*xXpr(#5 z8N#~pkZ!K$7JZuC4)b(8ypYSqBHwo0SZ`$$79A_>OjI&|^Ib9};}0W+{~&@u;v&!# z8ROu4`@{yUkqkFO@JZmnrBLZT?t&uSNeLu7x2H;697^p8F6XD`=O-`P4tz9*@B)!Q zvsJK{suot2Op`ry_UCSSNvS<_)~mL)Pkl{G^iQq_28ewEF^-!bK|bxn*{wq=P@b+V|7DO= znmkFoUz1^vS$T&+DeuAUJp1Hs=}CvSi>_-Y4rKsU-(CeXZy?5_Fc8;2?;jk@M&je? zfEeUO(H5hcs>ZLynw* zrs(x^uqct+?Ax40haGyx`>P?wWV>sA2lQq)JyJcYJR|>B81;mz&Q-|=N#~M9=UUG= z?Q2&}ixM@OxV{)biX~Irof`JqNcJEf&CWgi`eMknFPg~&PR*e<9EU|jiu3~G8N(w~Gxv32oB*7J|A2oxi9p=ItCKxhBjD?*0U zTC+t4GXkydr9;bwxn6@(z`X;6D;!_iG}WG_Auje7o*ct<`7i(Q(%~kW;X9nz)GXD8 z3CuM{#4nOu10?j=doX#w<7**tKX8_IeYWxTm<1fpz`wpJ7!#wz;&uHM_1z4RGm%#M z-7Q0yrX)WVP+2)FO+C)WOHwa45COMAZ1>7rcz(!BD;|1`V8DL}sPTsCl^Uw?DLn`X zZhI|Kl-BVqRvIgXi~@IGUOj(FlFZ>Xv6?qJ%2;h>Hq*r3ogs{X5T6T(8R8<^fyatZ zbRVtGKpq55RKXOXjEMTt?pBmbh2yT}0MW>*pI(bBQtfFO7C<||Z(ScR@$h4K%(g2X zkFms6Ka9JqGs&m*wwuI*QTU2m%bJd$_RrTVQ9@?wg28rl-J@%Z#n&~vG3=;ErcewP zhtEG0iM&p+AuUn8Egglcgx`A)2ttG}ZyU*fl0h$@VV~^zY!Yf?gEHsG-UA8v-nuq6 z4}V&xCMI+sra#o_=O!l~0L#ch-A!9R&m%GyFixU~U_ze!Qlqi4+G<=~?oRRC=1I1m z#2!6pnsq!Im(3P>4-S-21On}D>Ud)r<||G&mL!@!n$i`>pchgD`B8k3ogIOl{u?D4 zGwIOM=EcczW0NlA(b-Z0cz(S`_1#Vo`oqO=-}@i&9e~6O*i`^4H>M;i;L3oV`D1$M zUPSj!&e^U^M^VO!e`t%v1$-S|)8obf1;46{6(_)ceQEu00_P*XSPls@8I+Y@YQEbm zGKNq6qeq>;wJ&0 zL#-^fZ82_M`JqbebGzN2*bI?ANf%i>xqOdesulV%#MsLOtdvfkuNtN3Ozv}B?-#1FJ<#!{Y-;T z29+u<*(W*V(Y~s~TV!%Dg{8s8xbTq!{Ci(^C`Cz%ScioH#0J^V>H$`zNUhZCyrS-$ zNE(WfW!@7_6C|9Zj@0)^eL)zPU=Zt46wI0jAImL)?#D+e2_&r#C`ff=M9;O}>L2R0?@qn=%`0M?t1V(ro68H+^> z@OR_-kvDNlW9N=l4G;In0M6*h%jb?#&&=NN5eH)^$SK8g+bPjSj7ufFK}Hl(`hr0g z+ZPY&mLl+q5YDc+fbkPA0_y_BAlCgkj03S&>|Z%5c$dw4-4BTP>czc15^dJVkX9JHHjjx;~unjh9aD%ddKoP(^tXbt~H9gXaZO=8AK9b*$v(;%l-Z)Q0;&rLG z9#07prcuSgjbrrz_#NscpRC|nv$Ql(GxtSqKFzoGrRiTyd!2aAdV?*{=uVu<^(rfL zzF($CK0bW6zqD^U?k`s+?!B9ZX=E2sBh(b;ndZ&*j@+&_6X^Tv6#XPLP3cx3uRZcB zUKr#7`W)KJ+nvd3X1wANT&7lA3K;llCCTuI&mXQ>aK50R3xRMgY&?RHYFJtBe@;~&oIv>BT&{T503W(-Wae^^%*hrdl& zv8};zQoQNkdjz>e8|R?|93+u0fFy5w*N$m+vH>@EH9YnQ%?AZHeY>ka`0NhaJ91Dm zJGZmqB3&RhgmUs+hVaqPC84WCfTl1kCPo#ze(RDug4=^l)9gY@m~NVYE19WKOJflN z$A`Yd5a!(%i=Y1-2HlYCy4UKpVUAzHVbf<9GVpve1Pa(*Q|BxpJy z9IdYdoO;ROY3Vd!#B(#7C#2Q71Rd92O;(y5nBXb82|1_dPnX8JV44lt^X0Xg%oWANr0L3FJ-FzZ+}DGHtK2vt989%&})`(j~I!y;I*>{sTtG+kcr~ z)uOkzRd=0F`EYTx$l}1;cs4QOvT)_wjmH$BATJ)1=XGP(J%4ogUX{>k3>z>Ze~{$3 z2LOZhL>q>b)1n3`ca%;(4tQtH=dnHZ%1>)<#K7$?^aK3>Zje&S!iU_N^z5Ozqd{K5 zhLb^b7^-4!g}ad1^#|7X(Z?P_t$;Nd8EOFVZPoSo+rr^@Z0^sJ#X1Zko>iuH>kPH8 z9mj)Om$nZtg^ZB_)%gVg=>7gYe8j14u@P7&c0yM34L8smrrX>R>|D0#L=NNSqf5XO z)B1%`?5Z6kL5dMX4n#}9*mrxE>_gxduR_<-M7zPT>5=B z3`qvm(iQvKQZ=9uk8G-2ycC7**=U*kr4|B051yt=74q{2^u-4oQjFX@j=|(vIiuf> zFiW`i9ANdNYOYS_;N>DT2K?xDyzQ+Y$==`vWhubEzWu&@;^qL6O1s550Oqgl(saHz zBI?&RuSmt8($aWw8vqjmYX1Q4A7Ah8d6(uU+a(+rrEaZ#_ss$01`3qLFJW5Hd3bhF z@UUe~-D;|))C<^MXmQ;uN6G|uADi#SRhu~o*kO{mx~@wn0VF#8kaC~FQ$>vQr+{T; zVp7{_q?Z-uWssP_!(p>;R6hM-ty1bE0MoBO#GDJ9RQkB`oM25`%Gjw(yF1Dk(d(5@ zpX;0m68i|2CrD_@0SNC+jS&d!RkWJjC(V?EnLyE7F*^DDGwx^LJS|w|oE;Tlt?C$9 z`4cc5>7o_UgZ+(@g!nsrr5DG%>>?NeAp^?p*46OLKK+ET?iM~I&m z-KP8;a$rx5D@l+&Xqm*5S26W*w6_|Mp2f)t7taEZj;lN^jSVx1ol`T#V}I1w_oJJ# zm76g=2r5H9QFPA?oN(r%wNf&~T~=21+xntVbM_bzcHe*@#Lk&oX=G4KD-GU1&dF{Q zOGA7PUhbEU0QOC4-DUO~l_UZsjOac!+w=jm)Q_Ggl7a;2XS{? zrk{E1vJuErDVZ1P(7;p144f*({}T)F3IV|u!B|@U?H*}tr-8QZ5st3+b=u;=yDiaO zr?051FaA1HlkmF$Td9x|;B9(4TEJQ8#jq3JjYU<`#D*U%W6tL(HM3r!u64d}T^HF+ z+z9z>7^6XNVOH62HBtTGeQpTo9LkGahBKMxgZsAR+rQ3Fd9PU(0ipyPM4=1e3_u~l zzhNK5&ClH)ZBZJ>CmO;DGC;hhKb0UTv!UVV&yVB7`cCzC-$qe}*#^kR^hapRrU_wS zWmCE#ZWDIlDbT$Xy3#R8L(AJZ`a3UG2| zLV*CZ)ebDkYk^FKUbIBTi#znh_B6c-Xg?rTWn#5c9$)#9E&YTqSkR4FtKB4tRai*b zcb#qnQ%8L{knGaDy}7f{H+=@L_?Zj%Yniv);<+pO&r@KOM)oIiPjsma=?x$w$=c#! z<`jSz*E(*%(i!kXQdB#nmC{)->qEdqSzzMe4*%NNr0F!koN_$a`pV!Pg{*Rc6RoP} z(8iI)Hl@0|RGOX`gKEFPZD7^JUa!$HDRBG=!fJ*ZkXOM>;9w~)gruK6)|IYL5hzVz zmNT&YZqsDF8+a>uV0BX<8)J9F?&ot)VsH;VXKK_Bz0v*4lPi~nyZl97IVFu425ck| zbq7a>$Uf|m#v&0VGZdwnr+~FF-D3#Sfrs=#L7nRB5>Uc7{t`_E1CECTtCeyLR>@al zcZ$07Bo>j+9z35|x4N+fF5!YQm22KyUpo+2YRqr(0B*SYa&F=fOz`%O1UaU@gJjs^ zO19_1axekRvqr1z21NJ@_-S!> z^{mY@<3GXU`Bb8H-;QAebVUlhW#FLcI1c`6+jCI$Y_qo)El8L`wM;FuK7*DxWZ`TQ z<)G;#-I4guq|U?j`fN(II**7`C@fL7E?K4T040D52tdM=1c0q+)nI__^xh8Wkcnf; zaQ?C6BUx-uhr-o5ee%WJg*${>#P7j&KI#cg;V>RhQXvMLD(}m~?c$)%;X(7zT<>}x zt&G>EFYR(^P5VrHG{EV9tPh+wS=0P6hOA!m-2o08fT(*{i9KQ{m+d@KYYUt-Phu;z zi)MElA&~gER^iE_qS&MXYqLsQuDNfVuTg*ze0y|6eX&ccY4C@y@gGku&-gDs+~@nu zISpAf*SqQ~@2!#e)Jc#>;1a-HwX9WD@j$D`lClK1=d=uhF!2^iB=M1o&N19jD4v$f zMBVt%OTJV!sRPgZUZK%RV?6^XumcdWDW$6~oLzwX>MghI8`FeU z)ufQjtar9IcgdhiDg-Z^wHe}al@!7PBt|OQC$K_3?*prXxZj+_O@oUP63mv9%#%~M zZyz-c1bB!Tm{H+x?(B#63Zu^hXTo%|PpIHIIZnqGP1$YS*#M$?w8S`aH*t|XtzyvO zNS5RVk<&>#N=cG{)g&%&N#oJL38QD<%8`>_mwW>NYzTi%NnNOD0Ty%xG)%Gn-;~%e zF@v)VN}~ssGHGpV8>o;y8kGjCJ@~LgIw1~R-UkR#{I0givk#}Uf(w`57kPo`JwOXa z0_l3&Ud**`$7hVk_-{+JC#jE@hcz{p)C*+@!1s>)m+4}v^ls2jO1!;v*Yhr)0)A-J z#DTZB)W9HY4@n=F^2iUq){9L8BNI*0PZPt;ynV-6MZ%FIup>8`?F z3>MS2+W%P5G$;lH#@3I1074IH3hV09O4E)GkGI7G^#DZbdiDA5lK{!`Yq|p90=GVn z;haC*5l1yP2>Ml9dy}Qww7Xr_i*4>FA%wJae2E(plHT?W(GbShE)m0n8H9EOs?QSJ z{t29`2#^ltbD&IdxNOCX&l~|On>%i{OX>agp-o~oRFM1PkxlLMh3u3gcnRs6RJa|Xf(kbt2|4W{qEsbV%1yTy?^fhVi&+WflBK8Ws&u_u7b*z;}i@tO)PVKOSS0I*Nr-+7bwS=!ANCL zKE3Zfxt{IBy@5{RaZ8OYVx?BiqHTX&GPq}MV_~+?CB?TeRxxNw#~d47s@7p$UZi`X zXyzuO-Hsh0MtFF`VWqY4OB2Rv@7C~^bt5`j#kNK(r@hK<-aPo#_r8ID#`LSvr}+P*9*#zdE6g2h)-4&jqZWhg@O0j-B@Fr{L_Z7f)j}gpjDI zn6L@H)2h;y&tAWryR%Tar-~Gl=qpqGcMV!L-{F0-WD={r(ati)0k*zc;rNzEope8_ zv8ly;M=~pNtIsQT-?4_5Eai#I^}(@>E>;CN+O*zk@&_+p6DdKE(ZqLQGEZMUK>?sh zE2K%PV`Z8hkhTIp0>x1}oA2h0w+sOII(xm_P5Cde`LgSL1&Gb8tFWD2!%E&RFRMFA zDm(tzl$;I&nbiWQ=BY->+5Eo8aGa@rDKs&w=C8tsPXItc3V*9e6Ca+Nxrcq2cetxOFndsg<{34(r>e zFLRViN`R3{~-hk%Z-+ z!4j&i81pcLIz|i=xJ|5OtGQ!l_}RIL!|3m>Pqxa@5`EgJ2|2p=oV_mgRAJN!BX!cr z3VD_b@&N4WbKzSql+web(2A=VV;OIp0n>Ze+j2j!9Ut+Y3pYJ~wyv%5KfT!M{rV@O z^PfKvrYKiTd6@tCqvi1b0?2xDNL6yizdK?5LHH;rga40ep#PJW^5wtk&F`=kMS&Op zLZEG+&?A&Sw*L<3{`_!y8OLNo0*MZV8jYGDjKJp`8YX*tWZm0^MUH%~MkN ze>Rcy96VaT9UQD&qG)drir1!JR%l^oXg?tYm}C<8z$j)^@Yp6nX;6T z))qSXQIzU=x*wzwMxi zIt^Q7+}ha-63I|%SzMSYoW#KZa}mn8xt#$U`Kfm*;3sZ&Hg=LG0>m7%t4$q>f9{rg zep5%GLKflQ_6Z2INt2?$@=gt-zHoo3K$k8@gA964bMd+ceGmtbEP&Pmt&|Okyn6ac z+RDq~L;0H>_&d34RbL~Sg(EGuJq@qh9@hby%UWw zV_>|wn{A=d5g`B$^V#iXh;!(!8jup_!hD1D9OiTh)@LIW&sKO(LoyfLIAX^B-V5cs z(BFq~Gyf!^eC@c_@#Sw%S5&afwV+ETz@7(%^S3OKHV@&yv*uwAfb*YUD&E{AYjPCH z;sK%kxQX;}wDEBgF$n_(Kw;g8Sd#vbf4NMMSr2I}e1*tmInVb?NkO?ZO%$^a@S0g* zY)%zJFpo?nny5aba&+D{qiw0*K@qWG`^JB7{fL&QM1ze2jS{*??!3)YvM)?T{xusu z8ievH*s<Vt;)Z{|MYxc;kd=mJg z;p)J4LSw)U`4EnDMfPbhgOH(36CFXo8!B=~u;zz25KCt(JeYB~xxL6(V8HkI&lP+MNFpb}sNCqo zy{o)d{22>m_;|l4{-^W(pT3w@qI)KQ3OyHwdAwRFNf>1CWD*4|j>opP;%2MZtQPBn z^7uA>z5o8f7@Ao(pe?;KNgma!-}ld?5k4E$kg71K5jIf{w03IDz_1U+H@M43W`Jiv8oK3&USphb>* z<+)%=-hZ2h1*BsKv{N&d=u|^QS`JQbynu?zg~fS><=jFsB&$3B?g?bmnuw|WeFkvg z=K?qlVA586XTmWUPZaXmYGNUIw)!_4y((2yFLZIkaNCvt88xmvRSYydX)Wc`vws;W zLi;Q{VJb=GuHrjKJCMDptuFnGV9G8VdpX#$=4iw^s2>X$}5zn@d!vZo7K3@;t z9O2>z{0_rZW)!6VDK8i~nM>ca^|SM-Ii z^|9L%hxs4~MqA`OUT!}|L!H>Z)Y;Ikv~qHVcuq0OHsB!YpVzWt=On=%P%p@geT!Lq z&;R-3Mb5L_FR53ORANQOPAHY6>gwq%KTh@-z{siP3w%?nJ z{eC9E7&7n!B|sAKT}UU|uCxq=nVUh4=9@4|t^Frxh?4KSrx?A0F_115@}kAaUx|`E z^(8&Q(53qB|Grm=#^j3e7BEUbHm>J)Bcv*6N)%Dl!LKmDYL-=6#fLXufR9jO08)A@ zV8asAukQV2=233~T0r?!)mLt@7L}-=s6Y9i01;Wy)6iqxVPB_+o|L=gt>iJ*nYnMOJ>7riX%GU1sL-J2m zh6j*|^nan17aih1qr-ob8SwJ)qTm6cq6EmVtkzy-9*q)f^7ni2M z?BEJgTM&XMK+yJrVS#=I4e{ad6_VAi$1Nwt227=kh#`@Fb^U%C+ujVf^>BU)OH72! zkNg4@7I=k{*qz`pT?&SAnN+UZaL!I>y!op^e#f5pKi4Gx8$GY)ul?=I5iLyWxXqhG ze~m9eA`8A4+WqT4S86Ys#Cm7P3U{hFtq@XXm04&+4I}c^7_ibDaJoZ zG?{3kD1`G^v{4x`NrJpkj>eui((jV+wj2OPd~FY818%MTrIQ~MTPTmj1zAdJ|G^X+ z{U&mo!-c&_H%f})B7+b?Z|wKnlzv>liJg7-JKkpN;M1<@U1SW~M{t$01vaRC?QyQ5 z>>*lBd7sH3j5ek>&hv~qB)mP0E8DIsN&4O7z9=_BORl~HmqO83eqjvw+6hunn0p3r zKZ0I|f8z73{{q+Y@b;zXIMou(azM+vx@$VKP*s^6E1gaPM2uU>f5g!*L6H9iPU)g) zqkE0o4o;XE8&iC-L#U!9z&(L|{NG->{)_(poXZ_DU|%MJAV_QnnS7dVcq^beQU>;Pcw;t&4cf9PRncO>^wAfAG1@D5aE67-SDCdbh^Uy6+5+E{I%jI zQq1qE@3_1*%2a>o8N~zKUNu7j8G3_VYTKB%MB9_85Ti9pLTDX9pV+Qa5RI8Oz+Ve3&Ju6*>TEw9DzEZ#WLloN(geRwqOUZ9&Kt)0wf=|iy{Fx$(?KVYXsb3)v{aY?S)HCT^L|&dzf(1 z(oCNIwrvezr9|Jltt;~Z)A*(5y>DYLoAk+CyO;j|CNjQp`S_2J_`x%ciQoshV&0n= zbn8ByEnwIZdegiy5t(k+rjQl z#j@8j8(q9hEu?(Rkhdjpe}dz>_}6ENvulzBu>{4>B; zq&pbK0pZDhk5iDNC!?9c9|D6BNN!iqHjcrYLV5!<}%fhNrWGtnBJ!8r~mE{^8WXj(U$~5Y?NRm*F)y_a1OT zDp4eQO}(K|H2Es?z2f$d79bfuHYuYU)>IFN(K=Z9Mv8q`i8|D{G(K^nWV+e@p9{Xc znfAcg*>~|eURv(Q{4cOBOn6U^2mo}T3^`!k>+F-s?iPDP7SR{L^C&EaGd@a_dS3&x z!OA%k5^TpwqC{4W#T0RBEDXn>N9y0@d;|-u=ZOOoD%doy#<{~jKhwvv3;ny9&=?YA zklMW&cwLH9jac5|1R|r~c+37peLXEPiY+Dc9)8zpIu46KMk>IFOBDhYQjOgrK(RmA z8C^l)o1Azjiosj@*R)$II*P2_VS#~u^&x{5BdDh`V-~oj2VJ8yS1rXu_JB$n>#HXQ z7V1~EFO5J{5H-u{=I@7U7n4#aEt8ZM**zy!on!kq)Inq)%(KW7G;-;yqPR-2cJi}UF`?fv@we!$8>hH``834G_OkJ3eT0;AxAQVr1pWWh)^|rWwFUj+ zRTSw03Q85}U3%wA???~5_onnvl@g?PkbVIZA@myQA|OJfBb@+JLPu&0C42|({nmTy zt#|&)I@xFMb7p4mnfdM6GxKw-gLBmTQeaHSndI>+m$)=IfER#UuEIxe`)$|m+bqJ* zw=3X2Nh}v8()51?dQLXa%fIc~mRN4j81ItyQL75704QetP@aNlS&8#eCzWG>N`cg4 z7}aS(dBTIrs-U(%tPx}?|Mjcsw~hW%ajGS)%t$bWVWm9 zUkJ{fO4arjJW6lQnF@ClE#vtRw=(?sA67$z?oC&<0vUQroaA3y+JMZ~YYs1Zl@n+U=1R8^gby$J8pWq1A%yCkCo$5!~V6Pq`w>vCGqEHivcCM49rQ{!=endPu=e=0XO zy>GPQ_(k%@7NT>g5EE!Z;{X5uv+IrppOJI*3m59hTm4>`AqSP8!IW4E6S_B5 zd%QZ8QzD;c`fqP|wWNl^al(Jv0qMrxu-DHP1QbqB_y znds+Q3Qp?z%hFYEJ!bP+<3gbN^B#AaJ!o5Zq%Mhj-cg8B1JHnJG|MAvt@_xG{}nLc($Qa zZPcM#k!wB})*?&p3ud$tNNwJ(=h0I4~k3?J#`2`q_Bg@K6x5FfXt>4Gfx zXlD`UD*%g^>%c$#bLS1~hbMi%&T7rjHMWw*bYH0w;-grAVGHd|U|*>gfu#BKY_ui?6O=v`+s9IO&q{m& zyd2$fjcOeWzS!`SC+I&`3D)*RwI-5F3QEreua|htGXUmuMVv#9q`tip;(H=R!MFBf z_s=^CE;Nbv#P+~YUd`5FHhib<7PB_s^5Ur}zA#YsTI#u2 zzs}v*m1c}dVjzQj>AE^KBYxVi-8uOq^yIur0|1sA-I3!mDytdxCueW{RE4PWrcF>- zcgJmr^96o!$^94}Bz%5i=Jb@I9}0mLUAHY!?qGA<{9paWe_l{zqN{#C((@A@p4%H2 zm%C#oQ`iq4W(M|`JV+zJ&Kq%fu2wm6keB-;+?Go#fGBY01?2Qi9!gohXl& zw+dB#CSPxzMAlu%by?U@m~}4p91ZK(nxrdiG(UN{eM<1&<`w7NS|b;@AjWykMVh~I z1Nq(%$ux(m35YHcNz&*)Al3&pk|i4>1Tp2P&h4&BUgktUV;&hh5i z*X6eF!>_FynZz+1c*{yJQVJ#vEPFeW{gkE+kRRh@(JH+#Px9!@Q4?xwl6qdZJj35F z(EbR*>p&;#!AAi7WLM)Rgnv*NdZI`$fdiv~9hVIb@7p(0CViGz=Ev7&7(hatxCi#YcinCliYjSVJ_<_h?&(vnd!J zD!%n9OWvrb+re71FCRy5mx>-fkt?uyKc}k2LHEG19j5y5PNyvBqYGC*I5aa&$F(dO z)-bY}3hc0#^cktmy!O%o>z-@N@^5J zsfBB`G?{NDVMW=w*RSfHh?q_bGdWyuX`YPfI7t7?f;mBk-T-~%5u z^5e%{lO)QMgqx3|-7e)TC6}cjzVrK>BNhy~n^jd&b%>3WAFs$|`bCl|sl*BHirhRzp+lP&%Jy2YJ6OetU3+Izk$IRd?m zg-Poxg!&eD)fbob?xZx77Yy4|jR+a|iH9Y(!b~63ush~fL$gli#k5K@F_Ht@kjFYK znR?yTm>|lgG7eYfEp9FbKMv@YrqK`HF&U-@^29xwEc&o=GZIULl86$LC5?4xXHth? zVC@Lf(tgk>8J3xg33Hw>kgRYXA@Cw9p|J!LJOvQ0Cy&M?Y7)J297PLCGn7TatTVZ= z{`djgfgQ&?Pg$%u-bgs(T}K)SS+BQ6jI4*O`9YyO%F?Mk zkGzKpG311OX;8MSK_RjMO|>7lzY1yp6>C2@Dl(7GoZ*0HnbFtX*B#IM8bqI#hh(9ih|*Dh;g1Uk7LB zWbD7NA!C!=+XvPr8;^J|jvh@<;A&#-*%jY~)idzHEsj9y01F%qdj#!kI9zfanRDtj z8^+Gm3xTiTR%-(>_3rGoxbs=n&q^)|3BNbu%CiAYrF0zqZ8423e%lyWP)5{O@*?fU zj~$BWIe)H#bSmCmoOUqQmA6pyaqE-XjzVHi_#@-AILk3sLY^f0gXjJw`p>rv$1{?Z$#z7(PY3e&`vD|gUTBZ9o$Y51Mv{l6<_kJ;)(Qr~$@$OFL| zgp8!qYu+aEsvnw@fMkZEcKY*mA+Z25HG-`FzC87-TdW{vt;yr!=k=8g`0GUjk>itA zhZfXpw0L1nAO{-&8IXJvCNALi=IgPX%jz?Y=(XXfOjMef?5JUMp4*Zh1X6p1p`D5d z?G@PSN|^Q+8ob*qG#QVY`+6mG*Df--J@ z=ITDor}IwoY4#A}X=pqioN0C#Fg<>2gdj{uD4Rs~zq`i6+lh49)cNjuNCP>%XLL%n zkP8pgta$p4Vx;CXQ$%ZZb2!-8Eg)uf+?>bfSS9<$Pyt8qv<{`9MF}@d8<$z8N{l`< z`=j?mOE{s+GOw+ z5qJOnb~96ERhoRpsfK9wI+)*nDOoZq}uqMW`_8 z*>!%Mhc6(NIhbbtgVyl5dgSTKnceWTHUyq*L2o*T$;4aEDMaY-R7y~cAXLl`sMYEG zWBrtVzCSov-1pg9y6%$ez%aQz4|EH7R-6F|Jd3UAOJF+wAHp>(<0J1g{6k+*w0-$2^`+SeU%yh8O_KROJI%Mp zqFhMf&V|;kMx-M6&~~eaZ*jo5!w@ftSYJpYaW$Xv{)B+i{7BpPs9SinF^(B!&MhRe zwt3B}x0B-WtYrZ=3^-ljras{JTp=V3{S??6n0lQ4AtTd~5wFZs^v%3`A>JfF7whS>NTa-Mz^ws@Aky(v)d4_@x=Skm+~T z+(J$R>MyHok+HluQ?#at41*3z^ZfSHA&%L#G4bbHbcP8k2T}qVs`5}VdR`>6I%*Hc z3eET(K?~Op7RiAy7}YahJ0I5z^}U0Q@HJINP%$yH8O9`PoFF}qdE;e$jm(KBgo$4~ zxEj{|0ZdXa>~C`Dq#LQ8Jj*OXS9y_t12?qst@#OB!kCe5LN0eez59t4@9cihmS9vW z%Xj@+bDFHf=qvA0ta-PcCEc6BW$*BAg9fUZpXugo5BMC21{KH9OXM{X0>my`?um_x z^x1^6PhUTKLGT>BH_BLO4?@2RyuQj)t{iuT;=h5~nHkwR9lx!izwsO=eZnzPwiFE+*XmWDIM+f{{3NZU z(>Vpg(CwZbHt&Zatum*6Nkk@)r$S2d?^w4ky8Pc$<}ZaYiica#Pbj)%4$rwhX&ufK zAHxz(HS-LwDS0ZGL%LgEa6%{TEb$|^4~x~&$Xfkf8)!tNXSv#|3ut%2d{RQBlPt# z?6%f$k2flgb@+oa90fB>T*aQBX?c=ev3VxK71^U+&ijX^=aEBf26f!D6fl=OHZF|Y zPat)Blf(4v7)d@}7N2PxHvfWl6R#rGT-D>Wg@IGeFj-?W@rdP*uZH)F1}R+X3bXXr z_T_|9!l957xZd1|OH&wn`W0brn3Z9-a0Ny~|oPnWCCr1Z!-DMq=AKq$(1@SyoydMf|X^K)I1=sbG ziUK&j*oCcJ&iWo9o8xU?ttO1&X$&`4$)t{kOOJ1TnylTuesxx_{?6ga(%fQDBXpq7 zG@R?$sv1-CO_-=XO^RyyOPUYt34cb=L;bUrD!VsLglfCq_h$#K7-g6ahcO1YE$wTG zA7ugu2I|p&x5<&e-XAI5(7>ifm>@z+Eo;-`!nK{jt`dhAx$jQQcI_3xD#T-(fWoU5ML>~QWUF)rD4bXU@mNH6N(c`msA`){)L*Z4tILdn`?$S7|CUZI zuiJcT(uPb`l7_xr-OjV@qEaZSu%XMQ=fe1pjZcjkoYKFC=;e(LnjYYN-ZuE?cx`)4 zigI|DWJQ{Qnrs>r%KG}oOJhc2i+58}|MmOg3|FH8H#XWY>g`=$jJ8_2b_jQl!cvsV z*U1`qKF+j!GeYa06FiL$ESxsl`Yf*zuQylbh;m+%HvUq}Ln5Qz5hf=pXQR}PP*z19#dXIP_p?h7ZRil-2 z9sZftq54Wao;a;gp0|TwR`mJ~f-Y6*T$NEj(+|G!Q7pSI>RlW!-`;RfBkVb7K4J zmIpqb8xhoi_aW!%c`MP#eQrPYYF>(cAZJal_6Ct0gN9LuQpJ-Vfo^B<$>jxJeNtOn z54<-@0D`hZ-qQf!RGEJbQ-dKT{V-cYFDkshl{6JFO@mU}5;~DCIa39QV5Nv@AQ;zr z^#*gnt8M))kAoHD(Nmj1uz!D2<0=$P8H$!+TqK+AZJZ@ z2&nO&DL30pm1egTu5>J<+(L)J(^9ufy`aLH>{9*0#C+-jU6boZE5lOLcbGHLeTOv5 zDb#nqFOlNahWz&=PmeJErEb^pPX7yCmfq9y)vqium%JC|{e)q^a9Xw$hMazf%B30~ zr%I}q45%iI8}flb%9+tWPvh~t@i41#Up&EzqK!LM1Y4v!$cEquLg0g56?)PC0l)y< z6#g|Gl!Q(`%U@{sqkZaYA6SbSRGRO(Uu~9#J z6fU$y<)Es?Qom62UzpO)NIfPtlhs7O3Cr3FACN`sZcX1&SF?3C`Ja7hW<69BlUg^$etq~;1$of2KNNE4iW}Rv92t^`WYIZf@#TO6nGXlM6AlTy zOD30xjJH&j_%!7J2OGQROU|l5wy>Apm7@7MSBiZCGP2KW+@dfK0#o z1Q~a#v(fXo-?atQdKp>m>RF^pF!oT31xV_n$am1pDF}Boee|^9qBu7I^?P7!)~#43U%8tDh zMhf3o;DE-ixabEIma+<^vJmqY-2upToVL7x)9k!dFw$LoqRjc@`|Oyd{_1OOUlf#R zfUe2o%Y*r5uVEIpqv1STVX0u%EZ-U}-AP~OY)nsySyScNY?!JGYw?SQ?{50f3;jq* zT$F%}1O&SEg~i`|Dr>Dfo2!zTmS5b;d@jFHblYNz5XB!<}l zO&8Y`N;_zE(%s2g$44b zj`JYv=B(K?21>6+d4)6d0J56Clz!s4-9Q`8R6r6pOszW+Jv(Y`X5?;NpYmP82&p|% zNS5iukQPyM>Cj?`bZK=l18V1N6$HYUy;Ws3!Mu8`)eykN zc07Dx(+*-*WQnq0P>2-a7nat9Nn{_qX0~c{8i|=o%;^mrmJm)@cN80Iz$oO9%X`-) z%)>^H;v7t)o<)uKj%FD7$}$dHlsLoIA3V|9c6V0IGUw0qL!R&I<*=wYmT5SD)B3oG zMp)XtAKs@#p5Gc8$|GZx!k+PmNgE$+AUb{4kFe#jha1k;CUU@T!_76-TE1qNJd|~% zR#^g1JDFKz)6Ei53T?ePyl``&vO09!`SKh=qIA`q*J65R{eqf&JD2dM|Ni|Z#zDsx zz@4`bq=GID1ZW5$@+v{vq$DKovyRP<{%wQDaMK4kt3W{|3DNA~L?9$88ghCBMk@Yq zAUTmyBFoeeYPi}W_$;=Bswk(`cZ(7VI^iqoIlLSzOwU7jK8s2sCOfli0WsVit)j~^ zDhETa}mHa3QW$$WuCQzlt5!5ddOTLbK22#4b-YEsOd$YOK8 z`QUYVcgMLlx~zHB)jcwQ`Y?1=5!F$H-AQy$Y9v3MtE=bJs9s0Mpc-?IM@4i~WHD>5 zl*G}pm~rk|&GRoU4L;GQiCT+`DsHZBT0J!M^qpa+f>50>dT|!xhl&HIw{*Q_USyav zKB8w`)b0{zsYrHnN3}9DwpWGr<02QSWpT@ARVY=K)_^4(;FL40AJa?t3({3%HzP6k zE*SlH=V(b)U?16}2W_wd#K(hfRvK)pXj$3x_c;;^KFokt@G+79HZ^s&|E%A0sXgp! z5IT>L<$Xw`lYpTohIIbgHuhTD?C{=dccJOmZWkAx@ydmmVF#}=X(O24eY8B6XCgnj zxVj3(_*w90GX}1_6a-EYo{mSh1#Hvi`tQw(jV3F28_w4^ola_44LUS5dn6_&W)Ojs z!uJxrP_5vrpDhi~dLo0*d>10Ejq+5BPoBMv?-yMXI2>A&x2 zGF%k`#eF6zse7HyK>%PBT+s3F-zOK%#QgWRcw+YUpUD6e5qd5Qr)~9^U(bs#VF_J5 z!Q_boMIGh>cJt{NX*a{m$_M{mx|;dEmXu@xY*ti;gjul_-~cKQtWH!~boh22bjv_N zlftLNRXbzncav6Msa88S`JFQ2aAJoulb7=0OrHh6e;dVv8gOQQRaW_uN==FL?sn9!~{R-z{5IQHFpmW;nep9E7Q#`TsiNi!~!$))%^@vqoV%R)D6eB zPUD<|DY>e>RUy&1&O~NCYAv=^AF<@s!yMqnvd@>-;kRmvmGZ8jB)DT}SjR&I2&(^%vX^MO zBSVppOwq{0_`bzp45hq%QCCN)ov$+<&;Y{GA`9?}7U0#_lF|?JThuXYaiBA>Eqxsi z_qzyKxeseDe6W6`Dxci@V&l|1mS-RrK4g_w?OH#g;=XN8id4&DH4JW?6)^M$W5$X2)z1|3 z2i#{YS>*C%tI7N8K85Z0%0;@Q$Uzq&q6iSrqu?6zMosIHm2%_N4JJaD*WV4Bo+bhVWJCOAirVE?83ZqNoCjG2 zA)T9<>)?83V0MXn&`hp&>Ax@%{W5tE%F|Le2to5~Ly&ysKu~9n5@= zr-Tl=gaicxf!!EJS)hn{--w*GL&|lZe+?x9kXKBG`2ZQhT_H?ga0BO5GiJ(P=iu5%LMz0$Vfb>E(e#8 zk`5RGYysxL0s%m*w}gNYxjc@sKdk~$%wPXP;cmxl@6bA!$oihVhq2*7XOQ&P%vwK(z=m&Igoa{}tCTDh zhj#2%X`!9g91EeJoc=kGeX2;+TN8F=c6w8$1%NfPhN|}Fr4-fXI_->okQ>EsWs|)@ z4`PxFoq;4d5jio@wQolF~~s5XKNiUw)kC)6q`&GuPqEQsE~~2e@sgb(aPF7nf%k z+(|4U!t(^x38s%(<3a>ncdKgcUAipHBLa3&0ZdfHIk4v<5@W%8Y1J-(S`zwKEfxGx zOVof`LIT3=#hU(KZ1o#_ld-W_0Cm5)9{r{E-#M_#$3XDLpL^Cr03!M47oOYQwEvz0 z3H|FF0UPzXZ*TUtZ>}lguoq3qMIq&({lh>C%*Ec{-!6~z`NQg(s;<6YbQR_ln)~W+ z(>}oj(8FuI{>k{DKd>{+2h|@qD(NV&Xgk}bRN|Bs^4l6`SFhV_1`4Nm|B6=78sd#g znfb1HkV({M+il0na4KhJGgML21wI(Al0wK@oD>0}Xtdq+$^&P6^lg}Zvgt`0$a5Ky zS%Cep@^vM;5k{#)TLrrb{_t~!gG?rMAd#VD?J|4atfpgde>Il1ghiyOk%|Z(V+H@V z!E1K0zXZOZmJ8cK%c=L;6XElkz{*R4#PvT6yzq2+MX7*wbR z74(@5J2L*u$~U)~@W_{@13~1hfR|1WdPN~6E81QTZrD8@%4}>3&`e4+Z5A;epKHGQ zF}?Ih0`fj~O@o*5*xTuu> zuO6OiugD(8$b9-p6`u=3wfM=HE`5HT-><%K=_K5bhj&-+CKg~jn_ddnQrwM`=R=HE z0p|;8^;va~{+?bDLrGu7EL}HDFG+WRkyGj=ABuMXWzDwwyhlL2@5`^3;bkybds%by z{!}9BBEZXdTv`#p0YLX2<@dVgipq$fI_=Qr17}GVkym8kGhGAj%s6Ad!i%kB+{po9I^jyLssPOsM%vfscbL`3yQxW&lM|n`Y7>-KC9+X81b{vA zU}>?=p$e>8BzGd^ovECBkTOGGM7Y;*U5(Q`?b zws2>A8(f&&2ODVrmGf@sgT9*jo~C4`>Q`4+SC71;1Y%FOdCThBrX~+p?*)Mbb|cj3 zm(+=+tMrK_ETvi+f1#8HfsKg~d31}XTok#Mp~I{S*C@F5qPt^0v&OzUtR>R(BB_9y zKcw;V5D>^lYs#wY9pd}p<+piJdWK!JIO+gnOvBoBvQ4{$!;y8KH_5#(%*`hP#X~p% z{K{?e%Uyr2ynLDii71Osb1KIzMPu2n@B7w9XJu59r zfDSNgZdw=(+siynAi zi}2d(mCM-&r2h0qRM3O&#W*n_+}_>UQrCL|b`P_kl|Ew4@x4Cz{M3MfmD6UUWKI6* z&4Oo&_|{G1J?qX^5VZ1Y#QHk@fPy+cy45+7_pO8;%-n+eM7>sQLV;gE}j9G!fHrNUO zhz&hxEgdBPZTat|?w8Kqw!5)MZ#ypldEjQu^3tsRchQSTc+b))VB zBZ4|gJ~%WV%z%Gy-Y-N0X99a?Ht9!R_8ndphTc zjo)jtj^J<|P-j3%eI_(J;=o=ue7gZ#O%2s;5sl5jSbC!Ak^yIt+ab(1L3wX)7MPbU zu9(<=QA<2fxlmWuR!8& literal 97406 zcmeFYRa9L~*EM)>hv0s2cL?rI2pZg7g9dkZ4;I`B?(Xg$2=4Cg)`#bL-|z3yqc8fV z$M`S)x`4ykRP9~0YRxs*+^fPAc@!$af0MZvJv2OqXH27D0{R(4H4S@qCfzV~8!OD3O!g8bPOQHq*mWo2oI{hrMnYBVT! zvS6{|c(wwpJZ^Jns4z2It~_pVn5gKiSoYR(In7(P)vDF{>wf*SB?_Il7=6ClEIOr_ zkk`3u2-*SDCGZn$AY-RshaQ}cu)ZH;Tc%f&U!@Jvm-Wi2{aY^|0ixlF)vOEu(Eqld z{-39jh)Ms`a-k4U{(B|#CoBZ-|6CyN>5BgE73whNDzg7xktY2=UH-c;|NE|(lyokB z6^lvE-h(~P99SB3<<=O*b^LmL1#mE0)o`=ox4!o^y(U%WOGTJe-*)83gpzvBBNN6F zBu?Iq(XV!W9WHp*I%cB}#Tscec4jvoA?Bur!S**)+MI?X7eQZwLpzhy)l=CmBvjYn zFE86&YO|GH+F*zy3kNi9I4-eVJ}}y>e(pU&Z4elK=5~C=)ILL8{FNGU#qUv7PL7>I z3uWAKddAH~DLFN7k76D3#Bv(;YHw&`)F!gt4@`Tu6UpC8FbpZi>!;8dN_ZAX(y`;A zWLfecasj_P49(YA(462!V=e%y z5mEyk_cuo6Q;uA&uLy2kEPKuqT^wsLUp;t%H!=DgH|?JZx`&~?`kozm&GhjP2LhHE z4pQxymcA8Fgz~q#IVF^-w(3b#E7;ifAR_^OLvb>47}0Ol|4@AG zaaf2e2z4!%$%NMNgKGgtckT+0>3DbV+h#kmj-XXkQw}2}wB0luCGM%!LTWhkLH3Bq zy$Sm4#(d%i7R;~e*x>@k0AY_jE0Jb@Xvz_NJ}&CL%0_+O?prZrhKLsIw_1WDdEBfv zm3m-mr4Tof|0PjlN{usTA_1vcJEpz9;K02T=5JCh*B`V^xfe4C`libxC`X2;P}&56 zS2R57KYh?Qn*m8_2Y3Y7ldMD8GLs?=7E}VNieMSEP)B2k0K^k>3)aig-ws!(0+#Kq zReA*_vF!zLQBM5|!?#7eRS3Pdt4Q3f{wsjqcpC77&Mi(`iEr)naz%SUheC`qqNn|r77nA*d zhk3K!0bPEn@j0o_``zz3y_0Vx#AFLU%Kni`s8m(&KS7x}g zX>*aB_M$^QFZ7FPxBa?_?WnaY>Tu1p%}YEu8960;WHspM<=Grpv(`);w61klH8UB^ z1B%H)?9aA^l zUaYoP58Ax&twl*Tl_F2;UDA6o_t`{*cCicKSx>kj6D)pX=hTeAdPM_y>Ir_hZAfM? zR|Z>m`G?#mWhxoeYuI)MNQq|)D8(ZKmO_(vRT6}u0Pz{-_)&I2Ijsk&pAAANk=(Ru zd`U8mLEItNI0?om5t^`(>Qzg+5kK&pmqk&u(*b(~;W{?CAXpoCp@ZqW%pGz#EP&{= z(qBGtc|qcCe|}u1yG~!$Ni$;06%~(!&}p0QjoV)c;H3@h=rz~+KAZhHPmBquMs@&? zbS&aFaCvbRgjr_-X&qC}tZD&PkHsTo6$2)(0&nez(y%3Mu8wWqK*XSSMsjYBIeTSz zvZ&>o>8jR^RKJyniY}0e|MnPfj(CDbv+DaKI+;zs6`0Y%vOL+V-x9((S+7qU+^US1 z*`1j!2l;g+g!u_S0G2z`lT5Ser3XG`n(OpdF2ZiHiRDG@m({CyP3x zg*OuNDZ1((I5H(-w)w!{$SGBM@3dPv;9LntM>l zRu2$b#E`tA?aFwATk>Q`dErJ62%OC^6pnAC`X744COQl@?>MyiT(GY)*cX&EpfjXj zYBw4Ti%y|aZSRd#(<2*NOsT?aXZn~r7#E<=xBu3ws&oBK`UoB5wT9SNHhR6xfc&$* zhM8SQjoYFXC0r*~_Y`fvu@!jZJ=HFCClo=~Jc^MO-8U`z#d(dfrTcNLWcpWDAKspD zO;4&v2>+QSerhIIY6%>c?Y(-_8_9>OwA5O34`=)w6r}H~4t6qko5EiamL$jmm4w$L z(pdDq1*Gao>^yhex0o?M9q^=Tx#w2ar0V*P@H;K2;(TfXeLW3g1vaZ8COmu%GALdI zO&jS1!uRd?aS*%eJNSxa;2UQH0nTQKoFK%-46RujMNf-X_S9csocO{WaMpVIReqUm z+TSBUrHBro93-)0pzz=siVxEQMA_bMb{kr$L0?)PX6unnJ%F~-lqS0)io*IE^pm8J zTh*zaYvI$&VBgxM+>j*|Z32-e%?MGTf~FPk1${VHyBr?8+5-%I<~Ozoh30oyXLG>* z1L5aEi>4pCU;G|OR%0g43M#XtT4tuI7!{x+Z`sv1p9cNY-P`P_rPZ-TbY}x0TCs^* zvzO6;f58BS=RE`oSp`C!{hxkNAdOrFWR06k9=zC850`mj)zfJjnzIjQ&tm5Mc>nS_ zp%5@3u+oIqVws93eHjtEO!yj8{l_Im6aDd4H8JOsEvws)9}~fV5HM6XROt?6A}Es_ zM|g)~0xm_cz9+*0q=Zd{+3yIgAB8ilUslL@QwnL8Yl&k?aR#$yi;Y(H#sqB)N{-okl(t8iNz2LVc#`OROm&OLK1&O zvcN5P=F(3>1wxt?xkeMFJFlbP7mgYm44;_^BQLn5{Iv5zsyDf!&tqQHzYbHQ-Z#hD z+|d7MFV3;Q{59I!(DE(6a--TXXZ-e70h^ZL8onlwDBbHI+E$Clo`t6utQG&e<4NV%iXS8%C#z*fU%V>b66goXqSD z{6|y@IS2>8DD8}{#9KGn@7|%AjTk0pGIpqLCvp9LxTKPqUG%R|q#{-^I`&I`iFXAD zd^TauZ`_*r>>Fm9?o-eGLa#N;ef_zp0)+s`91<2?+T>jdqqOy=>9)bmm)LsYno{Un zn}@pKQIU6R!x>CTU|<&GX~yMgEDnv4gZ|oqbSQxVv+LJ;;Ehr9&ON|9OO&^Q=8)BPo)+B=k%_O32~mfywe;R9^iNfU?M( z;X*aZ*8t7EH1h^@quR6VdnH{3I5I$EJ4$1P_(PdOib8ukRI(vYfFvl~V{|L*Ft-HRjnG6Vz@ko^=H=v(g>wx1gJ3vL*uiOSl(+>wV?Cr&SAq-YU~;`&0TeBDxAO z?G&ck$4E_46<9E7eHNA{UQM_cUK%MzeVI>q2^JV{L3@DggF~YSS3hvO=$z|4rxiCo zQhFXL6_QpFZO4itxTxi4JDMc|N5!4vz>Zb(bF?|i_Qs1T-C%1=q4r&3UHX)sgKVhY z_SFM?96#%&%N=nS5VV9E)U^(tpnPKU@;Vu|m+5oY%Try*3Bj{8HU*Q?du+e+w#}Zqkkjc@N8-6b)&%qkM0K;_Q58a&29t z4|Ia{64d$C+8+|85xbqeDP(Ff5X7q|0bw4}gNS{rIw}+oh7!g+=INRO^Fzb+H z!q4-nik5CAdrGP4O;N{|o_HqoEC+i1f~t_;f|x7vmcamSQ`i!2>X#muTJvY{py_+7 z_>7`VTfq2Ym?PAJ+YpBot0J17T0aO6-R~|=JAdx9hsL%=VnTc#E9+J&fCuzGY>c1h z6euAc1G>oQdG7x@A*=v?$nYj}i_juyvIkDNI~IF66Ere*M9HliP>c%6#li6&A#Y9n z7Ko6~;)z1fa>Io=b`j13{&DSuDyB8Y$Gd!?O6wz~paZVl6%2K7RMf>}kRonI@$yPg z=>PyusxrOA^N=8b%c*kBslx|s_!sbBEu1c%xm>nW^w>8aYMd~@rwrY+BcLYPG6oA2 zfvbb{=KO&rw8D{S7=v(36xYh(R7r{0;ulfLbsuGOUE>cpr&z2R`)=t-z(K74a}6=y z47@sPK)s5YrkJ`BIZHsLapyFjZp~@TbwMe{^F5t{W{8dk;0^;eq?kbTu)i485lvm{ znZK7iWGtr9ft8}6A(ag0kW4-gB&604yHduiX@oUf7&(e2<2^=7N8zW#M?t2OAj=R= z&FU$`_oauL7#?ykmsu$E^+yy+IuO46NG#T5SHBOMt7I(5&loOe2AzAHWj-JLN+!80 zl8!$4c}l&WD`{$qhv~G3#WP-dPA&Om%{va6x$zb?ND)>eOqQQoR zSPT2HJ?05b;#oJ+K5`K(4^P3&6ykz^pA{qGd=o@r6D&nI%kC%hG+t!2EQBZlE|Y|H z;>BC3=O=yU0l>#pz8%2mFG(GwMEIUuqH2u2@w>d;C^b8}!O)|T(;=oY5!0?%-4yMJ z^ziltwQB5!=tjG06XuaNclX&0o~WUAQ97RWR$_X@Ups|ngaB6JL@N39U_Tx3{1A!; z=LJ>1T}|i_nVjZUhz6-F+e3|rG5ZGhG6pkyQ_v{e#@?z$(sj-98?iKG$fK+=y_PW9 z(8TdZnEPAW6r1R26*uP|rtT--9s0jcZhM0~`mvY2*>*^z1l7b(&t~QI02!g4eWB%@ z`-DNWeWY1sy>h>w&FYMdYb`ruX*TevVSfH1CW8<;r0JbWJOj$Qk4Xk(0Wp@;&KMYe z_8~YeV?*fG(+of)%c^YfCHF}wot#uB)#9`1aiboVeh=qo*7TYx;4>bbQL2N-BFZtZ zBB4|=ovOKC8G4|{gb1{uLtRH}s!u=}S9YjW#fjhocIXVfV^(f~0$@sf!onLx-8CO(2U5sG) z2E}3M(M{3RQE_mpf8&^f=x9w$kPZiGKbV%sj#$8f_*sP{Vd5P42S-T-$+W=UF3KSti zJ+Wp4r%TBu(Am*Jz}BxJZ*~Ev1?bAhCF7_FLCf0VkPtyCGWraDFt>~A)@w{bDl z^20jmvMZ^@-Ap%9^Vtq;P*SWKjF}pO=%p_6&h=n<^6q!8@hK%*Bp|vtr~8`h8dM?j zM^qFcc$;mTO8zw8{5<^Fh+(rHD67$|_Lp$o=7Xy^A&^O1#UmRU;}W(V(W8C{M&OrF!+=H!~ zv^T#U&(Ij_j`!ja4^YVIx z8vDCy6+YLIkMV`!C9gKuYyVRI94s6b1D{o`VQoWiTC>;8%9GhW=O)+M=0K<-kq z-OJQBisgPiazq{(?dvJ-iRtOeHE)jlV5|+repmE#{7%;0rEbp$PI3-#3`*pV^NQ{@ zE8!|wD~I?n->jjlsc6R5-kb30*@`v%*u?i&E)H(627usaZV0!J8} z#T6b5XutPffN5ZJ^mLnY_(`@r723iu%u4Xr_X*oFwsDBcUbkKm@jk==7q-LdA+9OB zZXmSe1(x%!@{Bj2Lo&@33=8yPMw7G9rZbwYvV-(ZYoN_c4#vL|sxZgu-Z?*Fz4n_! zWKlV1*_GWw{aG6KCi3G^nx0Bbn~H|GL-W=uQ$!RW|H!>(F`m8NSN*j}n`*r*J)M}7 zP_>^R?fGjFwi^1SkI&?4lteEnMb-?sGUpk*7MzRy){9+-<+ymlxuD-g4{>}rQEK6lUeLRv5A!5G_+ z#|hb$V?xwqgk<5A3cm_FUfNRHxJqbdoM+3-O|us8q7P-Q;Np5iCA}HLgnc$KT;ViD z?;h84ps_Ee9SM7qy*FIAPTN9sZLhP5Sk1HDHL!lCXQZf;j*K);u zeDQ_i*b(=U`yvi)qRNi!X~Sz3bH4SLpAD3PT?j!JQ~-8c(=L?bn8_E`?8#mbj;C}S zWmBs}PZ#5mSU~?nxMhPsF$#L2!TW$xlI*Pze~&WRTuWx zJqc3qfP`cF9$mR}_VLX9h7F&8aDFkXCb0gHOD+|wGrD}6K|698MtbOb;oshci!IV) znj>TPrK>Z@?vrwwu`lYt3d29s(Z3r!?{)eA)OZ_Ns(NTpS^6*)(9>Jdb$BK zd0rMTm|Q?|%!BYTYf=E!hr`BD+W&4wDhR>G&Dlv0(5g_knl;xh7hf-Xx8Xf0P=V9H zbUA%CnU-DeM6Nv)$Cy8xhXXA>6~aqvC!%!yjTgk z-7^da_mtBi-!~Ls?;rx!IYifKAnz50qU^2aM$worZ6jg-p z@S_74OP|1F>}~$2qzj&*JHe24aokw56a^Qqr3qv4eGlv@)++ZuECs5e2>4432XeV? zfj@HwTih0xF5kG>>L^;Pt<7-5YwKd4-`ziyH%Yy7LcXRywUKUrpr>bMqPDzD5R`C> zWQxkI2i<%^)}u4On@ziv!Y-GTDysepl2O?pV#H3DqbeMH*0-=740yY(MvPeIhFF#Y zX#h6D^L;-Amy*yPQcwMI!~$-*1n7x?L#{S3Y9x!mf!e7Xv-1n zfif5o+{b&xfPIw<#QLpMpVkN~QKW{Ho2l=!-QCF^$a2r*^rEJY^-co?1IP`|H?pcQ zl~1&CLIkI^j%B;_YdA%cUgfCVev`v2!4qlcTL#^6;t=iif5PrN`4PSP857hFa!_6n z?Iyc9)}khs8>czyq%w}naFgG?5dSOPyFMR$E&iZv)xwNnDYHs z9}#&=#_*B`qwn6pAEY3{(&2b1{3HuJ8M!qQKRj z_6Bd6N=qM!076Ow1JUK}=P&GL?Z*3O@~-Hsu>Y+caA(DB)f7`=Qlo9|B%F|SA8?x#LF*F$spNZ*TPIjZiK&$doPI1~~t)lz#^ORC}s+IZX~| z20Dct$7LKqQ{<()6Rf1c=p&1AdWTk!msUXhPYFbBlrfr%w;iUa9Nu_=RHB2Csd3peY`I&Y*rg;`5cEI>-w!Qrh<5dICXHK_V&UI)9Tp`yC+m{{p`MFcn zU;y1dV8a(;KWtqoVlY5{DW<|m{;%sMwepMv$i8h6epgI0#uTHrXQ+R<5Y!y30alxvXDa0iKueaC>iBL@Hak!7P&*)?s#j_`7dusi%DWJ0~q5cgNp z;g2R{2&Oo>igJ>9)ZJGQ9u%sZObxB*ml}1#n zgj@i+6=3p~{PFj}qg(%@D|aAgN)SqbFBuK&9!sQK6^XiyKAru7-}E;z$UO4#lTG1Xq~acll*BBGa`mbi9dh-gwf|Udjlis|-!SkO)2*OyOhJ}K`0o1kD zf|@V5N-S%q>N5kfjrnwAgUW+^AIH^R=I8%rc5UWS`F1HV9vBZOCtz8n8^Ob()P9tg zG;Km!Qu_CfNcpfK6A{3{iMt@og$SQNJ0DC3M^rumMPX-=i6pzWO>_2K(Ptp;Qmz7i zi&miL{Q}xT{JWZ8{QXvcKslyYY%b!I6!esmp4?5zMYv|*(AM|^slKVq8=76o4%*L< z+n~6YU2p{RCwCdtlQ|*89Jgk{VnS>t5_HtwToS!C5a_y+Tn7C>(_bD!yi23XzF;&X zwr2i5s-ca%WGFGOkAB2j3l<3zg#I>hAjWovq?$WHWC~juV2SWeGZkM!)pdjk%@Ze0%<(25e?{SLu6i(nXt5x1d7hmu!^4bKpBkLsV!Y!Mg zoA=gPa9TQ=UM^tX9p*%HEdSVlc24h2Q43<~MV-u+Ou7F3QKwU! zOpSjTqD3;t)Z$K13Rk2GhxCXjX;(v%ZTTIvlIvnO+$W?eHlg?S^qenGph42d+QQi? zbwf7=qK)2%j+A3Cz1twaHGj5hrDyllBCec2X3CCtZ*whl04Ksvg=<}laAz=G&8#}L zRWGY%kU+({F(y+&l8J%r%tUXX$!5mZ{PmgvtheC2*rVfO+w`zbv%8wb7_;s0AAPf) z%q=9d&)JW^a?-DL5}N-xX#j}=6K>zs0$iFfRW}fG>&BojCmV|Vgwd^!LHmto&~JqX zM^+-Cmte~61`6Y=Nfkts=g=C z8eZMl6%AniJqwd=T4dsz{O9c#ic2%ST@m7H>24f*SWRk{SXe@vKW<>y4)PmSG<+E0 z%8L}rJ~G`asGdY-lt+qr2yKO2f*WY%;o_TXXhVN?tJj4Hz>iD&E|C1j?ZtG}x72eO zx9*4#m$7srd-PB(K!HeYl9BsF>L3(Gjb?#&O~-YdYRRBlO+@gMftD1Y=GTfLaVL3U z>A;*+C$=a*YRjLF*P80hdbddMi)46b7!PstJK~@Q#q#9CecOh-w zV#JJQZ)SkjuGin=E7Wi>&n8YA+9Ov@^g?gX-vYi)2jnYA&!Y}6J>=hXH(nPi!=E>I ziYe`vw-8QXF?mGlSJb0E&A1qNxT^1!o*hC0*le6m1~y|2Qd`Dg6Gf|M=C;)X@b)+- z2Ne3*pwsw`G)VffQm~i5%?m)gpMV3KNVThg(b((jZ8(+q)vI(|g+G6`poPc>1?B~i z8BEf2Zhn^IfV4^RrznC~!8a-bQ6?p5W>=4}ZDH8M+hz@+{rGfq^^?mapSBOCp=gYF zvL$m`iTtSqjnwN)Ob{cR(IMNF&}`UHa_apTVr8#I-X7j@k=Xp0!>^6!EdzOy%vcMH zS?0R+@Kt_k?WlAo;g-_G2w%iRLb_6ef7@^5V8YwpNHNooguL-Z<<&sIdL{xOZ?-DrSGvo*Ez z3;aY#B-Sr<&M6m;?&N5S#2}*eN+?<^0U{{GiPY!dy!2o$?`+m$R$PluKNt5NS{_uR z1((xuHpBIaWEq)I#NzZIV71Oa$2Cq&r;Rw(K9Yeg|G??1eptazj)@gr;w$8zCxa2T zjNPzQDM?09gUa9FwN`|=I^=+2Qy!Qcw}G3ma={Z|P2`{goflXt7`4G~F^wlq>km|iKoc;lbBXBui0_}Tnv;~?YC*-9u%j#Vu=H0_e?{N^gR%%lRF$2KZ! zN+EgHqR_@dspvkbH&f}N?Fu9_&3GUhXb}jwtN>Ql$h|6mUbv#ZVUgrG#8YzWv420X z+x}!oVRAC}r=#<}y5bGb%`$j_;r{Ytt_NS3tF#!lv{@7(s>R{Vit;KtU?CB|xcN^U z8d}d<>;=9G3x;Dfh5k)nvB(bA}?1~q3|d_T_l zZh?H>B&Tj5Sx2}YsYNJZbsE~x8G&9GqQVZZQZ#x5$)utKvu?+J%mchN5tBW|(d^Yl zzr3be8mCOPw^hJ@t^bS@M`U1L{^^JwRlSdN#E|&uP=y zT+QwnZW$vRD>xQvR7AGi-VM_eolKDuEM`q2$AJY(3sLW+zW$aPW$~}mA#L!BXyAM- z*Uen#S}7OgT`dt}rJ;IqQ0lg%zaE4RKc4JX{9vaBz70wtKL16ZR-+fvJ^I9RKbBfwxzb`@1C330UQGptWUxR?KL8l#G*AmdP+3 zcMLX389J6kxTMLdbTmzfBNiLnLnB`Yx>ZET+|ttOkYtw!t3eR|*1fN9;%;7$Sq7(m z!?B`D+U`2}SSfy6X95vlRQzwbz%kBN|H12J*ncDQ5B;Fkl1n7N;y$40bq^nVFj)`t zUy6x3t$)a!>rk8BmL0~kN?kYt3Qj<<_S0Ste7lD|`%u+p%C>p?4D{=?G=TtDjY2V1 z!}OXx*B4PmkU@sUu zG7K_I^k>01Tb3B#;~*Wg_^O8Ve)06K&8aW*S=ok;)rmN*Kn;cYjWki~YPXiih4t)^ z_U#ok75xqsg?Wbs%Yj`rKTzHxLOF!3O0GM7iEB~tm1x~8>7j**qcYf@cjism4g$PXY>N6sXP5(%*}GN=6n|9g3KW-!YZK^PrxVWA0~R=l%{xVmEx zuqnKS+H*QAc4XEZ0Wr)+Pw|t$iD!=C4}$Xj3d46A`wCI9R4sW|lmINAaPq=Igr+l| z|Lnt{k1V0otUA}SU-EEfdff*<^0nf?VWVTBZ_AU^Do&qwPpQAR^Z>O zJFkC*OKEw4hafzwnoV$hBr|hcx+}U4KwAu=X6{8CT%BQpDY0Yxd#|OjrgzDKu4oRd zN^D61#putY7~~a+P&S+czo(Dw2HGtWWUxw9lJ#=PAy*E+)PP^Kn1b*P=|~0PBFOFf z1ko>ZA)bJ#dV>XX^{AZ#l%SgTwc5Apfo{ZfQa5ed@0G>DcJ>~}Qbm?K{-q30h3UJx zK^c0bQrT9ExiDazb}7wi!EL4dz%>jirkElu@o5twkQ@cnUH<>k{X>k%&F_-Kw^m)b zw_w|TBf?b+qxi2x@&DuThJ5lCFtNI(m2|7f$Y_cdT(R#qWarP#*NYFf5LqDu8DZx; z?ZMtb6w|UxRWi}=p6(Cv54+{>ywkE8Nl|U@A8OL{%s;9?c}^Dag#fQStE+R*2fK0B z1#LAQsZ#V7c76EW(3oS zdf7{g7-z^w4{F+f^bGqubh4}-xo2nXKW{`Us_U|j4%A)7;YgjjZ>r5@+eyRuLip9u!5oe;4B>a&s%K)7y z$QbYz&0QA$5TrWTuzeODwTe40vpCH_xm@Si?X zW&a*W*fPOdalHj^0nz3UN=$a}&0~-oRO7Fg=ZuCrZF<$bNi_HtCh;QL-FQiSY5DV_-ME2P{YL^l6%KdlqC*Kf@PS$P#5udY zFulDXcm>bsQehDg7HSSrnpx4qboWaCCh7puY4flOveDLwPofWI=k>$<<$k{pQf;^% z@jqs>{|nknWOu(n+RSfURr{~=1+^a~gfex#hA=Y@wYlq2Ao7&S6BQ2=Rl2GVlDYSd zb#XgZo+;7^o-p2uZkX%@o=?R%!&HaQtsX^R?%&?SKgZDiyBfK&R;y6XyD(`VvQl}! zoG1Q~zOokROhv3Z2zJ;HSU_?R=+%sFH%KDexnAk>ZgYMoGLZ8K6r_2i9Qa0Q*o0Yb z)~R;q=W{@-C~heP^;KayntPD_V^4)(w2JpeeMybv{b=IIQyAks2=C_u)v zwD@+*aZ2}ZD}ola(mNe`8$-R5by+>3mKg8X=sg$nR(2HA<6AMcZ)iR*dF%a^Z+e|k zhY2Zxb$(f|bsF~TzsJL$1*}bn+umb94!&bg!RzAFlNKwf>jx4g6o1=*)Ur4TUcp|} zbPT$KKm|GVHgG~~DNYcv6&t4Kq~bLo`Xm;XFy!@46(SH2JgoU*)Q!uxqivd&)I&Cy z#sA{<@-V?v_Golno5ewQ_WbWHBcFYYkIkgYDqGGb&_Kp;)a{BAChjD4^=|Q0V$p}W zDm~888E*jXqL#Wr-6$WMcRHyyv=@oTd7Qu2KODYMy=5`@1in{p%cHGgd~E3@f zF{_1AkS^UI#|TE)Hoh_lNc;E-GQE9QSF-vTIi;Zv`NeFH;pN9V_J2nv|J$95u2Hn8 z26wxmQYWGPYci72106Z51aW}_6cx?#wDp?C{|)zcR|%+`x}Z}hDi*w`s1&6$&4w@E z)+ci$r$d-hJJJvK6n=i6c#${P#(UYBlHbU>erKN^|8VYHBpV$D9^pD%dvLj>GF6B5 z_rvZ5zm<>o56t;|h|al4rw0oT55Mm^dti=G zE~9cgjnpOWFFj232G0fF*v)lP|AW>X#2?sON0K;!wao;40~;|Ly#V3+RO+QL2m$fO z)M&l&ecm_l!)%~GP}f@MA8^N?kVnewOIk#Gap>;Mm7GpK*qegh{n>PZzuOsN>+}NU zJ#Z5dW`q1s7vg^(D9^G5?S0`*wu!>Vv-SWp*s1PF;@jZGJ=FRDk@K5sZd#4O$(V9? zzA7as7J?dF|HqL-jzA`)^nv1>$&LHbHw;^|_K#ap8mjX5u%9BmNS`O8ttL1zX=VDa zuPFxVvF`pSZvET&Z@uR7p#5E5=b-)(bBFE~l1#oj`YQQS;2YbvWEFMrWl;Ad<-dWh z4(#JlW3CfTf11DE@uN5a&<9Je;sHr}j)Mw>*Tb(uF1VJBc#?yeUmcY~RmC!MgiOP* zq|5(>tEHQdKs?>z(6tm;OZ3WrR&u_bCcfTN<_L-mq~L&;?`y{kJX+E3rjMSvX(Dx2 zi-p?C8Lse9@|geLKMnXnI&z&vw@3PtpF1F1t?&fDKkb6Rmpa#W|CKj0V17`C?HH|+X(efkYCO;1SvP<_8JQ;;OEVezhb=9u4sNWQNsnOY`>iy|wKPf4 z`98)F@vRp~-t`(oe9o!SfFmsGQ zJ_QXqA2OHV_|32*H~H~s!R71X8pnzpC5phqeQTrHniQELyOn;;i8*g+z`*~pR~xk6 zE&{uQ5R)ILBAE*_%%o=4z@(-(JTMFfMHyu}^RFL_1JD--;&8SFb*@^Ac%&1n?zvB*R|-v0_bjbA}r_s ziklGHpAk7!BpomJ|GL!^30mqIjj6rN+>p~u>Zqvt=_mkc<`P8X@o&%b_!z4g#=H(C9VA`WnP=4jl) z8h5Bl_9xL##s!*HCuORMHQU}yWP2nK2`Gb)bGgO} zTxuIAyV7P6iaa3OHj}FFh~g+9=IYr9cNzj9!i5osV7A{L;A6C5&-rNcn^h15J(Lw% zg0fU>FfnwYW>#oj$$?fW3_(j7(YoS9Etp;hs<$~>(-A;%qJiWhES>YLXEAwyP{{uW zV)JhoH|4i2zVmk!_+Z8)@`C_)I{Y+uuxZZBw7Ia-Sm_$izQ ziiidhM^Xz8*FAK~vkdIB3{H;2&p$nOha63aMG}789YI@R$gcEtnLJi#S1~jzj?stx zs_oruGi%wW8UOm{W9;ZE$-F(3c1KlIsA2C%octLLB8Bg-o0GlthkdpQJ`B_2IZk`n zjeB{lY)C$rcAu;p`hrB`R#bgLmyb{k9C0ps7Dzn1uQb|{Jb>qiYkJoW7!#P;R&qFU zsvKJWHH(G`6PO_Q?GCg;lPgA-D`u{nrm+V(U5v&sL7~Z?Us4%eWyZ*I)uOyq_KYv| z(4zPmN?U#AM>rBn$!e&?x6(OR)Hzp0eebk6j&!erU;9bABH{vHJF5D(6%DDKAPGw( zf5}uENSlVRo3I*EahLMJ1pk&9we%rhqo!MQBducx0_i;b<+hBQ=8EhRdYN0HCS!<% z;*?Ml)xipGsBKCE;1GN$27Ygi=4`X#<6K(Cl4{xNiOk(tp0V_ch4Tg(LU|Lr}xLVB#$E z_*SrB5HAa&TDpo0KhMW7MVrAfcn}nrlVRG~h}^E5?Y?N^$PxC3dSdhz=RHuD6P_Pc zWb4^zG&&58OYdJu-QvV3#{@L|ZvLaNLoYO)4#ce8HBT>-oYn>-kImLv3;}vD5&Wrr z+iVGK&~pv&!S=p0)Z7z_W<#)aX?c*3a*TloK_WFjyifhP$Xw-xUWgSID3q4bsE&P2 zm%1zz+DjBZQ~~)ET)H8Eb%>8OpSWLeRj7m$lSWtL;g-ZoYk~2Fk0}KO{ubo&?g{O& zt_255h}n7usBgnC%&9yb1LwqwSNb0{244z5-0UO2yNJ^9iHI>J`Vb3Bd&-Uin~Tuh z%|NFo1${vh1HJC37sURLweV-7U0w%8p2kl@k9(eYUocD5=t0$R1%h1^t0?nz?k2TY zQhYrtYBh;!8ReLj^9W(&?mLvI_n2Yx2)2R8j}5NvrLFR^!zT|yuOtErJ~)>@XvjgZ zmlN5cue_@&e5gnaVkkX%Am11Fqap$&=eRab8{eQh%up}heL0E0L^zHGt_!?4!;U=r zpRXs+x`{S2U2@5Vp%<^sWK!HM9CY@NfHV}UAT47_X*ZhbpSVqm~7rMp$5eek&-iS<{0Pq(V^?Z;&0I|R8&Fte}&IN;#8=2^8tU)j!8U->Th<>hY!KX2X;R7#!H1;9I zG_5jRX3GosCPfk%2(iHa?)$%Z`pT#}nxZR8h}#CP(RBxA$7r8*go<8w1!4_3!@&)Rd2A}s%|A@*sVcYwe1lrT=(%Y6^_7M}vI5~!6{9kqj*tr$v_os_d@@n1T_%E6E zYXfZ@J%6ltUQ$X|y>#6=(sY$2zc^=QfKT`lf+K^01M>u!By&V&S;@|o^zc`hJArgs zAg_+aDw7qdQ{DKw0ut)wc_12HxC*)8Z$v_gxUd1jDKM54ydT5KC#qd9;+;Mlyc@i{ zEGelML-U6ju4NbA&1JU1>eUy`K17Zo460ob^v+*d?RJt5WIOC`zMv>wSzm}|jq*>| zw_?tbVo;sNsMJVHeva0Q*Mn01gD~$XdE4iCEmyM7VcKtm!Qym&aRI95Z8cfVG~SMx z%zPe_$b4pIg5wU?4K`U3sd7Y8lS4}f0)cggup&L5w{>sIRBWRtsp)n{y-e%Mj?H|* zmeVxwS5t1po1Ie!DSDGAo;>Tr@VRLdM?bC z#0R*r8m@y3dyU)G=WRQ?`7m?k52-s-$1my(`?#DKAiJa3pB)9!vTw9HOLppx8mZT1 z-i*{ACZV4lpxo~0N=ZqLA@v3E4K_=~-c-)!gPr|6H}SnS<72)_K=gRyN#-74c{+3_ ze}F)J-qUjB*oPrSKU4ZQst_(y+;K0nz5KGb-lW~e_Dw5gT5D_CXy>B@t%is!p_6L{ zR+U!fWDS*nN_ubk`-|?^Vv4IHpE+1JvPi4zG-05t1I`ZWW~YAp4x6c{_NH1O2iw$_ zYRqC)R@QiZ?`Kb%Km2kCExe`q#L-S+ZbXTxem2yQn7oyqz4hSb$?pUby|X3dI(5U` z5F6W{OLM{Uc(yLiIA>5;)yd=2%Xe{UQr^Og8@8ys&Ae{@Lma z4#%zW?&UD*JMqJcLXg$Q1_;;hKj%1jJ)7Ylj)z2DM0ttzkvgSl9iTAG5V=yCz2 zDl0E}zi4lDK$crO9<&$#GS4_|F@?i)l-BWYt!TikJLGM4I>;y7TjBRUDf@e4d0Wd1 zDSdL&)>iUfv3rv)E>`6@%?_YxX@J-vUXr(3&1K{Djeh8|^_x8aOx6yOXs!&z+43+kVCabXV@LPNMTZyvoPOfp#xJFuKPJ#}f zQiWs%qj^V6a}SxzRGn=ug6UqhwdAjgKh8Qv&^6rVji=g~>~nezvpe_)G5OLWFpZsj zsW1xdXnTXftyayNwFW*^LQ=>^vd=Cgv)WgrlU#(W;jcphsPci#^3 zS3-R#mV$UIbzhScy8G;` zU!cq<=aooI-+)x+n6183@#j-?)a7Xgyxct_q^>=)ZK@4G1mn4lr+80r&ga7Z4-t&EeORG3_%)t zYP$P7?e!V^FCI6MC#|JUH3HG{HH~zkKe$JMN^f1>U z*u%*`Q?E7dKR;rrs7eizKSK)8VZq(_&1IAOj-IdX!Psge5riagS@{NPR{yatqi&ST z_BcfM_xsW1e75)BdE$pouFVa76JNtkGN**Z0ppkLB4)Xd4&;Z_xda)#0i`o3u8&7- zv58zc_fLy6)sq*0=L=a%X?6&&?rlo`<KAtJ zMb`x$cT!}wJNUm3;9!4ZNg^rNdmDKoZRqdQ9n069Jh@5O%%LZqy*2K)wS{qUP;o8B zX^yx{^_^~EP!SJruvdN27jFw>CH-HRRo&!$bGfM87`(K5PH4Q48iVPj)fm@m(KN*! zyER?Vd9N+pnoq|6YgdP%eVkHGDy9*y+QF=?JUKWSNLnjm+!4d!Y24m#QU~CssJRIj zD7Fkx!%ssR9YE$p>Yd(bVhza@V8qfw3>kIjU9r4=eWYy7Gmy>}nInrXBP@}IxxwKo zWzgDG0EsS%G{lIE2UCWGY-H*->dySVDjV04KJRg+aaWe6sxIX|iCiGh=4@&^-EV0h z%W(|$shXR+PZOSMWzd&68Os3Pl%*_KPFOY$04^Z_G#z};Z+f45+dL`o}cN1Uj@+dPgiWkK7b7H}8(*oTWphw`Nu zunqF=*hEt`R7X*X7Ou-sme9Ye>E+D81Q#BA>Ytcg6X(tN#T13voIwRuH8B|LcLlh-AE}$98h#_K6oFm3G(#k@r_Cvi6b(C>` zXT%h$dGBwv7t#d2uRT@Q?Pu^%PgFF{P&9tcvtccb50|Z2K7n=5eBunmHa~(N*U$@* zX`hOqW3COy*Ur2b(C*MCd~Pfb-{zpWAu|=vM1{+Q9&enTXt5Ib&#^x7yBYa875w*# z%iGVDi4>c~!i0bw5E821Zcp2w1{hkkKUFt1y_|L;Yy*^i#nuLn!dF-upQj(UM{h+d)tL!{U0&;xeE zLeT+vgM9=<>ou%xvT?jfPY2%nh(IDk@O@||hlYYl6~H71tsKjwx`J{jgReq#EdXd6Bg`a<> zNK|wzgheTWGV+LnH-j{Bvtzvm!J^8eti(>53;VN#2&vH>u2Nkr!BYDu9rgMEy4%EZ z20aPu>ZLYc1X)Iezn$cH#XbaU1?45JY!2lKa6O${=*GHWMtsvq2bK&UOh;VnL0kq3 z`k&XjFT4)VePju@Cc71+m<4p=IGvvujq`G2x%;H#Qpi<1yH?>=<74l`YmQc4Q&;M7 z^o$9TCx<%qxxb54%I z9p>TWkv(M|#Nu9DM&DaTCk+?kK~cmcLSoCSf>Me0>#Bt4hf+;=q<5o#q<^Hl>Ku4x z(5N3sV^-u&p4VG1Y~<3@2jLaeRVU-yt;yc4)0%fV=PBD+0=>vlR%Fm+0-GMm*Nid- zRLF|x!wY&4dJv#}!1PG3AOt5>S51FG`V$CY>27jiP@7oS&@$EoD@_Bf$+6?mj1!G2 zl*7=qi2FziL`8&IsnCQk=*6($MFc1b1&}5D320iF+`wCMb2cHodtuG1LNlY9GQ&G+ zz`+CwuXMweA-6jJTuOZ|ifV8n6h(F1`30Dx5JScB!8opjpvQQK+wsCWyRf}b4Q_@LvL;Ik1V9Ywk*(TtBA+<%- ziZSqz*=8rpWmrs9S&i5!2W)SGsEbsNZ4rDuHnw|>CHnxm@G_`~2u`RK83hXQDHvGf zEp%7BusZRu9teC(V@f~CVh0j+b&2u^v2em+i^=kIR!Wq(9^gfrr|!K4iTkj(n+Itb zp!kt(P`;jI2_chjJ%P8NsFOC(hyJA4(P2(Bu~uNa$`B#FPcx7Vd{FEa&>Zc;Kz=ARDTNpF!SW2{eP;GmQX!e*f~@=e)_a7kD1-)2qqrRV`NvQ)mbj zW=rws>eU_@!b#c4q-R3nFQQ4L zfkyZU<}(8AEzgxUut#2`OPywq(mo6TQ*s^)fGSb+!+A96r`C4;f|WKfFQ7{5vxdHq ziTX##pF&lu6)@+VIcKi(N@=gE`;|ywF5zu~*#Hwt6jdM(8$!e=fqWq2&V22-Bh$l; zz9^S8b=GCvNgL?k>L8;-F?z(!^3_(Dw$^~vgDr}l&E8XAtSSqY8S}y)lN7_ZUK&+w znm`&FQ8kZBQb$x*R_B*0IwCr&XkICVZv1kY$O35_OdIhvFJ(Hgh{Pfoz9|S;DF7D) z9rG>P1IRO2D&4V|nC0uH*rRwaz54;FzAvRw7nUXligi2zWf zKe^=?Ze^4qJY*uJ;?DOcn=FEC!@6@I-Y`%@id7XHE`oR_D4-19c7aHQe1{wu)`YxT zrTv)60R0nG4jM1CAji%R)hbn8i1uUf@|yetuxIbCO#j`7#(>8crZ3Ih@$LD|+OfH2 zVWThI92Lb*D*I21GjMm2N=~Dg%P_M~QLEhA#yH`BXX9j9*O|fMnD_4lYj3`tC(YJW zR2)CdwfOXS7}O?AIe3p7!Z2Dw$gd9oku@?H%$oj&@OyuevkXznv5g9GQ<+c`Nl2eq z$rPPXoJk4;LE*RsmqNy=m(Id@=1^wjwKFvLq(WI)@e-*mt3TL~rHmE|$FOAm$OX}J zNPeTwh!PWPrfS|W_>G=0_PNkdNr?EBT*l^pa^qbII;jbWyfAWP;eT$~FbPIm{T z!whd=8&fnDlwC=uKe(NrOoe0FDb@N8C&=;4{Uq9ng9H3m!6i}Axg#aSeQbANT|Kn_ z_EpbP%2Xyv6WN!k?sNxl+zKk!y5vws)wv=l9Wse&hYb^rmyZ3lMo?!rEgxkkaY+ZRPCbC!V2gA_{Yd^+X z&f(LS5t%aq!j!JvNY-)lFcX>MBW*>i4a#Wj@8>>YKONDKdg<=omhF?2$j!)oA>^(6 zKxjL7@v!z5MCkq^qGbW*r}T1AvOV&<$Dc5S4n+SD<>!pW>{=>4eemQa-b}Z2t=-rV zQZ2XV`K%jXG48PL?qfRLOS^xu{Qs^txVcFGKFva~tAF-#^baf9XY2jotX~FRH-EJj z8}G@MjYTyzqQzzA8qHeESwM4($>BrVH8eiV+uw@vp$*{ zI!Y?AkV0fbp~%x9RR)abO9+sn>3~;N%`&P8fn0{<{70}Pwt{=0yE6qBV2?Mdoid6J zD>qlACp9~NCJY>UJ2WgeAVBB?+yV&WIPVHR!UdX@ZlV!(QT1qlj!4;n$SPUmgJhM! zbx9$Sb^UPMGP245LnwlzaHdgJC2od6#87GTjBfz$^0xt_j5alrBp_tHYkhueZ0|MT zy^F#kNuD^!VC|MbD3+OW5-|MmPKVmM+hRE4|LhYn1=a<)GI0rVjOa-KahQgWEWGRBZ36zp;gsKU$e+T*0a$!C4r zgUy=cmz(nW?q_IY5bvNx5A4dB+h6S>>`q}Le(mQ3>`ES)ep)XErfdn|F&1ADZRy-}r}@UrR(j?lsh@Xj3J=!e1O+1Wb2S?NA| z0&8qagr-qpfd!-ox0(n1}MWKl7=9gtYQQa)r@aQB`-yWPX&1cCA~9Xm({!>d8b@J8oLU|o)c+@Zlwpm z=8o2unLH6R4YxO6u^3hves!V$dI%@TZEg#UnBCTy-eNXeQV7Z^Y~sx1m14P6ZV-bD zK*sKm^yCk%f=3fID8otrOIuWQ!}Wp7)6BT*5{H+d?jTRU+MKBZ#<}Snahy5|y#;Hu zZF)Me$l>Ruzdod(z%LJ$hSecxA>6p>%Uy&`@~V$sGpN3(HEvoFahU9t9|ACY_H##z{t)DbC{)= zGs8QzeI<@NWTe_Fw( z(*+jAAqFRZtf2~lFX#~0OQP)@_2t(%b+K)j939s;6jfO>0#OYRYS0;>QYIoDVFK`A z>`fGuPalpsf07L!nEb6<;#dnXnC3fuQSERc4K__Eh{o4qKFt|NT`zOD3AC@ zmA8*@^sE9loY>%W>bpZCtksTe5UdH{R&GeriyOQxZJ<&aEgYE{B_Oyz%6fQ2 zne-5@Hn=a&$pQ*U34n?xj6(Oq%!3WU>VpkH-s~{<1D_KS)pU9-B)%5$qY>7Dh`Hw< zeX5j?V>65;T7l&B-~QvzKUm?M&nAt>rb})F2mU%<>w4QeYzY*esFxDqzJy+%VmOznt!~3{^Ev|`kU0bys4IQayoTMhmMX`ElO+e; z4jLy$Gc+>wIx5B*4^uX-?bzz<||LI!1v$Z|x^TkUI)0iax!(-L{NK_K8|Y~EKX{i_uF{;z(k}GoSuGN9V zmVmT$SjXf(_O-qI_80fk#hr(kSiMc~pa&WJb^A2WOyB&HBSISuhzr9ldiQX=V& z$D-lnkp)EwYe1;~gp;MUnoO zf6;kfW-lR00`AHno(x%VRAb^@5+sJ z_0G_2oF~Tku*YNXkE9g0(K;*H{}3ZkY}N;?YUR|&(M$P1BoZFvl(;$3k)yx_?0$$S zt>@tXDDs#UGnn8jkZ>ta)Pd`-Z2lZ-3SVXezowtzMhI$Jf0Ygg)h( zwZ2})fwegGkBZw1CajjYfq)l^ON411l5^_rYhfQ(zBj~Cx|<dHP-I%2*|TvrrX^ zwHN~KHs%v9?#k0mIyz%T*Yc1y+hvA62kZ$100E&YuVd}3yxnXzGl}ga zY-9#yFDC zWZoQ3$z5-Zt^!@CmO>q>3z$=&-m>wMSk00NN?t>S4@;dAIik2La-}`$fKq%#6f|4~ zh=v0&Tr5TV2xe*UviiN(>QlCDY9&Qtm;UdnYwoJa$GZvAC%0{552_BC4)WTZmy;He zJB*pGkXh-S_o*KBLP`oy?$GcO&-wH&Dt5!a+Ob&3pR|@ZxG?%p%c~Cs?&!(?N`}Di z&adr)LZ!A2%J=Q)H81CXxL~f1jEJh`OLt>BbnW9Q#)WOt&dMbO+dXaj`~^-evxLH? z5v9SD!K8f+0gs@YSv3_+IKLz_gf*men@=kU5;HXy8IspA$QJ;JhvQn~!RN)fXcDjC zM-ka~>bBVJK$I_!=b*!CjgyN?uKU|41KFUO;F`YQ&Yx!wPWe?zZz2oNVK#ULhZ{i6 zQN`cgU!iT~@59yA_S$8>s+K(?q8?D{um9CV1UGeheyfx)PV14WaM1?nP}zew+Y~0x z`{PRQoSs>Bevcn2-Js%4b#?q1Xv4*Abpu-#n}BwZYQ2C( z@_->t1TT^8ZOsQ%H`Y!ES4pmSa;%v}U7>791xQ5)c8NDm6&|=ZEwCXm0L7LA>|IEjE%o4JaeC z-fw^Lh%`y^n7`Td2h`DlJp;Pf)y};zr3L%ZS$}YeU{v?a16;M&g0!|sG|Xfc8>0j88H-pAqjSu=-n* zM__Bv1d%Bg-RXfzP~R*D!%r(|aueSlsv)jL4?2_N+?BIsnI^^LD;E#9o3|fPMl+KuXEa_u+stff@dxX@{RI()0RQb1u ztakpkU_keP|58k-V(-2!Vn%ab^*IR+de+n;Qpi85{STRDd3PcAw63mZ7t6|a>G9D1 znUK^N+kYG~hP~Z6{Xe-ve=oo8X_d9cSr*=4C0WKO`2x#0)IhfkpuP3(MZxYs_9jpo za?o4~BNeznWrgjW$QF)16nyHs6&*Fu&{IQXOjcWnD80=Ny&#G8gK5d(?V>*z@8!nO z!-47L3o6ZzagfX+dQlp@`BcgLhN+AZJ7+l4G;{yZxc#ZNnIBcsQVutzQtqV}NAL<> zNbxVH;mDF0@hz(K2j3@(>v@>NcKy7z;+W9w28$aCZ~g5Ic1dBIzKlo1D2Itpt?ls^ zqU>#Dl8NQ>EOZ*Ed{}rl*>#;Dt0Y1Bkm1S|33QASKqAa%Z=!@u?#x1r2vrzi^2>8} z>ZhM_;LnZXFnEV!e5DAh+v>wdh+%!7$ufvw8JXUYJpB4bX{DMI*0<_k1BxYW@Vs;- zO;Ey7SH5;{yls8Vsmt3s+NdYDjy#O7hM(8ML$KZT=dQIuCXO@1-U}Q%NA(jLhpDyl z#&CjSez+8iZi?G8`NCjsOi+@uI$m&ml3a~E(k+b^w|^=(q)#p{#vEOjyeQ+Qv$J>p zTrUXws~|@6azzR+ESA|QD^*eak2;>s1%RGLuHU03@l6Wfw2kFW@~DnK>VM;!xE%vehY5p&;9_*bt7QM?r397QrL(HGBhYh>q$LU z{#yZNNJYavj%3&H*U5_{5f<9hrp9fKOsz6IJ3kf_+%7Vt8t+z7j}CrjQ`AOK`cUQX znKGM=GzDkkoboW<$x#bp7R^7E%Vv|&7^t&-7U6l)#ITR5+_M_jn_qd}OxzE=j&{GH z=_LzVA4TDx?61#IAtNy=pT>gjdYj2H5QrWg(0{8YR!1-X%0sB9BkyLIj9dPssRR1e z5{Db8sB7iOn2%y)pM_DiEv;@MNFoe}6jvABZy!2!#FQo^;MFFovP32#$y73#$|~*2 zwIJ5eIkOBVQnuBbKax%K3#BM~lOc$7$xUTiTZ1!}2Gtu`z|LH4clwP#g39>%SF(1! zmfmqfAl3r;zN*-Xqo6EIP#z*MkdCqjF!M%lxDgwPr5{vy<9wUxr{!wK6~9iIH!G#4 z^Md>H!&_4&)+mPUV6YZgHEWDB0YikUH&dE@ugviVvYO7ykgWb`-_rCBwe~*_<@o9v zwR`GQS>{rmfU7ey>^)ce z%0Xg{oK0RMiM=RVyxgDTha6cXffD<(FFv@#2v=4$+9p>whbe5s%auZ?y~-%<+TENK))c z4cF4_)XJ|1$JCQ5UQAEXeSGJNDZh}xyJXd)APe$F9mk-tma@=0@a#~WH$P$Ut8@lu zs9aY%%9zXLBP{PcI4=ENJ9>b@YL>e_r}GV=hg!pZaoae8Y?vo6zG1lTtg=G|)2t5d zT68(FOfdA0VzR;M#+SFfSO`Q05J5|=sc6uajKdHOi6CJQhBsh0vrRE-{#db+bYCP= zOZdoqN+t%XjqfwaM-d{!f^+Q4Y^sdjDsAkyDHFtNS8#0Y@Jqe$m+5NaoN!aR_&uqts#7r0&RKk zhD6f0+Xj1}FpbqPNfl~@G}S((F!gS^`nr$0Ok?$XIc&4sqMvsc%ss<>$Khns-@<@r zIr;hh^c^?CK1t&mD+VeAqL8zn?heu{buuy zC((O91b%`01eOcSsp;l_iQXl5QHTOl~`{^a7Z zH^UO8w1^N;MzhuxR!6f|rZ7L!7#cIOThVxL)@E|1KKLwuTu_QU05$Hzpq$Ff3DCNy=?oHM2S)o+0cmw?2amfM020ehm)>&on{FmiZAYZS}E z8?hP?1kp-tf&kQkW7W+Wa%S{Uka~mVt#`^r!eT9yt;GX!sf1;nGhj!I zQgDFElGVd z*C+EtGw!I%Ws+$JbkRYy6aJhKGFF?Z@NbXt!Kp=)VS`qd^&>SaFCvG~TM3xdWolk! zf=F?OVxbFONy<5aeZ5-Mp{&}mpa0RBlQ4SN;gTi(!q2OJ2?_gEYx?H+vv!=E4GN;0 z?v*#cyRSdcH;7u5XRx1P`RuLByM- z_s#W>So{o!-I^)rb`gtH?fZ6=tjBuaJv4>37vTBxaK7%wiAQt}eDtc9L?YNmChTstW{4 zvmC`l*7AVc;T~s$rFNK_2wkh$=5o>B5yw-)uJm~n45`+zpLuX~6cvw;Q6~QdT_8DI zUA(NW4RYiF+{wi=K3YFS>&OA_hCT%b9~V*W_jj-|Wf3IWuUilHLWBKC#pmOCd)rTPtsV71SeLn}yl2qe=<7m_ zSJ8MY;?fPwG}N=DJ@AJn@Mj2pu1X|xY{p)nxCafYv0AYjl>sdQ2 zmQk)_&{ANmw_l49q<4K}A5`3LY^GUmUXg|6Gmhs88e<*j^-f&e%3hFBt3U9&*cA7x zr>C~K^~b)ODrFDF{fGftQ@~7(Qio#oh9M4Rgz4o_B%3~3GhDhKd&5#a8a=4HRh_Qw zp)aGUEfW)?l%5eha!c02yX&+&sGh}*d7Kvemh~UEE;xp#7qJGkQ=Sup5 za=8lZ&6qXJ*?rZ;retF}o31jICC;whJ6;?0 zjB2oLaSx_k6eMy>INxsjY^78Sn^T1(f`Jk<$~ag{t>hO53^6|(YV zc~c2Pi@50+dt2dLnmw%cZGh-m=#n*o5$5Cnxp-CEPCrmZ$OXI2j!q27>(D+y}E)0VBYJy!x( zbHU{2ewcE7F89Psst3`pEB@5K@!_un8jPSj0i47eNE?44!1@65sJMRW>K5F10zl6Z zX3#NWG^U^#OTcLglbDl2=&3ECENRnq3bAX#csgKc+8CQGZ+cvQb$AOVyW`&Ka#eiV zF3u7Nk-pseu+}z}JOcOo@Ln=fuJ*l~C@r7eYBb42a2c-+U3)md_Wa8Pq?DfHd2`j* zm^Zo~HOF3iQG+)%AnUa~{C2bZfYftD@;bPb91-xTx1r*IAmG2wo+Cx2x~;gH;HNOt zVGtCKEg#5d`TL-LTsh)yFDHOT7FfwCwLWQrXq<|n^zC;6aG+H%E>>0V5cA0H&P7N2 zy{p#V__sz|0Z`s(=5Eh8K!Q;f6LGSP$5jtm4A;1)NHSU>Xc^)?IsDr%@jE#*qNkmU zkL0!srN}?i&F>s#QVBWuCOn8xxk2JIzOv?6ON&a@vVSNZUd{)|$!q?Ce;2sj5vh=N zm%UzA2^=mu@LlpQ68x=z&>fMj*x>6ko|4+%RW+ucH*U+!?e_lp zImM|?!6hwhGpleYznbtA$dk%1!Cp5ik+4KV9XN=$IA3X^--U^iGO_tYh?~g5paN7S~*AwxuaMRiG&;>p;oAOT*&cVp<`mTSY@PraF5&w@&fd|{ylf1<6 zC*~C~{esHyG?A4>29#u^Yz;u~)owy>DF*7_bFa9ld$Lsw#)+#M!9>^_i6%!Xp!b>x zGb*ZcGUx5U;F=TOCq3h~RJ(9!Z_s(!j2D+4esX7=`d%Rv?cGx~O8Gd#N0a9X^*wig zhl~#P(Bwa^KegG>NaHDoEcetMy&>PS0t40S#i^Fk2MDDEpz11D^rXrNx73hZ0ZO%; z&X0J6qZmZ$0P9s~G4k-trHW5WTqS$>>#=kQY(ocNn;TZHrm{4MOw>0N+BVf!x(uzV z5g&=3{@wIwJGOuR(c-|a8cP1Pf$k;)fBN_86Av*fa=h4R1Er>c?0SIr&R5&&{m0B+ zc?WvepbUuSCYSs&Ixj0Ud69Wz3qp$lg=D5&G&dlU>3&y|L~DTa3mczTx4Qv??l>vx zb02Rz_iZ%cPVv{O&fv`K+8WH_^1CYGWulf$B-u4 zi!Q}Q_uB_47C*x=mD8QzC5EI8PE0o;(+&MeJZgg(Uf$IBJ)75K=TQ38|4BY*CHY9G zOpI8)LrOg+OmzPY1jX!DeuRF=Zi3m_u20dsB8W@NJ665&!VA@uLW@&x?T@F{XQ-FW zdxaH%b>hRmu^mh$0-5DKZ0vNPCaGD=8DU^$<7lKDpi2;?(BfOB*ewHw24RYp!1>Wq zIz`#LUHKPsHM2af$iS?5QLdz#OyuQ7sBm|o16GpyD)JSa4TjtknQly?0K;LNV&VOy zb8S&55l~=hhDK zaHVS2><=gRa2RegBVla{+xZ80-#(9FDWnA&BGdnt$Npej*2P%k(P!^`RiaKlU~u%ET&~Q~k|Za7L%|h^1@Gk$r10X0roeQ}(1O!_Q95H7ytK zrp^xBZJ>{-4Rvi>!Dds1v^HO|s8gkFxdD#Y?B-OT==~P`3tGEwM%vW8W&)=Q)Eqtj7VE3pO$Xo{I%5Yc7TOw5(LA-AbImDV?!3|O_j7pq@g7QXyULCv7$52iD= zb!;|H`PK0XH4INtS|%!23O{Z3`MabtN~cEQM16ebbAdS;Gq^+m5mZ~#Yp1|CPI3c& z{|v)%v(8AxdFNqcpT`du2!EV%3nkG+YOM+~~>E{sQQ0_2_5`czUY2oUeHtmu)I6#Cj zSV-)e>YJscj$o?EtgI0Xd99l9D%0aC6HI~!YyqL|FhSH$hCqp(uf$<%r}-Ov(q0s_wZ%vlwct+<&TO*u}3T2Q+ z<{xSsHzyB<$oZNNZ=*DXk9t1t$3jP;HFYXSg|$Dvif4<7*Hu6NV1*Vc>;*Xkvbe=L znWallkey7!(1ImU9`$4>iG+}eU{MBy;+D{8Wr;B0m0+b(_qwg+)#GK@mySQ;F#qU= za(X@KlBp=?yI3Z*G(I~5tMtBqPab{fCIze*uded5&ejw1o(Q#G5lKGhGe(YD@ z0N>8TEfhKZjW3twvW4Xn^M4afzm{QIAC2#P`Ga1W-%*~f%U|=4l*{lsN>p82^LB4q zZ){XvJm2f3nzNhp-ZCimxk-d8iiu&+6(oD&P9mKileXZOX2mmKd9$B~P*L-Jv}VOG zDoTdwU({w#29h-XwqW*#8)i9FUwyNoU)z%6|7#tuLh)zc97++H41NRsrg=`igAzw$o9OM82-Ip#NBwf_Bc5HXb*>63tS73_an07NuqrY9MreL}K%9l_2*Mita~ zEd|HMCTC&9$Mfm(_V;S?!kQ5mR~k*UDNt51;kGQxLtU{C4auUWoR)a1h5Njb8|&?3 zhlNXKAM|P(gf{9@ktspzn%!mKuP0A`6tiU^<|FMSmn3<9So&kH2G(Htc`H`oQI%7% zrt}tvs^LbvLF~3b_zgkK#GFV6jf;t95XM?ZrA2K-NC>egvCiiL3W7TSNh#!E6YK?3 z0PqJ8EyOKX<*U(93XeeiX&d;1A~SuS5z zrPTx$E{974mPV*HWv|KGH!CtLl(R@(y|X*r9qQdL4m>!lirqMB6F3K_hQht^hil2S zfvS~yB|?g%;4T1sECU#2-}7~TGfq;dxFCsuz#DJgZ(J;g9G^+zXB+ZE*QqB<)~>Q( zyLaf=!OComNdTP>&SAjX+MRDw({*BKH3ZN8!sTw?EnhK7Uo{O`Zj`j+7vOw7BQpR}|3Za$+k z`_PmU_6jhG_g2^}r*`=x4S5(9Qhw|BfHTu_D2bS!et(h&Op9ORC;L8aFL8N1vb`Py zE^(jW@N9N*RrSs~vNu7}2oV$WE&&QGY-$H0JG5}Z^-C%mMd7BD8A_=Y1lvnXL3gZo zV92k}7Tu0(RYeVQ58O+rcJho)7GVzeHwb(#9#-^qJ7?A_XMa0HDXP?FlC4#2x>6YD zrFXa=>)_7lIofRJJo(fJG+nR9YVzfM5<_E~?N3AbCp`HPx1NRyix=UE2BdC}cf0$| zm)?#m;B|IRRum&u^v5$?C@!`Kren8LvAdl1IR{@$`=v_tRyHe-b&5x1EnxK2FlAhI zyLRFo|LE9ITT!c(pCmJ6rvr@{nIT#B3%kMG+OvsvO|ilWiWmISrMRDFwx^lUxhKa{ zDN@zabYS(R`6c=IjpEw<)RIPVp(1kicVzJNl<-cqum}n)!`4+j~Mq5<5fWEk_S9G4prsL{Xf8|To>BMyay`uk(Q)Ccqr@sso%uDcUlu0J_0v7IEB z>T-0972Z^extSY=-k*)Hn#ndM6Qp&ee=z<<;7Q(`zAb&ji_m}XQD<4d>fMOGE#q5d z0K`sMR_~2vcz9i4&V-dd?m?qd*%U4xiLK-%Sko1y)_OUd)A#G5*TsxafQnMo(Hzqp z43E7qEGkb87tS6<%2&IF1;~bfRk0qrs9EGBjxJ0Vce3_FjW24%^wnAUXJ9L8U}(e) z)%Dh)H|4_#Qyy5M2lj*UVCrDL!nddf8mY4As^Fyu_0+qmyQXn34W#Bup(NX@mf&Y7 z@=4+og$qYuS#IW+AaMLNPi;8-uIgoRiTd~Av^{4~WLWn7p?Wh?xi(w{5B_IpJSsa2 z9}fzzQ2CY+Yt&U)@$ziiPUSh(L}_!5GuAwO zh}~fgnwQ(7zHumfm*St+3s1N+0Q;~0iD--d{4%epffz+q@GcmZFlBa~vaxQHBlASw zsIt(?eyv=FLPmP5&LYsz%;B{7ttno)+8{QPlvM-xDkGdMqzt4DwuYZRgLjh_U2G5i zE&Ki73C64QC&(r(4UP#G{Va2wGdxYb$D!Q<{%4oXmn{2IWSSriw)c&ZX$M00u=nNP zX0E2AlJ|`@y8-xr9ao!NW||uF?cMi!kj=Aya2yr3<_v;Oa(@e+eRt{BzwiR2g|Y8+rpNP%%0usnr|<_0~X_h-U- zm=?zAq_dli%zU?qwNv}!{P7kct4>Ta@1!!_aLQr?WG(pjt>^5~?DSRVKc`J1-;GAU z{Xd?*Ix4E~dmBLnN$KwHZV(0O?ijjZ=xz`RX+=7vr8|d^k`fSxZt3o!Z?y?dV>&wkE6du|SX-gFB&H1=`WAJFdm-j9?-O8dEFGx5P0jc36i1jD_v&R14L zbJ)e%qMbTKn%eJL+qxaf%hw%R7IxkIW>xk2Q+c|6i2VY-=LX)~eXHW!is7+~A1fvI zX>SgX0DEsVUjyUFkDJpb)A5b6mQ_r5CXl?-Hw{#g>-NZbNn^>jYo-|@Be()7y%@w3 zfIoSnxJArXINWZz2#oucJW9QGPG$q#82$TO9RAOT8a5#>3rIzb-XX#bcg`*a)p(w4 zqr@@&=UzMTN>UM+=A=|d?Pp$c%Ep(7U(2Y znac2<;?m+cmoBV(yGO-|073juE=^1|UA3SsI6GG9{I|*jImr@!_8}%=D)ZV*kmYfF zry}@I_hAYD(c-L>$Z*3jBWt!#i!jty?_v`gq5Kh(mzn3ey_S>JC zuhYKe^u7kuJa#laI(=?)#!kTK^xn&2G{$1g(GejpveO)A9aQ`HepB1VI&Mf0;1Wp1z61aUU|k(1LdrQyEsX_nmIjNX!o z2*Bu1LM$I3P5K{tkiE8#HjWk#o5P2%xZ}^a1A-LhbhD8Jv=b84wjO`?Eav#6;){=9 zZXB)l_lv)am>EUgP4Queb>F{-a_4h!*Br&hm(QjWm#G%f&%qDYTNze$^YS@1$m^!Q zGu&A1E)480EGl5vI^`|U=PN-=<^OGgcO#cdJab*yedQitw;vXN7#puKvOw+|6@`=( zy>TYrC33rVVEC;dSY;56P{2T$F(>bgiR49*c0qmLoPVO+7@eI2SYcq^Q)yy6(O@7c z#`gtgY6mbtfS|19jrVG@jcrAO+*C*_W$+nVB5G9SuHdn})z)HLJMmvOi&Qo8Ps&7I z54a0X$b%}jRzOhRIg)&tJ;vsFhUlK)5=yrYU3b^!_zjEzw3h2xD~T+%$NN3t6K5Ea4hBx$-Y5VjR~#qtro^KRLeHTrUG7@ zPSz?e4478ro0!uND$3H^l~B6m@XVy`g+t7f!%L){i}@B2FC=lETMc{fAF(C@;zzBL z-n)^Ai_nQ&4%fi9vycr!nXY!<^)1%~bvZ?sN;50{vWd&EJYFqvQeR)%-!oUTn7LMb>`~Wp*cs`NmxF zHhrB1GKaa>Z#8LD>v4sU?2+LhXW~i=rFBIU;Ly zYKv0a;g0jTt(>=J%IL_iLUwH6Eq_jaF*_lwOUAl+)cmS*c#cGWqz4_^@{S22A98K; z4t$t|7S0dUX-a>!gI+k4ie0T+rP=o6@>OpKOI5FUlAYCFN?7a)unHnJ;lq*mBh_3 zJjAOOwMU5gZ5m^jso0WrA+7W}zP$K)N2602RFaXGwXOgOA_$8hlekF}Lz8BH!=ZL0 zr1-mLSDAIB{k!Fx+1FH|&BQrEmwxxl;o>%)0?A?X%tQ*O>%P0{`1Orbp1n|qFFEiz zgwkWet}-fEw{9~Xwngr&1#B-WPW1%|YA8Xxsmx4qacPQp4vmkqp6Z6S%HkRYf^`?g z5=V><;FknKW&E*@%)-CT9mX`2GS|ey&8YuaH1t1wePJc)Vc3ED+J(&nlC_uw`2=xm za^v+3LE?$8Y#wV|k4G~R#@~!Agn6Co6E`v3NcXq<=dT-eG{e{~(3d3kTCVaNx(&TT z&$d!tXO*SWv?>x7aUCZbj=N)schw(+3!)H-9I=qBy zz7=CdWJ}@|R+mbn(*Kw%Vb;fj3<0?Kc4k1Sf*0of>y0)>A(@YhR?x8X&*6v+p6@H24dfJ z%=@PwEv(ZSe)+P5xptFr--Grps&bRIOzt_ciU-&=pbm`m!r3PBlG8dC)=Dh;f$=)! zjzErDtz0B4_(Y3oLH<{#@gYYM#NyWK>T)5Rq+>+AIQf$2jy$*e80+^g`x=8IwcAr? zk0H-H+y1(jr%5-$9HFjxs~=q0M$#VjJ$wprzY=~}OShRYzilv|RSvccdpS=vKNAUR z5QMGWcof{DCNJo^=f<;dj`!KRGey+Wd^frN;IPz!O1=c!hf- z;3GNGl{rrKWL@bwF^Ksi6GpsHVU~FI!yljLM6Q0+gf@UwVI2uY08U(0GvEZlSu$)} zQYhWp;HJK@**-25W;@^dc&?f69bQU+GuZqVJcOZz_eEfcRMW>O(hgaYw4%D9dm;+d z=o2d3t7(!(EUx+T#haS(BB@|GIKd;daMytgx|2mgDimWDX%(gQ7GiNY@s}K$*Hrca zD~@Yo6%CS`=j>g&e(ab_;vX+Ziy<`y^x5jP6K_)iRbvNU6%v;E4j)6uOAV921|mc+ipRq55z&mmuK?2HgRqz( z{+WW`b&qV!u-k7LvB0A##w(;tL@YK>ZwxJB!@}m`8~kC_s!1Z|Wid+&swJrVzLZz0 zWpw}I65s3W%Fx*9-sov6Ts#+wvdd)>fZRiM;YS>V=ud@RHq&@!bu_xvwbUZw^8?29 zSbBBrEf!cXw}c%%;6z3fbdIp$6d0`g4)f5_S z`KtFoA6c8@XH@0!wM_*wiIyI^y&|bY0t)H0Y6iUlp9HhK1~)v4)j%~KwlMvBxI$M4 z{YKEV`*QQgjd|s2yQwge+|Bg)$QOb?2XYCv&|`ak4aM)RIR%k@k&WoZX>exGp4N;~ z9RjQ}?9c3Qdl;%5FAvDoIs?mfqT_Bb9T_4C-g9P7BsV08e z46}+3<3)8zZFcSeGG@J)#2X^>l-FXfHY7)6f6x}-C`j|hOg>3PPL9cRBXfz}o!#sU zei$`mh*3{xHBDkA9}w*hGQMiD5+@yhxp_FIvHU1ngCj6;+KqH=0mJWrUQ+g(&2-4$ zCADhO{>;#wQRZk)-={mG(QK}a{A!br%_n&Khqof@&v=<$C(tWOl@g}@IPWhlsHP-r zNGIxt9KzhoL+H@{L-#g)u`@M?g7F@1=)BFG`6f8Df`~N(_hEQtMg&`Kx;Md1AQT3@ z{oaU#0gQgks^$ZH-~3G^i+xb~i9J4<@9GD&(Uy|AhSDB=BF3KYbU3ShlxQDSaqPk{ z_@MpaOlV4zn0d_g+P&sj{v7cRt+PeZCI0ge33pZ+xkDPxJOM$v{WFB+E3UA{oc2Vc1z=Mz0n&5FHb-sreQ5+W2A zJ%%+E=Y{IK)vIQC-I=NC=8yZ zXW9lZblYxP!qT@&QXr7VZ5HXHqvPe@Ov;DJgL~gcEFfT`H ze(aXDpN@XaQ51W6Q$@Y7zxbk7;jWtJ(al#{*1GAbhSa3w?^4cxe0Y`g+k|$WeO9IQ zF@pEo*Ym#ypge6dR*;n=Qiz@*zfn&D6* z1lL@%4?TbF)_*n~3`Bw1iD+jHmfuCJy#EC*iEyc?zqSQ5p8c1{R*B10g&W{{s_QbN zvQ4{3pMTfa;*OM&ge(w&J52(U-kccNiH{Xt)-^Rp$Hy%7h^-%QiyW?)2c0GT@*tHw zC0Xz-38(73JS!=>yi#hBHq}|Z`Hi;8s51KafEv)Zfvgx8d}yODY?6eVkL4@jrDrG8G?Q+*cO*nt>m;3NkrJpfH1qpXdhw$%0Z=lfT=r-Lek>Zt6KZcdQ!P#AD6M?munz;%4AG#Y# zgs*c~J|X^g##&R_cY)05FZWKLSv4jLd__qRojYTFL4|WkE3+m8g!LrLiEKMu5v)8S z3|gb@pG7ls+RMLXejWYo0kjGju#fP=y~nXau+?|xj`WHOToN2LQ8L%F5QHpi_A?>u zS5!Qb+tGG}adLSyk;k`*45JLwg@a*;tA(f3G94Z#2{We#eZ7>5Xx-EN5ht%kBu`za zbGv>~j^YapHXCl%>utqo7132!M+2=CpNyq2unj|?z-hyb#O01f9fVq&@V{8>z2Nk? zdhiO}b8>4szO!OnGn?7vq>N+C?`~|R)>avmVLoOjZd87<5|3s)>^R0Uo@E9V6WJvk zblb=nuCkFnn#66gz;5#wOS^fT26(Kr53+vLv>@&QeB9zX zdX5||@4)j8LPc_N!}>eNQ)q1INHYJ8)BaQFYe?g#&e4#=qAktuf^X!w)b!I)DWf;R zARnHEArRmN1Jh^pR=?pR)*hZoVPMME=-hy69fYyh61_L>+*rUr*<*_DesVVc^zSL= ziAlfY&$RvN2)pk$ichlZu3o)=I}eN`8~4WSI#a(NjG)Y}8OnJEcvB?po>_is0#lWD z$4+TqYUvNAYbno4k;lfGn^%vO|EvC=7Wuq_H5iX1v(r z5HN()3x(GI8!rE8_2p?cpW)~%oicF)%|$C*55so@!I@8eultHrl(_=V{7s0wc+*0Q z#E2&FF(c=Jz+Ef#sfUJsuKOP9q8%l>bFzE@@sT-V2WEOzk$hZ2NRxrv;p1CS>Pwv# zRo4oA2PuE;F11+Azh{}pY>o|mALURuVqao!=H^2KXjPE(cpG+&b>t8fEO{De^}8GX zNbYmtuA;@4vC2CQ;dal*sowZ;mt!Qx%S$)EN6WZgq|`=N)MkQla%r0?Y4#r}Org5W zwADBg$SzX}$%9X`O@YdHjkJqX*>(njV#Zr4aYl~==R*aN#Z+Ild%rcD8#UnnenxH# z7nxt(91)}3I-Dkxn?3Wk5k!}Yi1O#%qlkyyy;LotE`xa4kx zS$~mv@scqqS(oDf3Df7&(^SMmkBcY4WoEH{XbEdJ-_qtiG3LL&(le%9KyU7vz~vR) ze=jwxQ&^S+!{=|cq^qqTj16nIFE8I_;}O6{r)kUH*>-NriO{ETQiR}}6%ql}UNm3O zh=`*<`CYG(XN>)N@vk5>6(2M}4HP2MLHC5_m)>=d)`CHXFK-m${~1FsHK)B2HR7qJ z!-WB>R#~N1=Ep&-zTFppy26^gc_2e5P3o8zsvq1#A!~;=6(m#hQP;G@6z9>MjPCU0 z6H9r!a!7w}OjP zzw$x)@b)g|=X7R!me<%l6B|$c?Zj2;MTZ4Mj?8EE+DeurSfzy3={paJ9{Vp`;CvU^ zJySfZi>tp~S*=L&y6?o3nNtR4($s)SOsvJ?$1u>=!_SZmkzEe|;S2a+l>_l{!4)ge z{o}HSQ|nG|Uy;U-qDi9mz&w}FypsZKs_;M-iEq5R$QB_js;muH{gA3vUtCD6{Fy@@I2V&aV{H)P( zclH{)BlAJmH2zr8<@u9G;J1_nr1T{|s^mm0>lokzY!DLVdQ)w2^S7lwvirN;pq|zh zMFC>QqVvIW@7%^DtMx6 zS`byj4=tToI^1zV&8T$O*UW|UJ1z29{_%KC{br?KJRGRRcE4mN2amT6$}X=Ce3om7 zl%h^f(7{34RurrMvuGljp-%eRg!Rj|JgWh%dvi&1iddMwtQWU$_%`(JCTQjftC&W; z55yWYvmd;i$TxBY%HFzTQ$aWxHNM4~rr0;{c}H=4J?cPv<}x&h(()VarjfcuG27HU zk?RTV+jIs8EzC-@Xc$f0H)`-;?UB^Qf%Z;c7M5*%MmLxA^1G$vE0(~wW@*Cwa+a;4 z#{rWz7oweTv6l8aXXB1Fl+T4z=$rFDj;~9l>OtZ1M2E>XH3*vVMe5qPMJ8r%O6jx> zIK8MK`t-uz=(2|=l7_f6(S<~`NaO@ol(+26ZJ&*#r)j-@PreJ>ds@$7uF zs6OmEDMfk2?@qo={%INK;<#djvs(09Wv(apH#Uo3(E50bS>EPkudI$w+Eqy|)*)Pe zAufI)udNeY#4nw-|F0JS5;&LEt93*zu3wW_;Hy#I;&C)T0w9fg#{pjU6b6Nq*9W*G zKe%8i48LxMakgjN?_(Xr>{a@%fB)n}KqX}Iy%34OZ;4nVea@3>)CmE$Xi&-^t5zm) z@%Bo*@3!JW4HIE<7Z-%O_=Nb(*b#~>%*5tX#^=sj62dM%BJvBfpv95cuqB(- zmW$|n!>bv=FW&8QhB#(gCx^kg=;mk+gy4ESX=`uTu~F|Ny_loUx^dM)&*3I$*9EfU z31Lj9Q~scm|C;F^q^?yHVN0`=myV25E3`;vBm!V|TCG~Ho$Q|`;*rcOYIhFfkv3m4 zl&}ioqhszqZx2|s_cLEr$&k@dh- z#gst+@5&YUOY3d*yPIwFD{fr9tR%<2y)y+T!W&OVi$$4iq4@%GLxb<|uV{LnnaZW? z(`R+q!l1o9gr}6s)Sq!M%`db-B-=Oy_5C4)$&HL@mP67+K?4jFxQry5`a8wUi6h*F zzRg~LZ_eMFq?Jajc9*ChvopUZLjL7*(%4|k<-@K2d(1yW(GGQFp1Aw>9s{^wafQ0$Ql{3 zluiz<@k163_`%WSvB+ENtkxeBixxc= z$STce_mOkY8Lg>0ngrF)89l{Xb^uY;?1FD;03r$wkw-%?(vR^hsW=jrR+ z0{K?q#z(!weWh6oCL>oW4wW3Zg!h>lD0j0!R2m6uZ^IY=?Y8^iUvZuhBWRA=j6~Hd zai6grFEA>D)|ax<8Ycf{)UGqJ`0csPdfPYWW*ClBzW$H1HG*uT#7FkzFJD6R3QX{U z8dEf9er2|?alRjYv%;Rm;jgu;_~6#itGGVp1O;@gSUhK*o=~O|MZZG!cv zyM)6j#{Jtpv>nlJuX*uaykNDO8yYnQm?U@!phH2l{meK4RasGXnDsBk&s=tLwuG9Y`I_ zZE-~EYZ?rl1ZoP|@%VjbsCOItAVKH7m39PxQcq9JX@FT<_Xe-{~Dj zRjUspoOT<#7#jA|S#84V8@(So<_tmj&qU}*Sb)FdNY2IV$eiI~S4TJbuS}P0mBa0^>3h6~8uO8(>^Bm>S!g$${ewAu!YP*BnzeE2i2Jj3 zqxqJ?^yDOM@+HD@*(SnhGlqy19n9=-5D*kHdhZ1*RIEAS5qNlkFB;W`{p(lZ+Jqn9 zbK&_<+fgENkyytA4qQbl&~=hryK*FUx|0~{Z$3#h-u*@;#u4zdVzcX%=9 zK$4=Zudj#t`9wuU@8u|tnJ{%)uESOAbiy}^cqJo7xdW|mb*65Uxy?Q#X`!OV-omCP z46>~Xqr<=c+CL7(sNtM%&OD5NK3_~<>ht**L-R@!Lo5{D3Hp*6{(eszE?;lv?f?({ zpa!D+03M(ib3NO1GYJn=_&_nc1T^8dYDr z)XXh`@E>8b@i>@kZr#FK6k0m(Pi2#|_~bPvi;@pnj;w$q&wUoK4;KuDqsV9rwLM5- zG=b6pxrUULqpE`EJ)t1R~R z3D*(Qi$R{@4ALxuxt|Ov#tB~22+se) zaG(|rA=4LZ#eY@Q!yC8#M`&8AHQj0?%`?P4SfkUJp*$jN-myL{_WPf*h+y{YGeUQ1 z;0P8uNje{#PcR;8Q$GFbb9LPeAr)rUUlk2nuTx5qC^On-)GPqrTG|7iC% zc)U%~_swaV>H8woXInIzC$c-Si`pn#ePPx1#Wym)2B&V`S80SC)#%JbLVBtKrHKEz zN(0K5OFU1FY825NUpW+MWU3FJ(!B`QU8P8VP?(@;IYim>ymzdx^A3yssdn}K2A?%Ac(Eo=#yS-Y6E8J6IjNWM!fVTRnA-P zHraR++hJm@R~k}{2T)!9jXF-DJV6gaYTJxBh;Zd&MEQilP-Ls9Q)WRltyegxaxHr+ z2%eyJy**Q^2l;rUBg4sk@wrTajEBGJ`!sxPQm;#iAm!8$LEaP{vof^Y?dX}@bZ&Nr z_Z+4amY#lwwqM}q<4b&IacMj_Gd7}VJAl<5-P0_gW5!uzmKe?(c8TTiuWI{QC&aKzC|3*RnGB~?9KQ6{8wWY=09?|^iLLd75&3QjLqhUxNI$jNQkJx z?W2iehN!#cq*89M5!|mom656T5|-q!4c&&rif$*)jhfRDv!zBYq>JtQ=V2T`!I9+M)rHEu0>&UGP@`9 zmBV8!*DrErg90@trqS^s)AQFITXQ&gXL_;QM)#*W=Xgff-5PcC^9$UHRw-6}MTI6h z#_yaIetvu(y?u7VHp<@^P~DVtb!By(lFND(yTR@w4oAa*&V4qq8DC%Z0bJUCKhe07 z4(;d(XN*EBE%OYA)fTE=G#g&DHek7lO*yu0MNx*$-yn5gsY^-^7C;LSI-;JL6)FE-%A!7t4Qg))jtYJ6=}4+>wiVPqeH0cO$st0WAEK@)PTHaQ`6`rm57HtiKLC`PJ`4ycIDMoXXV`ubSR&#!l{QirE~0L~OUF6%)zm2~lmW z>oXmb!5tUKZUvItlA{hyCc=n`MQR-k%WbUC$m|c186$Q6CQxMip2;_qRBzgs%o$>t zN&VaOUOX4-^ftwlBUeb4BV-N{7KQmoxkK+I7hBW{3)$>hoJ_$!Jo}|!;A}WG&SJ!%Gmo-Y6fS9JHaT9TmJs`I2bXJj6)p=sARI6{ zY^&UL2wG<#EFRd@>Yr}Vq2zrA7em3;em*Q9g^W3)WeMuf=e}#mNH`HUjti1#y>SAN zXo=63rNnk6+$@!|x>M^g|1`N7Cr_QwRH=VQC@G0UlPGdF=T8)0#cLNf zPigS!RHUa2OL9makWu)Ybeo>>+!mb<7hC=w{z&Uyy6?ND$iq#x=Am_yHO?w}%(JA* zs^J|WK#2<7SHI5uofM~y@c&13ZdvM9`(QTXjSMg`jtnps^lj;;Q_LNnWzCTK>nR+T zijJS5G2|C-*RR-vOBu;ahRz{`z}frh^gXD#usUANFY{AmkLdI*ZqWRdj)jBXiYzkl z9JAbi3^G>)H?N437HNQ#2Ae{)ix@36m6sFjW}4+I&{w8scM84VnS@;Tk2=Bqe!VY@ zKElS|w!=anLhs=krVlz?cerVCwLanpN|Lj8TUd|YhucgfNmgD;|DG_H@ElWnNkNz0 zH3+i0URf5{R05T#%}=WhdR0fD9;iRq8}{2UaQL^9zxxHveOK$)2qYlBqDFPmxc$fw zRFm*Nq-k?yi0lTWrhlrs>v`c(3H$Ej+>uAN; z|24Odf~mfdt)Pl-b@0XO{pIou)H`pc8)i75DK4unpsr+>6IZ2~SfvV>BQ`a!zx+Gv zW}%tIO9VJ3Jg>OC^LYzXuY=HqzL|*ux%=$#0R2j#Z}QTfx2IgU^#MPGg`lC3hY}Ae>Lt>?{P|-cG>e`T z6L-u9Zuse85sl19#B0lGee~WzQBR26E+FPAUlXy@>}ha3fIj*q7RyX!sz2 zm@}#+GiXjWQC-ORbq!g z1*~4-y!JhmEc!5RguIwuDclWvnr(6{{vOOM?V+qopp(9ooENfHQ`(*4v1g^HakzPO zpJmVFWTD`LBV#5bgiWz}SD|uFP{YBq74sa7p51DV`(GNQ+ZsaX6u5E2wO>T65~nfk zH}mWFOqmI1qqn9l_v0bA_e;zbD9`cygr0?BbVbDiHMX{efvzJ@F>4ydk7ZR4q|lW^GA+KWN`4a`TJZ`XGtt(a0p&dU zPR@v84cuKyBsX3Uo>Ht&r;*(3XIGur?Bk3aB|L9jXtVsY5%%)AuE;u0Z(_nMKc~KW z;^hq^G3v0`{BvGxZTOa8HY?zElJAJ=!f`?|UZRk(tKUp5e5>70lw8O{<8s5NBNNEp z_iKN~&XM-T1@IlW+ zN6$ugo6f(PQ>>9>U7f8%f;#4wu>S4TOzJ-ZCTbQ-X~vgumg8@~nVgj5(d?SraoKZt z9b5niBXFc79MFW_Jict&jW5YV+HIQlC_H?4({zHfPO+ADfqK6)pkFddjZ*nk#MMHR=djhZ}2+)*$j}nFojimAIhK zIOEX!VzwuN^-JLRn)aXM_~Xp44;oKL<2%T*@2N2O8u>t za$Ko>4`=Fe|0zOY3>)*n?mg(LZ6VxeYxv4#t-I*=!u2ZBH23{s)mir>Y%d>RF^==c zII?J79tNx?^YQ4(y~pplz5G&X@l!*Ft{n7P+~_V$FQo~Tu3hNeJ>{*xoDWCTl$1l< z8UYj?D;NI2jX0n!hwfQV$S!1Tr#~HoBRWMniyL5<@h8h2w!~?RTUV!0FW5B4Z-X%m z;C5C5fr_Ls0t1Hpn_5Bum-Ld2pcd1XLsA36mKJ$#-Ud4LQ2e%2VQlW3&U}qG=0n-D zXD8f-5qJuiR^Mgk`e3p(&<6DHdE+k?M5{B#_#Nl6%`OIuQ{Mt-A#Xce@9&Wzh(ZKs zv7)0oj0$^4UAp#cpFyQRl}7(XQ($Joy7&@#vDF&5fsN76N#R0l`jXK zE*6RdqgCvml=5VgO#j*El)Vq4XIfKDal~Bye&y=hx7Q!Da97?;dwA9x=PRSQ91h;O znUeaM22BXh&m%uLD?@V586*0Jmjhec$k_}n7yT2O*WWmSJ)J5Q{Xj)?hN&~7m85g( zQMTgpciaJv1W>=Rwv6NQJ94;n2b_8hKQhQYb3n&%FiyUWE^GWs!T$CN#iPJ|Up5EU z$Ygix=2?^UXRy-pomoS|Rfq0K^4VRdULAR|mPym@bQUdY#PwrRT-3fl2}K*&QC9}X z7?>VfT$gXSoP#>KSwZ7@)a|cvu=mM_zIM(>W;XU|c*rL^-$hBLd-Z@tYW0k2Lw#~N z*_0b{!Hm4rFa_}SgR*a54vid*Ce&86r9G|xt~v`_?o5NtGx0Xfs!E@JK}xh}pA)z} z=|%FM_W3IFiNRFj@iKZ!;s3wk#)Ek0CQtnK;!dkhrN6u3)n$Wf@Da(%uSGdG;J%4U zmU!B+F-;%n26{4m9Lyv0yj9ysUd^QB{6vEsIq_rrwm|aeY&#SHxGC5CivCb9nN^GL z-b-M+tK@Q!m198st0=> z06#^SBQo0_&)6yUe8s^J**J@$y>%vBS@PUOi%ZB0 zzZGu2o&Wj#xwG>TGh+$wpO4gpvc@}+JsXF0_(z#4v%}VKRu2Dl7wK;zKF5BIhTo2W z$gf`e_(~Akc_xEp#8Fh@^AyV-f4P9meAbo?J!&`=DSpIpcwF>&1p!7yIgEVxA+$Q^ z=E(%KD>q%ovULLe$j=E9s28n>%1vi}Rfso#+Zb4HbFL|j;qQ#k=_qS*aallm`-|U- z@cL4R!!_dt`6GARdA`$jv3P5&b%#F%1Af`vbNHxOs1#bl)UOJU?2P7c1TS~=YNH6~If-obF9#;;cK{_PSLtG}F%cPhRn+(L0!7R9(MQ=jNUcSA zS><0vi#NfY2M=fE4kT9hkVU>c$$M8Uke}K9z7lJD;~Df4J#zD9Se@unlrdy zf0lgpk=9~TRaU`?QI)^lmJv}txBkK7o!=8mLA@6W(?|XxZ~os}{oVrbaIeR- zwJPclrJzFCD-%PXskzjq<>aG%_znn(((XKAD@?ujvjjmkAKB! z^sW0yPI}x6IJjWJ6hcTZJlrp>c2&FiVT+}(R(Hn_2=602o7ATbk0JVA9{wg5*WP;D zN%cc)ctWgV1c~~2ZAYVh#h|y9L8bS(zJ>us`G9bgqot3nc@R4i*io>H-o9|oIv+jQT9tD0~z zye2cX=0GMk>LsgSpbl2_HtztKH1E{!rt>)^X{Qj!6LeHZe*8X@?lmH{2?O1|fX zeB$}n6fEe5vYpTW^#WL)Q~UZBgKBj59*NjV%cm0FwFm0m|DerMpJwx17)mT`n$=uu z+mv>#uX(@-2vwp71b4=G-qja+7$s(v7o)=^AYQ}IXN#$J^3=Xo#r^KM`GHjr%37gA z7oVaia$GyQZOevCOX%ni%`_rW&l-Ml?AGxa^N}F{E4>cy#(=~AbAYH0HG(o>L+=w( z&nC=$Tc{d_h2`dR0#%>%ZclbxS_|kLZFQ5Ek)!V>4Zo{2-RB0X-k9GQwEwpcUCv$( zaI&0wz{~}s!5LFwxivj~ys!O4P*7~i&3Wm8O>*S{#Qx&CA(Jh?v&vk*ZoRsl-d~6~ znt8mCEY9R`meuj09h^{juh4D6~TsHSJIp4qcX;KtH)$X z2E5Lw@m`19i{O{*?sLo;bYx;SfOIFV_Djvc<(-H{CcSAk(sHtghoGeUv7KXt~ z!phV_wnPt&Qf}Q!K=elIBW^OpXI;m<1_XOEh04lzSg4m)ejk&{o<%Ya6^taoda4vA{e-Mq;dN99HZenh)N?Ag`pyW?Jo&gbT8;N(8KU%_dxDF$||5 z`a#C9AjSU-G`||*jR1EP_olp8Jh_M%%}QRaLfz(tpv>46#V*-4N`KLqJ!m4WFWEsM z*<)fITNVayyTT6`OHW@N4KW6YsR_s4vf6-cSsRh;{e#A4XIwUiyFB3jUw;(pNJ!Jr zx9|H_O{|BF{pbC(U-XZy;CdV8bVfBE@4IX?iR*0Q{#v;oSM@4+FLBc?>9*YU zckMx94$0j;Mc;axc$+F%z%=tyYnou=y~V1ds7D3B9VBnJ4vys#sI@f{EC#35uLi^~ zs=^CYqu5aS|Jto2-JZ9saQ(A#x!`V$cN56&*D6HW!_33U(8I}h;7+rzIAAyj5f}Oc z1ILmA_4%5cMR9?z9iymP*(A_}($7Y7+taFo9#JJiJyZI`x&<7+JB=mdaAF-}6_}lM z?V{uz)bg=3ez`tjlgWYA%8Hl%Gv61$=D74X_NRT#_#Pp2zwl5@YJ5?nkd&R18_wVb zZuYW~=NV1h13YedlIi=XOn}daG;&a8>9a z(w}EW6!ljC<6sP&{Lcm=C-rzJFPvZ}^`qujzp}qpZbI-(Zc}H>~RlHE*qD&zre~Op?jQ=7vstOqm`w`^@K~9?qFC+f^KU5$?=BpC5|Pv z>K7oR|0c2`=;JM>EM;i&O9-5uAai3mAWSP-_*SFhwAIEYH{>PTz|Lf^u+W_hFZa0p z=D70Eu=rT#;m?1X_&Q0b0QV&U-XRbsa5Wf5tDW&z?i-4{LjxbTp;v2kDb0{v^lo3k zQ31z(<(^?h&|;8T|M-g(W4+}135T+2Td?tmd18FaEYp3znZ1&bZRwPY=g_F}5pdVf zJodaU^eNEk`T1(%c|*HPx~H-9%HtOO-ErQ4+N0o?`;IQ*JhXSCAL+&xTpD*yrnH+YGUos zZLksh0i7;1Hr7Pw>`U_!S^kg6dhv9T3hm z^vw5ns1&%Oh~y>`5{%@MmjyTY$t?A!koGP%i^g{TCK$^lOt9{v#M93CvNQ5YDKhlx zqR`xwVrcKeGMoO39oS}atZ=;_>lK+8jOQPUc4@aPeH;w+2&Nyi{STcmQ{#9J+qkMa zM4$E(3iQ}*vo(B0XwhdE`#G~Kt_%zNQ!4>I|Kv3VQqbBv7<@)7J*^gAZ@rx(Fhy%W z*=fLBc(ndG6z6xYB)3aq$dxUsC)2ePCcc_=<~^#os+jtQ_kJ@=J0;B=t)Li@6D+-+0Ywnkx|IJtH1fsd;E5F){`<)Hot z>%R~!7X`cvTA2~0!$a0C?v^eFXy2||c=1r(yb0=_Y3rf2Lj2Ht{~qx7ue5A#3XKKZ zAw}Q*8W^mD$~tpk97X1UhAAV}W?uxqFX_N-|&7BfuX zZOymImDJyDY@nfTkkYt17RQ=GADQ{?riuh5{tq@_D~x){zWxWH z_<^4&1?%;6nn?B#@LKw=Li#Yvw7s`9L0Vj~9fEIZ2;cgvDS6}>AaEWgoReY0(FSW~ zS3)e5KR6cG`vjdWS2;>vdAQE82e^%1(aH%WyC=;gi(BniRMTB1$%@X6vjVwnilwD0 z?H?wh1^!19j`Mr7{MlW>-{4(Z9+oAC{h|44&&KA-`IJR*9$&sIC0Oe%tsEbF$$;s8 z!Od5VP0;-3~-Qn%_5Jh};nfrYDapE!t=uBghu8rlEV?1LHgy&o|tIGv!0{QP4F1;BAemO3odCrS-tkZ?BtP0O8}I#SQqoIy50jCvV{OOHD_6ju zxt@+YIzxRHMF5EFsqX<;@{E+Mq?LUY1voJGmhzR!4rDum93A(3k9Ur}td5dtr&JjTj%$!g~_aMgAXk?-|!*(8PM;6~;U7oTWhUuM z0rZ1{2JCMpC+JHBjIu|<|xLd|WRD(;+gF(HO0c@zgBm4Ctuv_3>PE1WjYs7Ej=qPpIj9j@q{S%OJ{(I8j+ z7(hL~VL=a-vSSS}_E4>n&lP!Xnd$P#Yk-4)&OMzTo?$_n9K)g^nhB37V7Q6kR#1(} zFU0A$x!{qKxt>#f`gvcGNT|q`jiK9CG??0*u+3#-aTkK%=ha>p}$d$NmLyC$SI9R_qui%)o6!dF)?vS=h4JrsWG+i@Q%0T@*(z zpGXg%g|S45$!1|)WipbcvUwKrH}tbR0>*5CAO&R3(y!gBGi-g*epK$AjG+fXWEMOT zMT)drY+3`(n5i#%z{acDkKG)qTs#iCJSDEX5FHR~$1(6+C&oz+sb+J?Gt7U$ z8%sFhRMbniTq|@N9g`F~ji$2UXBa%MOEE82wBM9=*OUS!G6 zjneFX|A!s^q#ii}=tf0n=I-gA1D*c0q{`)(wh)EzU2_4;LdE#C@(N~KM1nFaWTc`Y zZ%6w+L0kFQ`mWVpuK#P)a@S&;r&f)Q1HK@J+26`X!?8blu~8ZB!r1kM^~gtSpdP;N z@I~&DinYu?>>lRSt?Fu&!`roJQnt==9pfq~L%ZX|WUk{N7WR(t=o&j%YsSo_h zXr!VYFXsD9q7Lc#rh^IyZQ;~2h!lEICW;W0< zNRv>~^(^i^-huBsFJV<;M71MTtb!>!7a3+l&g|>G{*HY;HZil7I>}ZV#N|x#nk`TT zdxaej*SITJPY8=k>5v$8MfQhXhG$5nU|7`Vw+@VPu;y!w|v3X+vt$v4bnViUU9c!0jnA0NQ_Mx71S~+dC!cR)8U)Vl&4z# z`2@ya*GM`}^*|z8I@J)(TfI0Jyeudyor?^JJds6G=hoGf+yr!6tBO>a4C4RdxkLU~gh1~lt*g^TXi=5zAU zTF_E_xq#R@+<`xhfa@7QYj|L_Ib5pFi$hq+CI;g z5X{zam)JWjOzGqj=oUK_Ag>jBvT*Ny)w~$x&eJn3iD)$|mA$RS{1b)*kCC6or zh4+0Q&F=|8aERry%{VGPX)LTPzGsLQr)hBh#XQZn;6euEqBK+NFyqB62iXrEg!f?6 zW3aV~r_ZoYl2|Gl_Aao^SA?jy*)So#jh>BBnirrpF*TL1fDM3gq}nbdKKZ1Y+RW8C zXl?bAmyBgUcnFrM8uh1jM?redfv1G;b@m3s ze*5w!*G8yjm0dj@vRuqofOc*Sz?|Yg>Q?}*xWPu5PE?Bv*86B}6pRe+G1K&OXlhe! zn@7uT#8-DONN{a1ojas1V>cgeSJmKJ6LCS#!<#k+3CUOa(l&12w?=|)Hi}H~% zFMPqwb-*UjyOuRAqxobd1&z&}74e{2R*b{r-TN1aJ8jnMIwL3S=bZ zm`TMLeK_~KeP@YTSUhWwi*%*Z1ASG0BWlvV;fpZ9-(!I z=QR)NZH$XmH12jb&E*WlA{ZD^syx~!MoFhG)57YD zWXqKP<;*6XH2g`VUl%8)Vemu(w!2|L=~jLobe(9bTDexN71DBhfC#7lYwfMow5AUO zGmUD+@|>s(rEf5qH_RCN`U&b`ehW~KFZ_5k#nOwY94?)Ku$*&ytS!NrX4E$)0gEwj$=bjd+?gIZ3)YG8_?>tbQ#2-Q>+)z z#&rNzViR@K>Y>O3+-q2JD?{$7)RMBboMg`D=H8lV)_S^B82+&Lo%SK9EUoZJO z{<%FK@G@gv6Bw=N5oea-;)|V?0t1w4A2cCbzrW|?OvBuxLfp2qUydPb>=4-3v@c1< z09SaUF&02Ajy+JW3VON3s})^!Inf$2J3}e}{8?JvgKhxO0Gt^=^^j~Ln)Yd2BrNv! zikA)U-MMaJZ@f6Km(eH$c_?Sc*15N-_Ob_H{KUU%jA&f$#gtNCNxf*cA?Gq=tWe6DYq34q{K__GbHr|iIOf4EYp!zS77L=#2K z&@vagS>)Zx<=cunoj#4LpXWE3{%b2!kh7b~#796#BAmd{_{~DSZ3{zcllm*M#f@b; zw_xc?%PYAZ8=`#D7EA-QZ~Bo=t7e&D)`|3-Ozo}YsU`IDY0FWi} zkXyQoJ8~icKf=UBDEN@!s>TR<+%bWC(OzwS>g=^c&mi4>)e+)^kyFh$_-E1bpU(iE8fTrqluF2RMN5=1UY`7$~l)@&vQVph7RA1dYZG;() zG%Cbgyp5U7Gz{m)WQJxk3Pt(ekGZawp&#clw1VX)$T5}**g`pXXRIB=^sPoS{rJfd zmhUs6K)zOyS|*&d z6+<(2;Lb6C_ks7Pg?d-F(e0U`naa_bfoP<464C(1G#t!l#?X^Mov*ITrCj@Dj{p@w zO0<3qzL7!}--oIuT>?s?mfBqo>b@{~b=ZKrbTnRW;nGiLG`R9q{nG(X8HzPK;GAp4 z8!62lB3aZVYAny?8>vw*1s*i&3~pgBt{MEI-~=$7-KOBKs=9D%^q|>$S}%*!N|#@x za#XM{%=VK7_@Hm54=^u}099xb1!92E@KPsMhnj+{`pwE7m*K?X2daui0#(YgcO!t8 zZG~C0*UNaA-V_f#$im1q#f}_}V6M7;##{XJ0JGs6DNqaOF@uj8TJV}Q_Nqwvnw;n9 z)65aGm1_+NE?(XG@cZ-{iitB?6o@t58C`MB{cl9eCK}l9_6fun)U~9bUx0l6W1l_Y zsR~q>iwrY-Vh=l<->_ic)&m3xF(0Ld3*R1@FKe^_Q@+&%vNu>GcsdxZPvF%-OWy#6 zP}t0x?BYf4tkZ3(jZmAnmm_)dvt8d&eQSNiBcJOk4^u&iu8#1BeR;x<DzqY z^8mXL7;YGc&$oaQWA^FhfgKgdHUQJh);9OC2UyF%UNlZ%gKA58dc!%IFV#40Xu15> zM*2pSl5ZBVsAq&SXB6m&5m+8j-?dw=AjnI=`Q0fN5HSLGelgRynOSWo-Y6#F_JNxr zcaTK)^!1tEfvF#ZG0M?b{>W&F8!mKKNeH7rOF{TWycNmZszxFkDVfx4ZLFKIyU>Yg z`V_Gr3gOI)LorJ}XqW516MN|53#R0Pg_atOiEd_EoATN{)*eI*?Ov;_PNlKDoPRC- z1nRb-B!8T+0MyXxFk)a{`fkw6ZP3#EZr|R@OqY)}f#-VrY;Fbp0HpM>&ZH9w(4leM ztEDKD2>|<@3 zSytVeopAQLB{=o8VvY?^AGO8c;JuYwFhf4#v8Dv**DR&ABdkVU@y@qx#dST$uFVl2 zA8Bdy$EDMYOI5kB*)}Ay!P1;PA7#8Uaag=tAquOSv|?%L989;Obs|>`Kh55Etat}i zmOY=`=SML)Y5xa~r5MGTV zxx2y6HN6rY8U+ku6Mw|U3SQq6!Su6p#c=r#!CV%zR|<2lA-Xqy1$xYzI$zDEKb)W7 zWnbm1l;-72DrMHuMft?77o0H@5eI(Id-fF$l9lKOgJrhVTDlWuW)lyB@cC36&e(2Z zL({|Oc*@FX>}E#3G^7^LgcIoaD+0Lz%F;WoE4%1>t^Bu%)drORC{d7ARUgcoCR^z~ zmz#efTwkVG$@#Md=HNJnc;Gi{jHK z0Wz0wUIKHP)fiT2a8-PN8t2~NQdxk*-CwhGMIbtkd5WcSb@;TIE7u026YYpr1@!?? zqUW5C$`)L7v9@t>O9@d-!vO##J+`KLPhgu43c3?lcoY*rqJ$@9Kv`sfE&mi1%^uYg zzFQ~C-(P8>`2xcT4XK|`ietO@_Or$X&Y|`7p@wf4{*C`xECZ-Yy~c~I*ek%KI5}%0 z3!zklMsjeRug63RMbp0hMwP~yW*;G737rB^PiQEXC!BV=Cv1le8ij0=_l;mm@zwIx*4Uy;mFCT#o`DvGtB{k|krj9)Kd8)JDk;VFPM_f+yff z5s*?XmClSt9*%AUb?Bbu463?ebr*uMML6#5Ojp_il$4b{rnhCPi2Mu5daR-_tWj2y z`^1lUKEKJuUahU`ULX2gvuY}P!TQ~?vE3%andN&;v}=NOnLuC1IhK!?XcWbSlsBC9 zo{HuF2+d65zPi13Qx5Lt(qJgbeilb`A>ZVE-7-45t2FC(f46{L+BOomVaYppSGF&bh^D;!tlX`r2Sft+F4MP()eB*F$HI1B#r4ohmD z1`Ob-Gcx8bv2rv#r%1Utuedw!?+F3}?;T_Cshu0O-+_ zg~y<|=LDK*>(%_jTPxV-;0Z+?lGX$>ZgEou>v-wFom2;NOQLV#D@UWr>m>g& z4LyNN=Q@gOYShFg1F2xO*=wTTN&u3g0YgQTQGBmtd%k(9_K5tX|3imHV#=MF3)#A9 zo*N`tv_)PS90o^nW}C-{8>?8MtvW}8F$U)yQE?Z@U15MaE1wk#iga!0g|9kd78C4I zXjrya@>%)(96vRScx zcEO$@)lgBTJ9U843ZBc3<6&9=Fsq%LZr{aCt@61$!`o`TjJk#k%3<$9GJpRXGOPu7 zVCu35aFe4yLhT@<_N92q??wFwg#=6BtGa18hS9cidwWc=*Kk_Q2tTo zWFf_qrMG!q@`km1X#r26yz80y7v{#FoS7`hI^ncuQAA7L4t$?4H&>H%N3kIo(YPCc zE#{I>ps30|odackYeDYBMTe}6uma!}pFp@lGv|rA3hK=FETpqdeC!)o4cC#r?R8 zH#VkG&OziEOe4sA2I7nyKQ@y$ee3QG`8i)YRBmBi1l6J)$o~+_I2|rjL35dpo8yBS zfSRf$boOM3KD(-U|LWV@Q8Ah}IGRFD+(h-u# zm~}KCcvE2-_Dk~2+JKRz^@bmb(P2Klc2;?;)+?H)4#a*jK)-LC^?cInE|r&SF9ckd z={o|uisWc-+lww1#h2Q4TgXIWN^oOh)9kemeKAYH)ws=(nNboNpH@Old(YmHLJTyY zYry|XQNkt6iNm@7>_JJ6i9fPa)Xxlk=y#vYKeLx)O3hUn#Q*VV1RpZo0&r$idC3u& zYQ-w7Y{rG!IGM5T9c9S!uePVi6AD z<+dv-WFOOijq^@evd5@%gCQ-bMPd}t&)h{$V%T!^eY1VMJ43WRd%xN*ByM@Y0OiQ{ zzGse0qbS*<{U9;7ZeU9#JnhGFte?J}X8d}rhRE!;i{As&+paR#6xD0;O?E`MCH2GA z8%iO5u(tH25L=0i)5QjUiL;t;`U3W@CjN(>=jCHA-_ikNH@hMd(HPzL-JMf-7J06~>=Bf|kUr8_6!?KxCAV$3w z_qc(L16iaMCzu=fXNs9q=StFlFIHqls>E}M#lbv(+A2*a3M}+>iOqY$y+03bzfxMS z$O;j+(wu|YII0|e+I*5k<9a6CZJbxG%Yi5r{AGhMYs{2tRM!^EKb@9l+v4I;)3vXe zaI0V+6Bd9=JfV_U!IhzG3u39mfQTVTn&;9702axq$LthEvMTm3H4-VMP`*d2H%6!K z+Go!DfUequ(gEaibp!wb!7+_HRiZyfbY4 zOk%c&wDPu-S_=ZWQY&^R$leJ07ptHPpdy+J?A*foNwpJ0K5yolC)ViMu>qyFc49z@ z5R)2A>OuFHtd*8Era}F{(6*zlJ5fd2oK5FHj=5;~g*EEtaP*6cwJ(Yej9EDs!hcvK{7LdpxIOI>#Cqm_F@pzX7 zrIc^>iT%AwW4usG6$w;DBY7)#dw6ClZ~EcP^1=I&{lvb&Ao4{W3mr-i+s-_e5G{rN z=qIHaJ6!Dj;~8T=%-OlsqJ`BoH5=$LV)!4q*}d)_ zw3SJZ{(L-`Y6t{}^k&o?hysa){yqtekKk9ymakL*M^Xn)Ga4HV^bjY#$d2`WHF8|#onOW+>3Dh0@x$udK@9u^7buX=W3!s%6@ zD%q_5YFpITts;c8zL;^oX`_nfE}{o7lRpx}LL7VY(sE=6geqMtI;esY4|n`J8d$#_ zS-1onYNfXD0=F=Ke0lPenNA_Y!?xbJHIqkDtnqy3vX8L0iecOt%|A;M)NFs9Y0}9= zK4Y?U2i3jENgs%r7A80NTVXeuy#M*^3mvzE0Ae91>#m1HcR(j2mZ{ops>I`GXXzUf z64q{Z(WFv(a_T=694*G2x1&r{6$f&t0w+j6rEgJ8I88+BJ&xf(+f#$lxtP8%NlH4e za?<3CQ&{R^Om^ zM2vTQrj#nJDVrCnPu$COwOA#RjdGS$t|FWc!CGyB-BhbgnoEVd&Zoy*G16ryacoGd z%bQ06v-A84r2>1{TZ;bZyNvRX>DBYx4bE-L2ZiDc)-&EaJ=eZD&LGv49dr&~x=G2N zXA^p(Z5WLX%yly0deUiyHaIuc0P=RHhY5HqWLmhu$@YM2{g~ipVPS!TU>>gE)&b2_ z=?lLK8S4obIq{>~{=@2d9VnfqVv(AIgN5|fdvOKy+JyiWby~gEK|~%`Lz>Ag7JB8? zaM)_B*r11jANoVSfR~xEA9Cm7PQ6#bEs5zh7`vP1^xY-#I7as;;^`fyyQfzR1zaBs zqsxNCXLI1qY+V&*?s4H6NbT3$RxRmmQ~CK}eA3=lmQvWYNL>mYQgV67pD`cifWSKJ z2Dnj~XL{#g_~!MMzeaB}bD3(354Ut} zln5@zfT1si;8$Kfef#dm^j|V8+05@9$(z2ByTk4MD}mc*Q$#3ag?|tShHe8H8~oUG za0^wjWg3&@DB-4=tm!k09hmPEU$cH^vUfKmAq6ww7Ok1$=&kW=k-heh#LPgEkNDVQ z?;Ft4j&VnvZNkeJpC4cyBpwGv8}L1uy-oT_MO2dENonTPbN1|}Xf`y&r?Mc}6)IZ5 z1H;w8ERCG@ye{~@*z%W^%s+c{#0z@|CW43X%YF=V0baJ!!H#au6&6PND=eakY@{`b z&lSJlhkA)e2MYkT@1ZP;L8KUl-lj)Dso2{Bha~uvM15>!CsBZi*JH-I-wdn9A?G*3 z6Ozq1vzs9H-y@@~@)|pUd1OXkfUqQ18IHc&m8e0v03}VJc(Y=j1!X>OYv%wz9O~QTYaR0*j(3*yceNivV0j5|224-O;75gn< z9})>=S-3sX#S>bi3zVa0n|e|U6akiq}@amO%8^6fsw`+LBCzPj{`MmIR+XvkNpXu zgA^paxP^*NhsSyx?8;oXKl_#*iq#b;t+h#=ff&XN6)WTGm`FgI+(7#9NZ04p9@k+N zvF9Mrb4R2<$%xw{<4@U}P6>nkHj`4*n>tAD$>7dX));EY%iur7EZxT4rCd7Xou#%q ziOaC38x=kD0UY_S;xg#=(QHN#8UYN~^|NK0C3F`mB z)Z1I+j_OR<^nj_`XW6@cG67&`fgyeoctc*j^xCAq%Au0Yx0w(aIp{6V2(EA>)l}|( zfT$;rR^JBveXFgUKoP{4y^xjn#xd^mk^gYXcI%rqqtV~7DKk&#M}(*C?us{v@Jbu% zXn(K2&~iB4@Rg1Kve@wi?k{p+o(Qn5icv+$Cuo|#QRhH?8bE0mKG&UX-AK&shC&{# zhR2F8W>JjjSoEf~+!SntW9`e2Ql|MA#vj@g^QZpk^DS8-@m0s020YPbMu_%9oq&E( z+&ZRHHhsvoFkB(OBNJHOvDEX*ec~9t6q5i-@AlIgXmj$N>ELu`KFC!W}V=*kF+O1E%QV4w0oXz zUBMx2HiGCJM6UXw%S+pH7V;l6xo^qRm}LV9)#K%9z*7~)z*k_VFB9OWcM=E70S;mF zM;~-(7Bk2!^NN@&`z^o@8N(NK!3MKPcAB4|bo%<%LK_;Yu-~>XF^;k??d?!t`e*Fo zW?cZb_bqf(84DEAH3l*Y5@24_9m=d?BK^=U;VO{&xr1rs_RMC;ZOdW1N`%l#>-@

+mbpSx%DIn;4*iEN<@A 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 Hzw!A$KqL|r diff --git a/man/figures/README-unnamed-chunk-3-1.png b/man/figures/README-unnamed-chunk-3-1.png new file mode 100644 index 0000000000000000000000000000000000000000..161a62c98572cfd4045a5f713339d392429de8fe GIT binary patch literal 86298 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ⅆ4%CE&#w|DTiVz^ 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 literal 0 HcmV?d00001 diff --git a/man/flatten.Rd b/man/flatten.Rd index 9ab7188f..dafb3d75 100644 --- a/man/flatten.Rd +++ b/man/flatten.Rd @@ -18,11 +18,6 @@ An unnested \link{list} Flatten a nested \link{list}, regardless of its level of nesting. } \examples{ -# script: flattten -# date: 2024-03-03 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Give an example -# of the flatten-function # script start; # 1) create a nested list @@ -40,12 +35,12 @@ cryptoQuotes:::flatten( nested_list ) - # script end; } \seealso{ Other development tools: \code{\link{GET}()}, +\code{\link{chart_layout}()}, \code{\link{convert_date}()}, \code{\link{default_dates}()}, \code{\link{fetch}()}, diff --git a/man/getFGIndex.Rd b/man/getFGIndex.Rd deleted file mode 100644 index 6425be0a..00000000 --- a/man/getFGIndex.Rd +++ /dev/null @@ -1,83 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/getFNG.R -\name{getFGIndex} -\alias{getFGIndex} -\title{Get the daily Fear and Greed Index -for the cryptocurrency market} -\usage{ -getFGIndex(from = NULL, to = NULL) -} -\arguments{ -\item{from}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} - -\item{to}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} -} -\value{ -An \link{xts}-object containing, -\itemize{ -\item fgi (\link{numeric}): The daily fear and greed index value -} -} -\description{ -\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} - -The fear and greed index is a market sentiment indicator that measures investor emotions to -gauge whether they are generally fearful (indicating potential selling pressure) or greedy (indicating potential buying enthusiasm) -} -\details{ -\subsection{On time-zones and dates}{ - -Values passed to \code{from} or \code{to} must be coercible by \code{\link[=as.Date]{as.Date()}}, or \code{\link[=as.POSIXct]{as.POSIXct()}}, with a format of either \code{"\%Y-\%m-\%d"} or \code{"\%Y-\%m-\%d \%H:\%M:\%S"}. By default -all dates are passed and returned with \code{\link[=Sys.timezone]{Sys.timezone()}}. -} - -\subsection{On returns}{ - -If only \code{from} is provided 200 pips are returned up to \code{Sys.time()}. If only \code{to} is provided 200 pips up to the specified date -is returned. -} -} -\note{ -The Fear and Greed Index goes from 0-100, and can be classified as follows, - -\itemize{ -\item 0-24, Extreme Fear -\item 25-44, Fear -\item 45-55, Neutral -\item 56-75, Greed -\item 76-100, Extreme Greed -} -} -\examples{ -\dontrun{ - # script: Fear and Greed Index - # date: 2023-12-26 - # author: Serkan Korkmaz, serkor1@duck.com - # objective: Retrieve and Plot the - # index - # script start; - - # 1) get the fear and greed index - # for the last 7 days - tail( - fgi <- cryptoQuotes::get_fgindex( - from = Sys.Date() - 7 - ) - ) - - # script end; -} - -} -\seealso{ -Other deprecated: -\code{\link{availableExchanges}()}, -\code{\link{availableIntervals}()}, -\code{\link{availableTickers}()}, -\code{\link{getLSRatio}()}, -\code{\link{getQuote}()} -} -\author{ -Serkan Korkmaz -} -\concept{deprecated} diff --git a/man/getLSRatio.Rd b/man/getLSRatio.Rd deleted file mode 100644 index 6cdb75ed..00000000 --- a/man/getLSRatio.Rd +++ /dev/null @@ -1,124 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/getLSRatio.R -\name{getLSRatio} -\alias{getLSRatio} -\title{Get the long to short ratio of a cryptocurrency pair} -\usage{ -getLSRatio( - ticker, - interval = "1d", - source = "binance", - from = NULL, - to = NULL, - top = FALSE -) -} -\arguments{ -\item{ticker}{A \link{character} vector of \link{length} 1. See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} - -\item{interval}{A \link{character} vector of \link{length} 1. See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} - -\item{source}{A \link{character}-vector of \link{length} 1. See \code{\link[=available_exchanges]{available_exchanges()}} for details.} - -\item{from}{An optional vector of \link{length} 1. Can be \code{\link[=Sys.Date]{Sys.Date()}}-class, \code{\link[=Sys.time]{Sys.time()}}-class or \code{\link[=as.character]{as.character()}} in \%Y-\%m-\%d format.} - -\item{to}{An optional vector of \link{length} 1. Can be \code{\link[=Sys.Date]{Sys.Date()}}-class, \code{\link[=Sys.time]{Sys.time()}}-class or \code{\link[=as.character]{as.character()}} in \%Y-\%m-\%d format.} - -\item{top}{A \link{logical} vector. \link{FALSE} by default. If \link{TRUE} it returns the top traders Long-Short ratios.} -} -\value{ -An \link{xts}-object containing, -\itemize{ -\item long (\link{numeric}) - the share of longs -\item short (\link{numeric}) - the share of shorts -\item ls_ratio (\link{numeric}) - the ratio of longs to shorts -} -} -\description{ -\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} - -Get the long-short ratio for any \code{\link[=available_tickers]{available_tickers()}} from the \code{\link[=available_exchanges]{available_exchanges()}} -} -\details{ -\subsection{On time-zones and dates}{ - -Values passed to \code{from} or \code{to} must be coercible by \code{\link[=as.Date]{as.Date()}}, or \code{\link[=as.POSIXct]{as.POSIXct()}}, with a format of either \code{"\%Y-\%m-\%d"} or \code{"\%Y-\%m-\%d \%H:\%M:\%S"}. By default -all dates are passed and returned with \code{\link[=Sys.timezone]{Sys.timezone()}}. -} - -\subsection{On returns}{ - -If only \code{from} is provided 200 pips are returned up to \code{Sys.time()}. If only \code{to} is provided 200 pips up to the specified date -is returned. -} -} -\note{ -\subsection{Available exchanges}{ - -See \code{\link[=available_exchanges]{available_exchanges()}} with for available exchanges. -} - -\subsection{Limited return values}{ - -Binance only supports data for the last 30 days. Use other exchanges if you need beyond that. -} -} -\examples{ -\dontrun{ - # Example on loading - # long-short ratio - # for the last days - # on the 15 minute candle - # wrapped in try to avoid - # failure on Github - - # 1) long-short ratio - # on BTCUSDT pair - ls_ratio <- cryptoQuotes::get_lsratio( - ticker = 'BTCUSDT', - interval = '15m', - from = Sys.Date() - 1, - to = Sys.Date() - ) - - # 2) BTCSDT in same period - # as the long-short ratio; - BTC <- cryptoQuotes::get_quote( - ticker = 'BTCUSDT', - futures = TRUE, - interval = '15m', - from = Sys.Date() - 1, - to = Sys.Date() - ) - - # 3) plot BTCUSDT-pair - # with long-short ratio - cryptoQuotes::chart( - ticker = BTC, - main = cryptoQuotes::kline(), - sub = list( - cryptoQuotes::lsr(ratio = ls_ratio), - cryptoQuotes::volume() - ), - indicator = list( - cryptoQuotes::bollinger_bands() - ) - ) -} - - - -# end of scrtipt; -} -\seealso{ -Other deprecated: -\code{\link{availableExchanges}()}, -\code{\link{availableIntervals}()}, -\code{\link{availableTickers}()}, -\code{\link{getFGIndex}()}, -\code{\link{getQuote}()} -} -\author{ -Jonas Cuzulan Hirani -} -\concept{deprecated} diff --git a/man/getQuote.Rd b/man/getQuote.Rd deleted file mode 100644 index 086c53a4..00000000 --- a/man/getQuote.Rd +++ /dev/null @@ -1,105 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/getQuote.R -\name{getQuote} -\alias{getQuote} -\title{Get the Open, High, Low, Close and Volume data on a cryptocurrency pair} -\usage{ -## get OHLC-V -getQuote( - ticker, - source = 'binance', - futures = TRUE, - interval = '1d', - from = NULL, - to = NULL -) -} -\arguments{ -\item{ticker}{An \link{character}-vector of \link{length} 1. See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} - -\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} - -\item{futures}{A \link{logical}-vector of \link{length} 1. \link{TRUE} by default. Returns futures market if \link{TRUE}, spot market otherwise.} - -\item{interval}{A \link{character}-vector of \link{length} 1. \verb{1d} by default. See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} - -\item{from}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} - -\item{to}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} -} -\value{ -An \link{xts}-object containing, -\itemize{ -\item open (\link{numeric}): the opening price -\item close (\link{numeric}): the closing price -\item high (\link{numeric}): the highest price -\item low (\link{numeric}): the lowest price -\item volume (\link{numeric}): the trading volume -} -} -\description{ -\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} - -Get a quote on a cryptocurrency pair from the \code{\link[=available_exchanges]{available_exchanges()}} in various \code{\link[=available_intervals]{available_intervals()}} for any actively traded \code{\link[=available_tickers]{available_tickers()}}. -} -\details{ -\subsection{On time-zones and dates}{ - -Values passed to \code{from} or \code{to} must be coercible by \code{\link[=as.Date]{as.Date()}}, or \code{\link[=as.POSIXct]{as.POSIXct()}}, with a format of either \code{"\%Y-\%m-\%d"} or \code{"\%Y-\%m-\%d \%H:\%M:\%S"}. By default -all dates are passed and returned with \code{\link[=Sys.timezone]{Sys.timezone()}}. -} - -\subsection{On returns}{ - -If only \code{from} is provided 200 pips are returned up to \code{Sys.time()}. If only \code{to} is provided 200 pips up to the specified date -is returned. -} -} -\examples{ -\dontrun{ -# script: scr_getQuote -# date: 2024-02-29 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Demonstrate the basic -# usage of the get_quote-function -# script start; - - - # 1) Load BTC spot - # from Kucoin with 30 minute - # intervals - BTC <- cryptoQuotes::get_quote( - ticker = 'BTCUSDT', - source = 'binance', - interval = '30m', - futures = FALSE, - from = Sys.Date() - 1 - ) - - # 2) chart the spot price - # using the chart - # function - cryptoQuotes::chart( - ticker = BTC, - main = cryptoQuotes::kline(), - indicator = list( - cryptoQuotes::volume(), - cryptoQuotes::bollinger_bands() - ) - ) - -# script end; -} -} -\seealso{ -Other deprecated: -\code{\link{availableExchanges}()}, -\code{\link{availableIntervals}()}, -\code{\link{availableTickers}()}, -\code{\link{getFGIndex}()}, -\code{\link{getLSRatio}()} -} -\author{ -Serkan Korkmaz -} -\concept{deprecated} diff --git a/man/get_fgindex.Rd b/man/get_fgindex.Rd index ab30daf0..6a0f12f1 100644 --- a/man/get_fgindex.Rd +++ b/man/get_fgindex.Rd @@ -3,41 +3,45 @@ \name{get_fgindex} \alias{get_fgindex} \title{Get the daily Fear and Greed Index -for the cryptocurrency market} +in the cryptocurrency market} \usage{ -get_fgindex(from = NULL, to = NULL) +get_fgindex( + from = NULL, + to = NULL +) } \arguments{ -\item{from}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{from}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} -\item{to}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{to}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} } \value{ An \link{xts}-object containing, -\itemize{ -\item fgi (\link{numeric}): The daily fear and greed index value -} + +\item{index}{<\link{POSIXct}> the time-index} +\item{fgi}{<\link{numeric}> the daily fear and greed index value} + +\strong{Sample output} + +\if{html}{\out{

}} } \description{ -\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#stable}{\figure{lifecycle-stable.svg}{options: alt='[Stable]'}}}{\strong{[Stable]}} -The fear and greed index is a market sentiment indicator that measures investor emotions to -gauge whether they are generally fearful (indicating potential selling pressure) or greedy (indicating potential buying enthusiasm) +Get the daily fear and greed index. } \details{ -\subsection{On time-zones and dates}{ +\subsection{Classification}{ -Values passed to \code{from} or \code{to} must be coercible by \code{\link[=as.Date]{as.Date()}}, or \code{\link[=as.POSIXct]{as.POSIXct()}}, with a format of either \code{"\%Y-\%m-\%d"} or \code{"\%Y-\%m-\%d \%H:\%M:\%S"}. By default -all dates are passed and returned with \code{\link[=Sys.timezone]{Sys.timezone()}}. -} - -\subsection{On returns}{ - -If only \code{from} is provided 200 pips are returned up to \code{Sys.time()}. If only \code{to} is provided 200 pips up to the specified date -is returned. -} -} -\note{ The Fear and Greed Index goes from 0-100, and can be classified as follows, \itemize{ @@ -48,13 +52,25 @@ The Fear and Greed Index goes from 0-100, and can be classified as follows, \item 76-100, Extreme Greed } } + +\subsection{About the Fear and Greed Index}{ + +The fear and greed index is a market sentiment indicator that measures +investor emotions to gauge whether they are generally fearful +(indicating potential selling pressure) or +greedy (indicating potential buying enthusiasm). +} + +\subsection{Source}{ + +This index is fetched from +\href{https://alternative.me/crypto/fear-and-greed-index/}{alternative.me}, +and can be different from the one provided by +\href{https://coinmarketcap.com/charts/#fear-and-greed-index}{coinmarketcap}. +} +} \examples{ \dontrun{ - # script: Fear and Greed Index - # date: 2023-12-26 - # author: Serkan Korkmaz, serkor1@duck.com - # objective: Retrieve and Plot the - # index # script start; # 1) get the fear and greed index @@ -70,7 +86,7 @@ The Fear and Greed Index goes from 0-100, and can be classified as follows, } \seealso{ -Other get-function: +Other get-functions: \code{\link{get_fundingrate}()}, \code{\link{get_lsratio}()}, \code{\link{get_openinterest}()}, @@ -79,4 +95,4 @@ Other get-function: \author{ Serkan Korkmaz } -\concept{get-function} +\concept{get-functions} diff --git a/man/get_fundingrate.Rd b/man/get_fundingrate.Rd index 059c1f25..80f5212f 100644 --- a/man/get_fundingrate.Rd +++ b/man/get_fundingrate.Rd @@ -12,53 +12,67 @@ get_fundingrate( ) } \arguments{ -\item{ticker}{An \link{character}-vector of \link{length} 1. See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} +\item{ticker}{A \link{character}-vector of \link{length} 1. +See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} -\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} +\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. +See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} -\item{from}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{from}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} -\item{to}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{to}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} } \value{ An \link{xts}-object containing, -\itemize{ -\item funding_rate (\link{numeric}): the current funding rate -} + +\item{index}{<\link{POSIXct}> the time-index} +\item{funding_rate}{<\link{numeric}> the current funding rate} + +\strong{Sample output} + +\if{html}{\out{
}}\preformatted{#> funding_rate +#> 2024-03-09 17:00:00 0.00026407 +#> 2024-03-10 01:00:00 0.00031010 +#> 2024-03-10 09:00:00 0.00063451 +#> 2024-03-10 17:00:00 0.00054479 +#> 2024-03-11 01:00:00 0.00035489 +#> 2024-03-11 09:00:00 0.00078428 +}\if{html}{\out{
}} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#stable}{\figure{lifecycle-stable.svg}{options: alt='[Stable]'}}}{\strong{[Stable]}} -Get the funding rate on a cryptocurrency pair from the \code{\link[=available_exchanges]{available_exchanges()}} in any actively traded \code{\link[=available_tickers]{available_tickers()}} on the FUTURES markets. +Get the funding rate on a cryptocurrency pair from +the \code{\link[=available_exchanges]{available_exchanges()}} in any actively +traded \code{\link[=available_tickers]{available_tickers()}} on the futures markets. } \examples{ \dontrun{ -# script: Funding Rate example -# date: 2024-03-01 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Fetch -# funding rate from one of the available -# exchanges # script start; # 1) check available # exchanges for funding rates -available_exchanges(type = "fundingrate") +cryptoQuotes::available_exchanges( + type = "fundingrate" + ) # 2) get BTC funding rate # for the last 7 days tail( - BTC <- get_fundingrate( + BTC <- cryptoQuotes::get_fundingrate( ticker = "BTCUSDT", source = "binance", from = Sys.Date() - 7 ) ) + # script end; } } \seealso{ -Other get-function: +Other get-functions: \code{\link{get_fgindex}()}, \code{\link{get_lsratio}()}, \code{\link{get_openinterest}()}, @@ -67,4 +81,4 @@ Other get-function: \author{ Serkan Korkmaz } -\concept{get-function} +\concept{get-functions} diff --git a/man/get_lsratio.Rd b/man/get_lsratio.Rd index 2acc7c80..da1a1596 100644 --- a/man/get_lsratio.Rd +++ b/man/get_lsratio.Rd @@ -4,7 +4,6 @@ \alias{get_lsratio} \title{Get the long to short ratio of a cryptocurrency pair} \usage{ -## long-short ratio get_lsratio( ticker, interval = '1d', @@ -15,104 +14,81 @@ get_lsratio( ) } \arguments{ -\item{ticker}{A \link{character} vector of \link{length} 1. See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} +\item{ticker}{A \link{character}-vector of \link{length} 1. +See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} -\item{interval}{A \link{character} vector of \link{length} 1. See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} +\item{interval}{A \link{character}-vector of \link{length} 1. \verb{1d} by default. +See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} -\item{source}{A \link{character}-vector of \link{length} 1. See \code{\link[=available_exchanges]{available_exchanges()}} for details.} +\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. +See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} -\item{from}{An optional vector of \link{length} 1. Can be \code{\link[=Sys.Date]{Sys.Date()}}-class, \code{\link[=Sys.time]{Sys.time()}}-class or \code{\link[=as.character]{as.character()}} in \%Y-\%m-\%d format.} +\item{from}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} -\item{to}{An optional vector of \link{length} 1. Can be \code{\link[=Sys.Date]{Sys.Date()}}-class, \code{\link[=Sys.time]{Sys.time()}}-class or \code{\link[=as.character]{as.character()}} in \%Y-\%m-\%d format.} +\item{to}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} -\item{top}{A \link{logical} vector. \link{FALSE} by default. If \link{TRUE} it returns the top traders Long-Short ratios.} +\item{top}{A \link{logical} vector. \link{FALSE} by default. +If \link{TRUE} it returns the top traders Long-Short ratios.} } \value{ An \link{xts}-object containing, -\itemize{ -\item long (\link{numeric}) - the share of longs -\item short (\link{numeric}) - the share of shorts -\item ls_ratio (\link{numeric}) - the ratio of longs to shorts -} + +\item{index}{<\link{POSIXct}> the time-index} +\item{long}{<\link{numeric}> the share of longs} +\item{short}{<\link{numeric}> the share of shorts} +\item{ls_ratio}{<\link{numeric}> the ratio of longs to shorts} + +\strong{Sample output} + +\if{html}{\out{
}}\preformatted{#> long short ls_ratio +#> 2024-05-12 02:00:00 0.6930 0.3070 2.2573290 +#> 2024-05-13 02:00:00 0.6637 0.3363 1.9735355 +#> 2024-05-14 02:00:00 0.5555 0.4445 1.2497188 +#> 2024-05-15 02:00:00 0.6580 0.3420 1.9239766 +#> 2024-05-16 02:00:00 0.4868 0.5132 0.9485581 +#> 2024-05-17 02:00:00 0.5102 0.4898 1.0416497 +}\if{html}{\out{
}} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#stable}{\figure{lifecycle-stable.svg}{options: alt='[Stable]'}}}{\strong{[Stable]}} -Get the long-short ratio for any \code{\link[=available_tickers]{available_tickers()}} from the \code{\link[=available_exchanges]{available_exchanges()}} +Get the long-short ratio for any \code{\link[=available_tickers]{available_tickers()}} +from the \code{\link[=available_exchanges]{available_exchanges()}} } \details{ \subsection{On time-zones and dates}{ -Values passed to \code{from} or \code{to} must be coercible by \code{\link[=as.Date]{as.Date()}}, or \code{\link[=as.POSIXct]{as.POSIXct()}}, with a format of either \code{"\%Y-\%m-\%d"} or \code{"\%Y-\%m-\%d \%H:\%M:\%S"}. By default -all dates are passed and returned with \code{\link[=Sys.timezone]{Sys.timezone()}}. +Values passed to \code{from} or \code{to} must be coercible by \code{\link[=as.Date]{as.Date()}}, +or \code{\link[=as.POSIXct]{as.POSIXct()}}, with a format of either \code{"\%Y-\%m-\%d"} or +\code{"\%Y-\%m-\%d \%H:\%M:\%S"}. By default all dates are passed and +returned with \code{\link[=Sys.timezone]{Sys.timezone()}}. } \subsection{On returns}{ -If only \code{from} is provided 200 pips are returned up to \code{Sys.time()}. If only \code{to} is provided 200 pips up to the specified date -is returned. -} -} -\note{ -\subsection{Available exchanges}{ - -See \code{\link[=available_exchanges]{available_exchanges()}} with for available exchanges. -} - -\subsection{Limited return values}{ - -Binance only supports data for the last 30 days. Use other exchanges if you need beyond that. +If only \code{from} is provided 200 pips are returned up to \code{Sys.time()}. +If only \code{to} is provided 200 pips up to the specified date is returned. } } \examples{ \dontrun{ - # Example on loading - # long-short ratio - # for the last days - # on the 15 minute candle - # wrapped in try to avoid - # failure on Github - - # 1) long-short ratio - # on BTCUSDT pair - ls_ratio <- cryptoQuotes::get_lsratio( - ticker = 'BTCUSDT', - interval = '15m', - from = Sys.Date() - 1, - to = Sys.Date() - ) + # script start; - # 2) BTCSDT in same period - # as the long-short ratio; - BTC <- cryptoQuotes::get_quote( - ticker = 'BTCUSDT', - futures = TRUE, + LS_BTC <- cryptoQuotes::get_lsratio( + ticker = 'BTCUSDT', interval = '15m', - from = Sys.Date() - 1, - to = Sys.Date() + from = Sys.Date() - 1, + to = Sys.Date() ) - # 3) plot BTCUSDT-pair - # with long-short ratio - cryptoQuotes::chart( - ticker = BTC, - main = cryptoQuotes::kline(), - sub = list( - cryptoQuotes::lsr(ratio = ls_ratio), - cryptoQuotes::volume() - ), - indicator = list( - cryptoQuotes::bollinger_bands() - ) - ) + # end of scrtipt; } - - -# end of scrtipt; } \seealso{ -Other get-function: +Other get-functions: \code{\link{get_fgindex}()}, \code{\link{get_fundingrate}()}, \code{\link{get_openinterest}()}, @@ -121,4 +97,4 @@ Other get-function: \author{ Jonas Cuzulan Hirani } -\concept{get-function} +\concept{get-functions} diff --git a/man/get_openinterest.Rd b/man/get_openinterest.Rd index 5f07755d..dc080ed1 100644 --- a/man/get_openinterest.Rd +++ b/man/get_openinterest.Rd @@ -4,7 +4,6 @@ \alias{get_openinterest} \title{Get the open interest on perpetual futures contracts} \usage{ -## open interest get_openinterest( ticker, interval = '1d', @@ -14,61 +13,74 @@ get_openinterest( ) } \arguments{ -\item{ticker}{An \link{character}-vector of \link{length} 1. See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} +\item{ticker}{A \link{character}-vector of \link{length} 1. +See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} -\item{interval}{A \link{character}-vector of \link{length} 1. \verb{1d} by default. See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} +\item{interval}{A \link{character}-vector of \link{length} 1. \verb{1d} by default. +See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} -\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} +\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. +See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} -\item{from}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{from}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} -\item{to}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{to}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} } \value{ An \link{xts}-object containing, -\itemize{ -\item open_interest (\link{numeric}): total open perpetual contracts on both both sides. -} + +\item{index}{<\link{POSIXct}> the time-index} +\item{open_interest}{<\link{numeric}> open perpetual contracts on both both sides} + +\strong{Sample output} + +\if{html}{\out{
}}\preformatted{#> open_interest +#> 2024-05-12 02:00:00 70961.07 +#> 2024-05-13 02:00:00 69740.49 +#> 2024-05-14 02:00:00 71110.33 +#> 2024-05-15 02:00:00 67758.06 +#> 2024-05-16 02:00:00 73614.70 +#> 2024-05-17 02:00:00 72377.85 +}\if{html}{\out{
}} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#stable}{\figure{lifecycle-stable.svg}{options: alt='[Stable]'}}}{\strong{[Stable]}} -Get the open interest on a cryptocurrency pair from the \code{\link[=available_exchanges]{available_exchanges()}} in any actively traded \code{\link[=available_tickers]{available_tickers()}} on the FUTURES markets. +Get the open interest on a cryptocurrency pair from the +\code{\link[=available_exchanges]{available_exchanges()}} in any actively traded \code{\link[=available_tickers]{available_tickers()}} +on the FUTURES markets. } \details{ \subsection{On time-zones and dates}{ -Values passed to \code{from} or \code{to} must be coercible by \code{\link[=as.Date]{as.Date()}}, or \code{\link[=as.POSIXct]{as.POSIXct()}}, with a format of either \code{"\%Y-\%m-\%d"} or \code{"\%Y-\%m-\%d \%H:\%M:\%S"}. By default -all dates are passed and returned with \code{\link[=Sys.timezone]{Sys.timezone()}}. +Values passed to \code{from} or \code{to} must be coercible by \code{\link[=as.Date]{as.Date()}}, +or \code{\link[=as.POSIXct]{as.POSIXct()}}, with a format of either \code{"\%Y-\%m-\%d"} or +\code{"\%Y-\%m-\%d \%H:\%M:\%S"}. By default all dates are passed and +returned with \code{\link[=Sys.timezone]{Sys.timezone()}}. } \subsection{On returns}{ -If only \code{from} is provided 200 pips are returned up to \code{Sys.time()}. If only \code{to} is provided 200 pips up to the specified date -is returned. -} +If only \code{from} is provided 200 pips are returned up to \code{Sys.time()}. +If only \code{to} is provided 200 pips up to the specified date is returned. } -\note{ -Not all exchanges supports this endpoint, check \code{\link[=available_exchanges]{available_exchanges()}} for details. } \examples{ \dontrun{ - # script: Open Interest Example - # date: 2024-03-03 - # author: Serkan Korkmaz, serkor1@duck.com - # objective: Fetch - # funding rate from one of the available - # exchanges # script start; # 1) check available # exchanges for open interest - available_exchanges(type = 'interest') + cryptoQuotes::available_exchanges( + type = 'interest' + ) # 2) get BTC funding rate # for the last 7 days tail( - BTC <- get_openinterest( + BTC <- cryptoQuotes::get_openinterest( ticker = "BTCUSDT", source = "binance", from = Sys.Date() - 7 @@ -80,7 +92,7 @@ Not all exchanges supports this endpoint, check \code{\link[=available_exchanges } \seealso{ -Other get-function: +Other get-functions: \code{\link{get_fgindex}()}, \code{\link{get_fundingrate}()}, \code{\link{get_lsratio}()}, @@ -89,4 +101,4 @@ Other get-function: \author{ Serkan Korkmaz } -\concept{get-function} +\concept{get-functions} diff --git a/man/get_quote.Rd b/man/get_quote.Rd index 98f28ee4..b1d15d93 100644 --- a/man/get_quote.Rd +++ b/man/get_quote.Rd @@ -4,7 +4,6 @@ \alias{get_quote} \title{Get the Open, High, Low, Close and Volume data on a cryptocurrency pair} \usage{ -## get OHLC-V get_quote( ticker, source = 'binance', @@ -15,84 +14,91 @@ get_quote( ) } \arguments{ -\item{ticker}{An \link{character}-vector of \link{length} 1. See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} +\item{ticker}{A \link{character}-vector of \link{length} 1. +See \code{\link[=available_tickers]{available_tickers()}} for available tickers.} -\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} +\item{source}{A \link{character}-vector of \link{length} 1. \code{binance} by default. +See \code{\link[=available_exchanges]{available_exchanges()}} for available exchanges.} -\item{futures}{A \link{logical}-vector of \link{length} 1. \link{TRUE} by default. Returns futures market if \link{TRUE}, spot market otherwise.} +\item{futures}{A \link{logical}-vector of \link{length} 1. \link{TRUE} by default. +Returns futures market if \link{TRUE}, spot market otherwise.} -\item{interval}{A \link{character}-vector of \link{length} 1. \verb{1d} by default. See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} +\item{interval}{A \link{character}-vector of \link{length} 1. \verb{1d} by default. +See \code{\link[=available_intervals]{available_intervals()}} for available intervals.} -\item{from}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{from}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} -\item{to}{An optional \link{character}, \link{date} or \link{POSIXct} vector of \link{length} 1. \link{NULL} by default.} +\item{to}{An optional \link{character}-, \link{date}- or +\link{POSIXct}-vector of \link{length} 1. \link{NULL} by default.} } \value{ An \link{xts}-object containing, -\itemize{ -\item open (\link{numeric}): the opening price -\item close (\link{numeric}): the closing price -\item high (\link{numeric}): the highest price -\item low (\link{numeric}): the lowest price -\item volume (\link{numeric}): the trading volume -} + +\item{index}{<\link{POSIXct}> The time-index} +\item{open}{<\link{numeric}> Opening price} +\item{high}{<\link{numeric}> Highest price} +\item{low}{<\link{numeric}> Lowest price} +\item{close}{<\link{numeric}> Closing price} +\item{volume}{<\link{numeric}> Trading volume} + +\strong{Sample output} + +\if{html}{\out{
}}\preformatted{#> open high low close volume +#> 2024-05-12 02:00:00 60809.2 61849.4 60557.3 61455.8 104043.9 +#> 2024-05-13 02:00:00 61455.7 63440.0 60750.0 62912.1 261927.1 +#> 2024-05-14 02:00:00 62912.2 63099.6 60950.0 61550.5 244345.3 +#> 2024-05-15 02:00:00 61550.5 66440.0 61316.1 66175.4 365031.7 +#> 2024-05-16 02:00:00 66175.4 66800.0 64567.0 65217.7 242455.3 +#> 2024-05-17 02:00:00 65217.7 66478.5 65061.2 66218.8 66139.1 +}\if{html}{\out{
}} } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#stable}{\figure{lifecycle-stable.svg}{options: alt='[Stable]'}}}{\strong{[Stable]}} -Get a quote on a cryptocurrency pair from the \code{\link[=available_exchanges]{available_exchanges()}} in various \code{\link[=available_intervals]{available_intervals()}} for any actively traded \code{\link[=available_tickers]{available_tickers()}}. +Get a quote on a cryptocurrency pair from the \code{\link[=available_exchanges]{available_exchanges()}} in +various \code{\link[=available_intervals]{available_intervals()}} for any +actively traded \code{\link[=available_tickers]{available_tickers()}}. } \details{ \subsection{On time-zones and dates}{ -Values passed to \code{from} or \code{to} must be coercible by \code{\link[=as.Date]{as.Date()}}, or \code{\link[=as.POSIXct]{as.POSIXct()}}, with a format of either \code{"\%Y-\%m-\%d"} or \code{"\%Y-\%m-\%d \%H:\%M:\%S"}. By default -all dates are passed and returned with \code{\link[=Sys.timezone]{Sys.timezone()}}. +Values passed to \code{from} or \code{to} must be coercible by \code{\link[=as.Date]{as.Date()}}, +or \code{\link[=as.POSIXct]{as.POSIXct()}}, with a format of either \code{"\%Y-\%m-\%d"} or +\code{"\%Y-\%m-\%d \%H:\%M:\%S"}. By default all dates are passed and +returned with \code{\link[=Sys.timezone]{Sys.timezone()}}. } \subsection{On returns}{ -If only \code{from} is provided 200 pips are returned up to \code{Sys.time()}. If only \code{to} is provided 200 pips up to the specified date -is returned. +If only \code{from} is provided 200 pips are returned up to \code{Sys.time()}. +If only \code{to} is provided 200 pips up to the specified date is returned. } } \examples{ \dontrun{ -# script: scr_getQuote -# date: 2024-02-29 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Demonstrate the basic -# usage of the get_quote-function -# script start; - - - # 1) Load BTC spot - # from Kucoin with 30 minute - # intervals - BTC <- cryptoQuotes::get_quote( - ticker = 'BTCUSDT', - source = 'binance', - interval = '30m', - futures = FALSE, - from = Sys.Date() - 1 - ) + # script start; - # 2) chart the spot price - # using the chart - # function - cryptoQuotes::chart( - ticker = BTC, - main = cryptoQuotes::kline(), - indicator = list( - cryptoQuotes::volume(), - cryptoQuotes::bollinger_bands() + # get quote on + # BTCUSDT pair from + # Binance in 30m + # intervals from the + # last 24 hours + tail( + BTC <- cryptoQuotes::get_quote( + ticker = 'BTCUSDT', + source = 'binance', + interval = '30m', + futures = FALSE, + from = Sys.Date() - 1 ) ) -# script end; + # script end; } } \seealso{ -Other get-function: +Other get-functions: \code{\link{get_fgindex}()}, \code{\link{get_fundingrate}()}, \code{\link{get_lsratio}()}, @@ -101,4 +107,4 @@ Other get-function: \author{ Serkan Korkmaz } -\concept{get-function} +\concept{get-functions} diff --git a/man/hma.Rd b/man/hma.Rd index a870597a..1a293732 100644 --- a/man/hma.Rd +++ b/man/hma.Rd @@ -2,72 +2,43 @@ % Please edit documentation in R/chart_ma.R \name{hma} \alias{hma} -\title{Add Hull Moving Average to the chart} +\title{Add Hull Moving Average (HMA) to the chart} \usage{ -hma(price = "Close", n = 20, internal = list(), ...) +hma( + price = "close", + n = 20, + ... +) } \arguments{ -\item{price}{A \link{character}-vector of \link{length} 1. Close by default. The name of the vector to passed into \link[TTR:MovingAverages]{TTR::HMA}} +\item{price}{A \link{character}-vector of \link{length} 1. "close" by default. +The name of the vector to passed into \link[TTR:MovingAverages]{TTR::HMA}.} \item{n}{Number of periods to average over. Must be between 1 and \code{nrow(x)}, inclusive.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} - -\item{...}{any other passthrough parameters} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. +A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that interacts with \link{TTR}'s moving average family of functions. +A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that +interacts with \link{TTR}'s moving average family of functions. +The function adds moving average indicators to the main \code{\link[=chart]{chart()}}. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), +cryptoQuotes::chart( + ticker = BTC, + main = kline(), indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE + cryptoQuotes::ema(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::wma(n = 21) ) ) @@ -80,6 +51,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -87,6 +59,7 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, @@ -98,8 +71,26 @@ Other moving average indicators: \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{sma}()}, +\code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} + +Other main chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{dema}()}, +\code{\link{donchian_channel}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{sma}()}, +\code{\link{vwap}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} +\concept{main chart indicators} \concept{moving average indicators} diff --git a/man/is.date.Rd b/man/is.date.Rd index 856c398e..ba5fbf33 100644 --- a/man/is.date.Rd +++ b/man/is.date.Rd @@ -13,12 +13,14 @@ is.date(x) \link{TRUE} if its either POSIXct, POSIXt or Date. \link{FALSE} otherwise. } \description{ -This function check is equivalent to \code{\link[=is.numeric]{is.numeric()}}, \code{\link[=is.logical]{is.logical()}}, and checks for the date type classes -POSIXct, POSIXt and Date. And wether the character vector can be formatted to dates. +This function check is equivalent to \code{\link[=is.numeric]{is.numeric()}}, \code{\link[=is.logical]{is.logical()}}, +and checks for the date type classes POSIXct, POSIXt and Date. +And wether the character vector can be formatted to dates. } \seealso{ Other development tools: \code{\link{GET}()}, +\code{\link{chart_layout}()}, \code{\link{convert_date}()}, \code{\link{default_dates}()}, \code{\link{fetch}()}, diff --git a/man/kline.Rd b/man/kline.Rd index 8fcd70dc..e805db53 100644 --- a/man/kline.Rd +++ b/man/kline.Rd @@ -2,67 +2,33 @@ % Please edit documentation in R/chart_quote.R \name{kline} \alias{kline} -\title{Candlestick chart} +\title{Candlestick Chart} \usage{ -kline(internal = list()) +kline(...) } \arguments{ -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. +An \link{invisible} \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -Candlestick charts are highly visual and provide a quick and intuitive way to assess market sentiment and price action. -Traders and analysts use them in conjunction with other technical analysis tools to make informed trading decisions. -These charts are particularly useful for identifying key support and resistance levels, trend changes, and potential entry and exit points in financial markets. +A high-level \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-function for charting +Open, High, Low and Close prices. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), - indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE +# Charting BTC using +# candlesticks as main +# chart +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::kline(), + sub = list( + cryptoQuotes::volume() ) ) @@ -71,7 +37,8 @@ chart( \seealso{ Other price charts: \code{\link{chart}()}, -\code{\link{ohlc}()} +\code{\link{ohlc}()}, +\code{\link{pline}()} } \author{ Serkan Korkmaz diff --git a/man/lsr.Rd b/man/lsr.Rd index 67cab497..3005f680 100644 --- a/man/lsr.Rd +++ b/man/lsr.Rd @@ -2,52 +2,45 @@ % Please edit documentation in R/chart_lsr.R \name{lsr} \alias{lsr} -\title{Chart the long-short ratios} +\title{Chart the long-short ratio} \usage{ -lsr(ratio, internal = list()) +lsr(ratio, ...) } \arguments{ -\item{ratio}{A \code{\link[xts:xts]{xts::xts()}}-object with the column LSRatio. See \code{\link[=get_lsratio]{get_lsratio()}} for more details.} +\item{ratio}{A \code{\link[xts:xts]{xts::xts()}}-object. See \code{\link[=get_lsratio]{get_lsratio()}} for more details.} -\item{internal}{An empty \code{\link[=list]{list()}}. This is an internal helper-argument, ignore.} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}} +An \link{invisible} \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -The \code{\link[=lsr]{lsr()}}-function adds a scatter plot as a subplot to the chart colored by ratio size. -} -\details{ -The long-short ratio is a market sentiment indicator on expected price movement. +A high-level \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-wrapper function. +The function adds a subchart to the \link{chart} with \verb{long-short ratio}. } \examples{ \dontrun{ - # Example on loading - # long-short ratio - # for the last days - # on the 15 minute candle - # wrapped in try to avoid - # failure on Github + # script start; # 1) long-short ratio # on BTCUSDT pair - ls_ratio <- cryptoQuotes::get_lsratio( - ticker = 'BTCUSDT', + LS_BTC <- cryptoQuotes::get_lsratio( + ticker = 'BTCUSDT', interval = '15m', - from = Sys.Date() - 1, - to = Sys.Date() + from = Sys.Date() - 1, + to = Sys.Date() ) # 2) BTCSDT in same period # as the long-short ratio; BTC <- cryptoQuotes::get_quote( - ticker = 'BTCUSDT', - futures = TRUE, + ticker = 'BTCUSDT', + futures = TRUE, interval = '15m', - from = Sys.Date() - 1, - to = Sys.Date() + from = Sys.Date() - 1, + to = Sys.Date() ) # 3) plot BTCUSDT-pair @@ -56,18 +49,15 @@ The long-short ratio is a market sentiment indicator on expected price movement. ticker = BTC, main = cryptoQuotes::kline(), sub = list( - cryptoQuotes::lsr(ratio = ls_ratio), - cryptoQuotes::volume() - ), - indicator = list( - cryptoQuotes::bollinger_bands() + cryptoQuotes::lsr( + ratio = LS_BTC + ) ) ) -} - + # end of scrtipt; +} -# end of scrtipt; } \seealso{ Other chart indicators: @@ -76,6 +66,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -83,6 +74,7 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, @@ -91,13 +83,17 @@ Other chart indicators: Other sentiment indicators: \code{\link{fgi}()} -Other subcharts: +Other subchart indicators: \code{\link{add_event}()}, \code{\link{fgi}()}, \code{\link{macd}()}, \code{\link{rsi}()}, +\code{\link{smi}()}, \code{\link{volume}()} } +\author{ +Serkan Korkmaz +} \concept{chart indicators} \concept{sentiment indicators} -\concept{subcharts} +\concept{subchart indicators} diff --git a/man/macd.Rd b/man/macd.Rd index 6927d914..dc81d570 100644 --- a/man/macd.Rd +++ b/man/macd.Rd @@ -2,16 +2,15 @@ % Please edit documentation in R/chart_macd.R \name{macd} \alias{macd} -\title{Add MACD indicators to the chart} +\title{Chart the Moving Average Convergence Divergence (MACD) indicator} \usage{ macd( - nFast = 12, - nSlow = 26, - nSig = 9, - maType = "SMA", - percent = TRUE, - internal = list(), - ... + nFast = 12, + nSlow = 26, + nSig = 9, + maType = "SMA", + percent = TRUE, + ... ) } \arguments{ @@ -33,63 +32,38 @@ macd( fast and slow moving averages is returned, otherwise the difference between the respective averages is returned.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} - -\item{...}{Other arguments to be passed to the \code{maType} function in -case (1) above.} +\item{...}{For internal use. Please ignore.} } \value{ -Invisbly returns a plotly object. +An \link{invisible} \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -Traders and investors use the MACD indicator to identify trend changes, potential reversals, and overbought or oversold conditions in the market. -It is a versatile tool that can be applied to various timeframes and asset classes, making it a valuable part of technical analysis for many traders. +A high-level \code{\link[plotly:plot_ly]{plotly::plot_ly()}}- and \code{\link[plotly:add_trace]{plotly::add_lines()}}-function that +interacts with the \code{\link[TTR:MACD]{TTR::MACD()}}-function. The function adds subchart with a +\code{\link[TTR:MACD]{TTR::MACD()}}-indicator. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( +# 1) charting weekly +# BTC using candlesticks +# and indicators +cryptoQuotes::chart( ticker = BTC, - main = macd(), + main = cryptoQuotes::kline(), sub = list( - volume(), - kline() + cryptoQuotes::volume(), + cryptoQuotes::macd() ), indicator = list( - bollinger_bands(), - sma() + cryptoQuotes::bollinger_bands(), + cryptoQuotes::sma(), + cryptoQuotes::alma() ), options = list( - dark = TRUE, + dark = TRUE, deficiency = FALSE ) ) @@ -103,6 +77,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -110,17 +85,27 @@ Other chart indicators: \code{\link{lsr}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} -Other subcharts: +Other subchart indicators: \code{\link{add_event}()}, \code{\link{fgi}()}, \code{\link{lsr}()}, \code{\link{rsi}()}, +\code{\link{smi}()}, \code{\link{volume}()} + +Other momentum indicators: +\code{\link{rsi}()}, +\code{\link{smi}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} -\concept{subcharts} +\concept{momentum indicators} +\concept{subchart indicators} diff --git a/man/ohlc.Rd b/man/ohlc.Rd index 0da5ba63..41d094ae 100644 --- a/man/ohlc.Rd +++ b/man/ohlc.Rd @@ -2,67 +2,33 @@ % Please edit documentation in R/chart_quote.R \name{ohlc} \alias{ohlc} -\title{OHLC chart} +\title{OHLC Barchart} \usage{ -ohlc(internal = list()) +ohlc(...) } \arguments{ -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. +An \link{invisible} \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -Candlestick charts are highly visual and provide a quick and intuitive way to assess market sentiment and price action. -Traders and analysts use them in conjunction with other technical analysis tools to make informed trading decisions. -These charts are particularly useful for identifying key support and resistance levels, trend changes, and potential entry and exit points in financial markets. +A high-level \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-function for charting +Open, High, Low and Close prices. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), - indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE +# Charting BTC using +# OHLC-bars as main +# chart +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::ohlc(), + sub = list( + cryptoQuotes::volume() ) ) @@ -71,7 +37,8 @@ chart( \seealso{ Other price charts: \code{\link{chart}()}, -\code{\link{kline}()} +\code{\link{kline}()}, +\code{\link{pline}()} } \author{ Serkan Korkmaz diff --git a/man/pline.Rd b/man/pline.Rd new file mode 100644 index 00000000..5efffdc9 --- /dev/null +++ b/man/pline.Rd @@ -0,0 +1,48 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chart_quote.R +\name{pline} +\alias{pline} +\title{Line Chart} +\usage{ +pline(price = "close", ...) +} +\arguments{ +\item{price}{A \link{character}-vector of \link{length} 1. "close" by default.} + +\item{...}{For internal use. Please ignore.} +} +\value{ +An \link{invisible} \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object. +} +\description{ +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} + +A high-level \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-function for charting +Open, High, Low and Close prices. +} +\examples{ +# script start; + +# Charting BTC using +# line charts with closing price +# as main chart +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::pline(), + sub = list( + cryptoQuotes::volume() + ) +) + +# script end; +} +\seealso{ +Other price charts: +\code{\link{chart}()}, +\code{\link{kline}()}, +\code{\link{ohlc}()} +} +\author{ +Serkan Korkmaz +} +\concept{price charts} diff --git a/man/remove_bound.Rd b/man/remove_bound.Rd index cf552c42..644ac991 100644 --- a/man/remove_bound.Rd +++ b/man/remove_bound.Rd @@ -10,7 +10,8 @@ remove_bound(xts, bounds = c("upper")) \arguments{ \item{xts}{A xts-object that needs its bounds modified.} -\item{bounds}{A character vector of length 1. Has to be one of \code{c('upper','lower','both')}. Defaults to Upper.} +\item{bounds}{A character vector of length 1. +Has to be one of \code{c('upper','lower','both')}. Defaults to Upper.} } \value{ Returns an xts-class object with its bounds removed. @@ -23,19 +24,8 @@ which in some cases is an undesirable feature. This high level function removes the bounds if desired } \examples{ -# script: scr_FUN -# date: 2023-12-27 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Demonstrate the use of the convinience -# funtions # script start; -# by default the Fear and Greed Index -# is given daily. So to align these values -# with, say, weekly candles it has to be aggregated -# -# In this example the built-in data are used - # 1) check index of BTCUSDT and # the Fear and Greed Index setequal( @@ -46,8 +36,8 @@ setequal( # 2) to align the indices, # we use the convincience functions # by splitting the FGI by the BTC index. -FGIndex <- split_window( - xts = FGIndex, +FGIndex <- cryptoQuotes::split_window( + xts = cryptoQuotes::FGIndex, by = zoo::index(BTC), # Remove upper bounds of the @@ -63,7 +53,7 @@ FGIndex <- split_window( # 3) as splitWindow returns a list # it needs to passed into calibrateWindow # to ensure comparability -FGIndex <- calibrate_window( +FGIndex <- cryptoQuotes::calibrate_window( list = FGIndex, # As each element in the list can include @@ -78,22 +68,19 @@ FGIndex <- calibrate_window( # 3) check if candles aligns # accordingly -setequal( - zoo::index(BTC), - zoo::index(FGIndex) +stopifnot( + setequal( + zoo::index(BTC), + zoo::index(FGIndex) + ) ) -# As the dates are now aligned -# and the Fear and Greed Index being summarised by -# the first value, the Fear and Greed Index is the opening -# Fear and Greed Index value, at each candle. - # script end; } \seealso{ -Other convinience: +Other utility: \code{\link{calibrate_window}()}, \code{\link{split_window}()} } -\concept{convinience} +\concept{utility} diff --git a/man/rsi.Rd b/man/rsi.Rd index 1038b90e..2dcbd751 100644 --- a/man/rsi.Rd +++ b/man/rsi.Rd @@ -2,19 +2,21 @@ % Please edit documentation in R/chart_rsi.R \name{rsi} \alias{rsi} -\title{Add RSI indicators to your -chart} +\title{Chart the Relative Strength Index (RSI)} \usage{ rsi( - n = 14, - maType = "SMA", - upper_limit = 80, - lower_limit = 20, - internal = list(), - ... + price = "close", + n = 14, + maType = "SMA", + upper_limit = 80, + lower_limit = 20, + color = '#4682b4', + ... ) } \arguments{ +\item{price}{Price series that is coercible to xts or matrix.} + \item{n}{Number of periods for moving averages.} \item{maType}{Either: @@ -25,67 +27,46 @@ rsi( See Examples. }} -\item{upper_limit}{A \link{numeric}-vector of \link{length} 1. 80 by default. Sets the upper limit of the \link[TTR:RSI]{TTR::RSI}.} +\item{upper_limit}{A \link{numeric}-vector of \link{length} 1. 80 by default. +Sets the upper limit of the \link[TTR:RSI]{TTR::RSI}.} -\item{lower_limit}{A \link{numeric}-vector of \link{length} 1. 20 by default. Sets the lower limit of the \link[TTR:RSI]{TTR::RSI}.} +\item{lower_limit}{A \link{numeric}-vector of \link{length} 1. 20 by default. +Sets the lower limit of the \link[TTR:RSI]{TTR::RSI}.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} +\item{color}{A \link{character}-vector of \link{length} 1. "#4682b4" by default.} -\item{...}{Other arguments to be passed to the \code{maType} function in -case (1) above.} +\item{...}{For internal use. Please ignore.} } \value{ -Invisbly returns a plotly object. +An \link{invisible} \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -The RSI can be customized with different look-back periods to suit various trading strategies and timeframes. -It is a valuable tool for assessing the momentum and relative strength of an asset, helping traders make more informed decisions in financial markets. +A high-level \code{\link[plotly:plot_ly]{plotly::plot_ly()}}- and \code{\link[plotly:add_trace]{plotly::add_lines()}}-function that +interacts with the \code{\link[TTR:RSI]{TTR::RSI()}}-function. +The function adds a subchart with a \code{\link[TTR:RSI]{TTR::RSI()}}-indicator. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( +# 1) charting weekly +# BTC using candlesticks +# and indicators +cryptoQuotes::chart( ticker = BTC, - main = macd(), + main = cryptoQuotes::kline(), sub = list( - volume(), - kline() + cryptoQuotes::volume(), + cryptoQuotes::macd() ), indicator = list( - bollinger_bands(), - sma() + cryptoQuotes::bollinger_bands(), + cryptoQuotes::sma(), + cryptoQuotes::alma() ), options = list( - dark = TRUE, + dark = TRUE, deficiency = FALSE ) ) @@ -99,6 +80,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -106,17 +88,27 @@ Other chart indicators: \code{\link{lsr}()}, \code{\link{macd}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} -Other subcharts: +Other subchart indicators: \code{\link{add_event}()}, \code{\link{fgi}()}, \code{\link{lsr}()}, \code{\link{macd}()}, +\code{\link{smi}()}, \code{\link{volume}()} + +Other momentum indicators: +\code{\link{macd}()}, +\code{\link{smi}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} -\concept{subcharts} +\concept{momentum indicators} +\concept{subchart indicators} diff --git a/man/sma.Rd b/man/sma.Rd index 7c0e1b1a..0000d911 100644 --- a/man/sma.Rd +++ b/man/sma.Rd @@ -2,72 +2,43 @@ % Please edit documentation in R/chart_ma.R \name{sma} \alias{sma} -\title{Add Simple Moving Averages to the charts} +\title{Add Simple Moving Average (SMA) indicators to the chart} \usage{ -sma(price = "close", n = 10, internal = list(), ...) +sma( + price = "close", + n = 10, + ... +) } \arguments{ -\item{price}{A \link{character}-vector of \link{length} 1. Close by default. The name of the vector to passed into \link[TTR:MovingAverages]{TTR::SMA}} +\item{price}{A \link{character}-vector of \link{length} 1. "close" by default. +The name of the vector to passed into \link[TTR:MovingAverages]{TTR::SMA}.} \item{n}{Number of periods to average over. Must be between 1 and \code{nrow(x)}, inclusive.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} - -\item{...}{any other passthrough parameters} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. +A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that interacts with \link{TTR}'s moving average family of functions. +A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that +interacts with \link{TTR}'s moving average family of functions. +The function adds moving average indicators to the main \code{\link[=chart]{chart()}}. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), +cryptoQuotes::chart( + ticker = BTC, + main = kline(), indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE + cryptoQuotes::ema(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::wma(n = 21) ) ) @@ -80,6 +51,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -87,6 +59,7 @@ Other chart indicators: \code{\link{lsr}()}, \code{\link{macd}()}, \code{\link{rsi}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()}, @@ -98,8 +71,26 @@ Other moving average indicators: \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{hma}()}, +\code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} + +Other main chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{dema}()}, +\code{\link{donchian_channel}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{hma}()}, +\code{\link{vwap}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} +\concept{main chart indicators} \concept{moving average indicators} diff --git a/man/smi.Rd b/man/smi.Rd new file mode 100644 index 00000000..76cabe74 --- /dev/null +++ b/man/smi.Rd @@ -0,0 +1,128 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/chart_smi.R +\name{smi} +\alias{smi} +\title{Chart the Stochastic Momentum Index (SMI)} +\usage{ +smi( + nFastK = 14, + nFastD = 3, + nSlowD = 3, + maType, + bounded = TRUE, + smooth = 1, + upper_limit = 40, + lower_limit = -40, + color = "#4682b4", + ... +) +} +\arguments{ +\item{nFastK}{Number of periods for fast \%K (i.e. the number of past periods +to use).} + +\item{nFastD}{Number of periods for fast \%D (i.e. the number smoothing +periods to apply to fast \%K).} + +\item{nSlowD}{Number of periods for slow \%D (i.e. the number smoothing +periods to apply to fast \%D).} + +\item{maType}{Either: +\enumerate{ + \item A function or a string naming the function to be called. + \item A \emph{list} with the first component like (1) above, and + additional parameters specified as \emph{named} components. + See Examples. +}} + +\item{bounded}{Logical, should current period's values be used in the +calculation?} + +\item{smooth}{Number of internal smoothing periods to be applied before +calculating FastK. See Details.} + +\item{upper_limit}{A \link{numeric}-vector of \link{length} 1. 40 by default. +Sets the upper limit of the \link[TTR:stochastics]{TTR::SMI}.} + +\item{lower_limit}{A \link{numeric}-vector of \link{length} 1. -40 by default. +Sets the lower limit of the \link[TTR:stochastics]{TTR::SMI}.} + +\item{color}{A \link{character}-vector of \link{length} 1. "#4682b4" by default.} + +\item{...}{For internal use. Please ignore.} +} +\value{ +An \link{invisible} \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object. +} +\description{ +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} + +A high-level \code{\link[plotly:plot_ly]{plotly::plot_ly()}}- and \code{\link[plotly:add_trace]{plotly::add_lines()}}-function that +interacts with the \code{\link[TTR:stochastics]{TTR::SMI()}}-function. +The function adds a subchart with a \code{\link[TTR:stochastics]{TTR::SMI()}}-indicator. +} +\examples{ +# script start; + +# 1) charting weekly +# BTC using candlesticks +# and indicators +cryptoQuotes::chart( + ticker = BTC, + main = cryptoQuotes::kline(), + sub = list( + cryptoQuotes::volume(), + cryptoQuotes::macd() + ), + indicator = list( + cryptoQuotes::bollinger_bands(), + cryptoQuotes::sma(), + cryptoQuotes::alma() + ), + options = list( + dark = TRUE, + deficiency = FALSE + ) +) + +# script end; +} +\seealso{ +Other chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{chart}()}, +\code{\link{dema}()}, +\code{\link{donchian_channel}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{fgi}()}, +\code{\link{hma}()}, +\code{\link{lsr}()}, +\code{\link{macd}()}, +\code{\link{rsi}()}, +\code{\link{sma}()}, +\code{\link{volume}()}, +\code{\link{vwap}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} + +Other subchart indicators: +\code{\link{add_event}()}, +\code{\link{fgi}()}, +\code{\link{lsr}()}, +\code{\link{macd}()}, +\code{\link{rsi}()}, +\code{\link{volume}()} + +Other momentum indicators: +\code{\link{macd}()}, +\code{\link{rsi}()} +} +\author{ +Serkan Korkmaz +} +\concept{chart indicators} +\concept{momentum indicators} +\concept{subchart indicators} diff --git a/man/split_window.Rd b/man/split_window.Rd index 32303d08..5f150f03 100644 --- a/man/split_window.Rd +++ b/man/split_window.Rd @@ -11,7 +11,8 @@ split_window(xts, by, bounds = "upper") \item{by}{A reference \code{\link[zoo:index]{zoo::index()}}-object, to be split by.} -\item{bounds}{A character vector of length 1. Has to be one of \code{c('upper','lower','both')}. Defaults to Upper.} +\item{bounds}{A character vector of length 1. +Has to be one of \code{c('upper','lower','both')}. Defaults to Upper.} } \value{ Returns a list of iteratively restricted xts objects @@ -19,23 +20,13 @@ Returns a list of iteratively restricted xts objects \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -The \code{\link[=split_window]{split_window()}}-function is a high level wrapper of the \code{\link[stats:window]{stats::window()}}-function which restricts -the intervals between the first and second index value iteratively +The \code{\link[=split_window]{split_window()}}-function is a high level wrapper +of the \code{\link[stats:window]{stats::window()}}-function which restricts the intervals between +the first and second index value iteratively } \examples{ -# script: scr_FUN -# date: 2023-12-27 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Demonstrate the use of the convinience -# funtions # script start; -# by default the Fear and Greed Index -# is given daily. So to align these values -# with, say, weekly candles it has to be aggregated -# -# In this example the built-in data are used - # 1) check index of BTCUSDT and # the Fear and Greed Index setequal( @@ -46,8 +37,8 @@ setequal( # 2) to align the indices, # we use the convincience functions # by splitting the FGI by the BTC index. -FGIndex <- split_window( - xts = FGIndex, +FGIndex <- cryptoQuotes::split_window( + xts = cryptoQuotes::FGIndex, by = zoo::index(BTC), # Remove upper bounds of the @@ -63,7 +54,7 @@ FGIndex <- split_window( # 3) as splitWindow returns a list # it needs to passed into calibrateWindow # to ensure comparability -FGIndex <- calibrate_window( +FGIndex <- cryptoQuotes::calibrate_window( list = FGIndex, # As each element in the list can include @@ -78,22 +69,19 @@ FGIndex <- calibrate_window( # 3) check if candles aligns # accordingly -setequal( - zoo::index(BTC), - zoo::index(FGIndex) +stopifnot( + setequal( + zoo::index(BTC), + zoo::index(FGIndex) + ) ) -# As the dates are now aligned -# and the Fear and Greed Index being summarised by -# the first value, the Fear and Greed Index is the opening -# Fear and Greed Index value, at each candle. - # script end; } \seealso{ -Other convinience: +Other utility: \code{\link{calibrate_window}()}, \code{\link{remove_bound}()} } -\concept{convinience} +\concept{utility} diff --git a/man/volume.Rd b/man/volume.Rd index 37a4fa7a..c438cee9 100644 --- a/man/volume.Rd +++ b/man/volume.Rd @@ -2,66 +2,42 @@ % Please edit documentation in R/chart_volume.R \name{volume} \alias{volume} -\title{Add volume indicators -to the chart} +\title{Chart the trading volume} \usage{ -volume(internal = list()) +volume(...) } \arguments{ -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} +\item{...}{For internal use. Please ignore.} } \value{ -Invisbly returns a plotly object. +An \link{invisible} \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object. } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -Volume indicators are technical analysis tools used to analyze trading volume, which represents the number of shares or contracts traded in a financial market over a specific period of time. -These indicators provide valuable insights into the strength and significance of price movements. +A high-level \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-function. +The function adds a subchart with the trading \code{trading}. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( +# 1) charting weekly +# BTC using candlesticks +# and indicators +cryptoQuotes::chart( ticker = BTC, - main = kline(), + main = cryptoQuotes::kline(), sub = list( - volume(), - macd() + cryptoQuotes::volume(), + cryptoQuotes::macd() ), indicator = list( - bollinger_bands(), - sma(), - alma() + cryptoQuotes::bollinger_bands(), + cryptoQuotes::sma(), + cryptoQuotes::alma() ), options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), - indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, + dark = TRUE, deficiency = FALSE ) ) @@ -75,6 +51,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -83,16 +60,21 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{vwap}()}, \code{\link{wma}()}, \code{\link{zlema}()} -Other subcharts: +Other subchart indicators: \code{\link{add_event}()}, \code{\link{fgi}()}, \code{\link{lsr}()}, \code{\link{macd}()}, -\code{\link{rsi}()} +\code{\link{rsi}()}, +\code{\link{smi}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} -\concept{subcharts} +\concept{subchart indicators} diff --git a/man/vwap.Rd b/man/vwap.Rd index 16f62dc4..30a66f3f 100644 --- a/man/vwap.Rd +++ b/man/vwap.Rd @@ -2,12 +2,18 @@ % Please edit documentation in R/chart_ma.R \name{vwap} \alias{vwap} -\title{Add Volume-weighted Moving Average to the chart} +\title{Add Volume-Weighted Moving Average (VWAP) to the chart} \usage{ -vwap(price = "close", n = 10, ratio = NULL, internal = list(), ...) +vwap( + price = "close", + n = 10, + ratio = NULL, + ... +) } \arguments{ -\item{price}{A \link{character}-vector of \link{length} 1. Close by default. The name of the vector to passed into \link[TTR:MovingAverages]{TTR::VWAP}} +\item{price}{A \link{character}-vector of \link{length} 1. "close" by default. +The name of the vector to passed into \link[TTR:MovingAverages]{TTR::VWAP}} \item{n}{Number of periods to average over. Must be between 1 and \code{nrow(x)}, inclusive.} @@ -15,62 +21,28 @@ vwap(price = "close", n = 10, ratio = NULL, internal = list(), ...) \item{ratio}{A smoothing/decay ratio. \code{ratio} overrides \code{wilder} in \code{EMA}.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} - -\item{...}{any other passthrough parameters} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. +A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that interacts with \link{TTR}'s moving average family of functions. +A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that +interacts with \link{TTR}'s moving average family of functions. +The function adds moving average indicators to the main \code{\link[=chart]{chart()}}. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), +cryptoQuotes::chart( + ticker = BTC, + main = kline(), indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), - indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE + cryptoQuotes::ema(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::wma(n = 21) ) ) @@ -83,6 +55,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -91,8 +64,37 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{wma}()}, \code{\link{zlema}()} + +Other moving average indicators: +\code{\link{alma}()}, +\code{\link{dema}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{hma}()}, +\code{\link{sma}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} + +Other main chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{dema}()}, +\code{\link{donchian_channel}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{hma}()}, +\code{\link{sma}()}, +\code{\link{wma}()}, +\code{\link{zlema}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} +\concept{main chart indicators} +\concept{moving average indicators} diff --git a/man/wma.Rd b/man/wma.Rd index 894f0202..70ee0ac8 100644 --- a/man/wma.Rd +++ b/man/wma.Rd @@ -2,12 +2,18 @@ % Please edit documentation in R/chart_ma.R \name{wma} \alias{wma} -\title{Add Weighted Moving Average to the chart} +\title{Add Weighted Moving Average (WMA) to the chart} \usage{ -wma(price = "close", n = 10, wts = 1:n, internal = list(), ...) +wma( + price = "close", + n = 10, + wts = 1:n, + ... +) } \arguments{ -\item{price}{A \link{character}-vector of \link{length} 1. Close by default. The name of the vector to passed into \link[TTR:MovingAverages]{TTR::WMA}} +\item{price}{A \link{character}-vector of \link{length} 1. "close" by default. +The name of the vector to passed into \link[TTR:MovingAverages]{TTR::WMA}.} \item{n}{Number of periods to average over. Must be between 1 and \code{nrow(x)}, inclusive.} @@ -15,62 +21,28 @@ wma(price = "close", n = 10, wts = 1:n, internal = list(), ...) \item{wts}{Vector of weights. Length of \code{wts} vector must equal the length of \code{x}, or \code{n} (the default).} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} - -\item{...}{any other passthrough parameters} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. +A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that interacts with \link{TTR}'s moving average family of functions. +A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that +interacts with \link{TTR}'s moving average family of functions. +The function adds moving average indicators to the main \code{\link[=chart]{chart()}}. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), +cryptoQuotes::chart( + ticker = BTC, + main = kline(), indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE + cryptoQuotes::ema(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::wma(n = 21) ) ) @@ -83,6 +55,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -91,6 +64,7 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{zlema}()} @@ -102,7 +76,25 @@ Other moving average indicators: \code{\link{evwma}()}, \code{\link{hma}()}, \code{\link{sma}()}, +\code{\link{vwap}()}, \code{\link{zlema}()} + +Other main chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{dema}()}, +\code{\link{donchian_channel}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{hma}()}, +\code{\link{sma}()}, +\code{\link{vwap}()}, +\code{\link{zlema}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} +\concept{main chart indicators} \concept{moving average indicators} diff --git a/man/zlema.Rd b/man/zlema.Rd index eaae5ffa..2145efc8 100644 --- a/man/zlema.Rd +++ b/man/zlema.Rd @@ -2,12 +2,18 @@ % Please edit documentation in R/chart_ma.R \name{zlema} \alias{zlema} -\title{Add Zero Lag Exponential Moving Average to the chart} +\title{Add Zero Lag Exponential Moving Average (ZLEMA) to the chart} \usage{ -zlema(price = "close", n = 10, ratio = NULL, internal = list(), ...) +zlema( + price = "close", + n = 10, + ratio = NULL, + ... +) } \arguments{ -\item{price}{A \link{character}-vector of \link{length} 1. Close by default. The name of the vector to passed into \link[TTR:MovingAverages]{TTR::ZLEMA}} +\item{price}{A \link{character}-vector of \link{length} 1. "close" by default. +The name of the vector to passed into \link[TTR:MovingAverages]{TTR::ZLEMA}.} \item{n}{Number of periods to average over. Must be between 1 and \code{nrow(x)}, inclusive.} @@ -15,62 +21,28 @@ zlema(price = "close", n = 10, ratio = NULL, internal = list(), ...) \item{ratio}{A smoothing/decay ratio. \code{ratio} overrides \code{wilder} in \code{EMA}.} -\item{internal}{An empty \link{list}. Used for internal purposes. Ignore.} - -\item{...}{any other passthrough parameters} +\item{...}{For internal use. Please ignore.} } \value{ -A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object wrapped in \code{\link[rlang:expr]{rlang::expr()}}. +A \code{\link[plotly:plot_ly]{plotly::plot_ly()}}-object } \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that interacts with \link{TTR}'s moving average family of functions. +A high-level \code{\link[plotly:add_trace]{plotly::add_lines()}}-wrapper function that +interacts with \link{TTR}'s moving average family of functions. +The function adds moving average indicators to the main \code{\link[=chart]{chart()}}. } \examples{ -# script: scr_charting -# date: 2023-10-25 -# author: Serkan Korkmaz, serkor1@duck.com -# objective: Charting in general # script start; -## charting the klines -## with indicators as -## subcharts -chart( - ticker = BTC, - main = kline(), - sub = list( - volume(), - macd() - ), - indicator = list( - bollinger_bands(), - sma(), - alma() - ), - options = list( - dark = TRUE, - deficiency = FALSE - ) -) - -## charting the MACD-indicator -## with klines as subcharts -chart( - ticker = BTC, - main = macd(), - sub = list( - volume(), - kline() - ), +cryptoQuotes::chart( + ticker = BTC, + main = kline(), indicator = list( - bollinger_bands(), - sma() - ), - options = list( - dark = TRUE, - deficiency = FALSE + cryptoQuotes::ema(n = 7), + cryptoQuotes::sma(n = 14), + cryptoQuotes::wma(n = 21) ) ) @@ -83,6 +55,7 @@ Other chart indicators: \code{\link{bollinger_bands}()}, \code{\link{chart}()}, \code{\link{dema}()}, +\code{\link{donchian_channel}()}, \code{\link{ema}()}, \code{\link{evwma}()}, \code{\link{fgi}()}, @@ -91,6 +64,7 @@ Other chart indicators: \code{\link{macd}()}, \code{\link{rsi}()}, \code{\link{sma}()}, +\code{\link{smi}()}, \code{\link{volume}()}, \code{\link{vwap}()}, \code{\link{wma}()} @@ -102,7 +76,25 @@ Other moving average indicators: \code{\link{evwma}()}, \code{\link{hma}()}, \code{\link{sma}()}, +\code{\link{vwap}()}, \code{\link{wma}()} + +Other main chart indicators: +\code{\link{add_event}()}, +\code{\link{alma}()}, +\code{\link{bollinger_bands}()}, +\code{\link{dema}()}, +\code{\link{donchian_channel}()}, +\code{\link{ema}()}, +\code{\link{evwma}()}, +\code{\link{hma}()}, +\code{\link{sma}()}, +\code{\link{vwap}()}, +\code{\link{wma}()} +} +\author{ +Serkan Korkmaz } \concept{chart indicators} +\concept{main chart indicators} \concept{moving average indicators} diff --git a/pkgdown/extra.css b/pkgdown/extra.css index a929b1ef..e69de29b 100644 --- a/pkgdown/extra.css +++ b/pkgdown/extra.css @@ -1,73 +0,0 @@ -/* -NOTE: This css works as it should as it -is written here. -*/ - -/* -use html in front of the CSS-selector -to claim precendence over inline css - -NOTE: Body has to be larger than main -*/ - - - - -html .container { - max-width: 100% !important; - margin-left: auto !important; - margin-right: auto !important; -} - - -html main { - max-width: 1000; - margin-left: auto !important; - margin-right: auto !important; -} - -/* The body of the webpage */ -/* -html body { - max-width: 100% !important; - margin-left: auto !important; - margin-right: auto !important; -} -*/ - - - - -/* -html main { - max-width: 70% !important; - margin-left: 0 !important; - margin-right: 0 !important; -} - -@media (min-width: 1981px) { - html * { - max-width: 1981px !important; - margin-left: auto !important; - margin-right: auto !important; - } -} - -@media (min-width: 768px) { - .container { - max-width: 120% !important; - } -} -*/ -/* -html .plotly-chart-container { - width: 100% !important; -} - - -html .col { - width: 70% !important; - margin-left: 0px !important; - margin-right: 0px !important; -} -*/ diff --git a/pkgdown/extra.js b/pkgdown/extra.js index 222f8357..e69de29b 100644 --- a/pkgdown/extra.js +++ b/pkgdown/extra.js @@ -1,10 +0,0 @@ -window.onresize = function() { - var allPlotlyCharts = document.querySelectorAll('.js-plotly-plot'); - - allPlotlyCharts.forEach(function(chart) { - Plotly.relayout(chart, { - width: chart.offsetWidth, - // Optionally adjust height as well - }); - }); -}; diff --git a/pkgdown/index.Rmd b/pkgdown/index.Rmd new file mode 100644 index 00000000..733e1010 --- /dev/null +++ b/pkgdown/index.Rmd @@ -0,0 +1,148 @@ +--- +output: github_document +always_allow_html: true +--- + +```{r setup, include = FALSE} +# set options +Sys.setenv(OPENSSL_CONF="/dev/null") + +knitr::opts_chunk$set( + collapse = FALSE, + comment = "#>", + fig.path = "man/figures/Home-", + message = FALSE, + warning = FALSE +) +``` + +# Open access to cryptocurrency market data in R
cryptocurrency in R + + +[![CRAN status](https://www.r-pkg.org/badges/version/cryptoQuotes)](https://CRAN.R-project.org/package=cryptoQuotes) +[![CRAN RStudio mirror downloads](https://cranlogs.r-pkg.org/badges/last-month/cryptoQuotes?color=blue)](https://r-pkg.org/pkg/cryptoQuotes) +[![R-CMD-check](https://github.com/serkor1/cryptoQuotes/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/serkor1/cryptoQuotes/actions/workflows/R-CMD-check.yaml) +[![codecov](https://codecov.io/gh/serkor1/cryptoQuotes/graph/badge.svg?token=D7NF1BPVL5)](https://codecov.io/gh/serkor1/cryptoQuotes) +[![Lifecycle: stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable) +![GitHub last commit (branch)](https://img.shields.io/github/last-commit/serkor1/cryptoQuotes/development) + + +The `cryptoQuotes`-package is a high-level API client for accessing public market data endpoints on major cryptocurrency exchanges. It supports open, high, low, close and volume (OHLC-V) data and a variety of sentiment indicators; the market data is high quality and can be retrieved in intervals ranging from *seconds* to *months*. All the market data is accessed and processed without relying on crawlers, or API keys, ensuring an open, and reliable, access for researchers, traders and students alike. + +## Example: Bitcoin OHLC-V with Long-Short Ratios + +
+```{r print table, echo=FALSE, fig.alt="cryptocurrency prices in R"} +## get OHLC-V in 30 minute intervals +## for Bitcoin from Binance +## futures market since yesterday +BTC <- cryptoQuotes::get_quote( + ticker = 'BTCUSDT', + source = 'binance', + futures = TRUE, + interval = '30m', + from = Sys.Date() - 1 +) + +## get the Long-Short Ratios in 30 minute +## intervals for Bitcoin from +## Binance since yesterday +BTC_LSR <- cryptoQuotes::get_lsratio( + ticker = 'BTCUSDT', + source = 'binance', + interval = '30m', + from = Sys.Date() - 1 +) + +## merge the OHLC-B +## and Long-Short Ratios +BTC <- round( + merge( + BTC, + BTC_LSR + ), + digits = 3 +) + + + +kable_output <- kableExtra::kable_styling( + kable_input = knitr::kable( + caption = 'Bitcoin (BTC) in 30 minute intervals with Long-Short Ratios.', + align = 'lcccc', + table.attr = "style='width: fit-content;'", + x = data.frame( + cbind( + index = paste(tail(zoo::index(BTC))), + tail(zoo::coredata(BTC)) + ), + row.names = NULL + ), + format = 'html' + ), + full_width = TRUE, + position = 'center', + bootstrap_options = c("responsive", "bordered"), + font_size = 14 +) + +kable_output +``` +
+ +
+Source +```{r cryptocurrency market data in R, eval=FALSE} +## get OHLC-V in 30 minute intervals +## for Bitcoin from Binance +## futures market since yesterday +BTC <- cryptoQuotes::get_quote( + ticker = 'BTCUSDT', + source = 'binance', + futures = TRUE, + interval = '30m', + from = Sys.Date() - 1 +) + +## get the Long-Short Ratios in 30 minute +## intervals for Bitcoin from +## Binance since yesterday +BTC_LSR <- cryptoQuotes::get_lsratio( + ticker = 'BTCUSDT', + source = 'binance', + interval = '30m', + from = Sys.Date() - 1 +) + +## merge the OHLC-B +## and Long-Short Ratios +BTC <- merge( + BTC, + BTC_LSR +) +``` +
+ +## :information_source: Installation + +### :shield: Stable version +```{r stable version guide, eval = FALSE} +## install from CRAN +install.packages( + pkgs = 'cryptoQuotes', + dependencies = TRUE +) +``` + +### :hammer_and_wrench: Development version +```{r development version guide, eval = FALSE} +## install from github +devtools::install_github( + repo = 'https://github.com/serkor1/cryptoQuotes/', + ref = 'development' +) +``` + +## :information_source: Code of Conduct + +Please note that the `cryptoQuotes` project is released with a [Contributor Code of Conduct](https://serkor1.github.io/cryptoQuotes/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms. diff --git a/pkgdown/index.md b/pkgdown/index.md new file mode 100644 index 00000000..97b6a6c9 --- /dev/null +++ b/pkgdown/index.md @@ -0,0 +1,312 @@ + + + +# Open access to cryptocurrency market data in R cryptocurrency in R + + + +[![CRAN +status](https://www.r-pkg.org/badges/version/cryptoQuotes)](https://CRAN.R-project.org/package=cryptoQuotes) +[![CRAN RStudio mirror +downloads](https://cranlogs.r-pkg.org/badges/last-month/cryptoQuotes?color=blue)](https://r-pkg.org/pkg/cryptoQuotes) +[![R-CMD-check](https://github.com/serkor1/cryptoQuotes/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/serkor1/cryptoQuotes/actions/workflows/R-CMD-check.yaml) +[![codecov](https://codecov.io/gh/serkor1/cryptoQuotes/graph/badge.svg?token=D7NF1BPVL5)](https://codecov.io/gh/serkor1/cryptoQuotes) +[![Lifecycle: +stable](https://img.shields.io/badge/lifecycle-stable-brightgreen.svg)](https://lifecycle.r-lib.org/articles/stages.html#stable) +![GitHub last commit +(branch)](https://img.shields.io/github/last-commit/serkor1/cryptoQuotes/development) + + +The `cryptoQuotes`-package is a high-level API client for accessing +public market data endpoints on major cryptocurrency exchanges. It +supports open, high, low, close and volume (OHLC-V) data and a variety +of sentiment indicators; the market data is high quality and can be +retrieved in intervals ranging from *seconds* to *months*. All the +market data is accessed and processed without relying on crawlers, or +API keys, ensuring an open, and reliable, access for researchers, +traders and students alike. + +## Example: Bitcoin OHLC-V with Long-Short Ratios + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Bitcoin (BTC) in 30 minute intervals with Long-Short Ratios. +
+index + +open + +high + +low + +close + +volume + +long + +short + +ls_ratio +
+2024-05-25 12:00:00 + +69118 + +69133.8 + +69040.8 + +69061.1 + +1229.377 + +0.587 + +0.413 + +1.42 +
+2024-05-25 12:30:00 + +69061 + +69492.1 + +69058.8 + +69397.6 + +5130.885 + +0.585 + +0.415 + +1.411 +
+2024-05-25 13:00:00 + +69397.7 + +69622.8 + +69345.8 + +69560.1 + +5232.397 + +0.589 + +0.411 + +1.434 +
+2024-05-25 13:30:00 + +69560 + +69563.3 + +69112.4 + +69112.5 + +5320.138 + +0.589 + +0.411 + +1.434 +
+2024-05-25 14:00:00 + +69112.4 + +69323.9 + +69031.4 + +69234.1 + +4699.305 + +0.581 + +0.419 + +1.386 +
+2024-05-25 14:30:00 + +69234 + +69260.4 + +69103.6 + +69131.9 + +1183.558 + +0.585 + +0.416 + +1.407 +
+ +
+ +
+ +Source + + +``` r +## get OHLC-V in 30 minute intervals +## for Bitcoin from Binance +## futures market since yesterday +BTC <- cryptoQuotes::get_quote( + ticker = 'BTCUSDT', + source = 'binance', + futures = TRUE, + interval = '30m', + from = Sys.Date() - 1 +) + +## get the Long-Short Ratios in 30 minute +## intervals for Bitcoin from +## Binance since yesterday +BTC_LSR <- cryptoQuotes::get_lsratio( + ticker = 'BTCUSDT', + source = 'binance', + interval = '30m', + from = Sys.Date() - 1 +) + +## merge the OHLC-B +## and Long-Short Ratios +BTC <- merge( + BTC, + BTC_LSR +) +``` + +
+ +## :information_source: Installation + +### :shield: Stable version + +``` r +## install from CRAN +install.packages( + pkgs = 'cryptoQuotes', + dependencies = TRUE +) +``` + +### :hammer_and_wrench: Development version + +``` r +## install from github +devtools::install_github( + repo = 'https://github.com/serkor1/cryptoQuotes/', + ref = 'development' +) +``` + +## :information_source: Code of Conduct + +Please note that the `cryptoQuotes` project is released with a +[Contributor Code of +Conduct](https://serkor1.github.io/cryptoQuotes/CODE_OF_CONDUCT.html). +By contributing to this project, you agree to abide by its terms. diff --git a/tests/testthat/test-FGIndex.R b/tests/testthat/test-FGIndex.R new file mode 100644 index 00000000..4f8076d3 --- /dev/null +++ b/tests/testthat/test-FGIndex.R @@ -0,0 +1,41 @@ +# script: test-FGIndex +# author: Serkan Korkmaz, serkor1@duck.com +# date: 2024-05-24 +# objective: Test that the Fear and Greed index gets +# returned correctly +# script start; + +# script end; +testthat::test_that( + desc = "Fear and Greed Index get returned correcty", + code = { + + # 0) skip if offline + testthat::skip_if_offline() + + # 1) fetch Fear and Greed Index + testthat::expect_no_condition( + output <- cryptoQuotes::get_fgindex( + from = Sys.Date() - 7, + to = Sys.Date() + ) + ) + + # 2) test if dates are reasonable + # within range + date_range <- as.numeric( + format( + range( + zoo::index(output) + ), + format = "%Y" + ) + ) + + testthat::expect_true( + object = all( + min(date_range) >= 2000, + max(date_range) <= as.numeric(format(Sys.Date(), "%Y")) + ) + ) +}) diff --git a/tests/testthat/test-FUN.R b/tests/testthat/test-FUN.R index b984a47d..9d8f2e69 100644 --- a/tests/testthat/test-FUN.R +++ b/tests/testthat/test-FUN.R @@ -2,6 +2,12 @@ testthat::test_that( desc = "Test that the convinience functions calibrates the data correctly", code = { + testthat::expect_false( + setequal( + zoo::index(FGIndex), + zoo::index(BTC) + ) + ) # 2) to align the indices, # we use the convincience functions diff --git a/tests/testthat/test-availableTickers.R b/tests/testthat/test-availableTickers.R index 836f1a89..d3ad5331 100644 --- a/tests/testthat/test-availableTickers.R +++ b/tests/testthat/test-availableTickers.R @@ -1,5 +1,5 @@ testthat::test_that( - desc = "availablePairs on Binance returns a vector of characters, with lenght > 1", + desc = "Test that available_tickers from binance returns a non-empty vector", code = { # 0) skip if online; @@ -42,7 +42,7 @@ testthat::test_that( testthat::test_that( - desc = "availablePairs on Kraken returns a vector of characters, with lenght > 1", + desc = "Test that available_tickers from kraken returns a non-empty vector", code = { # 0) skip if online; @@ -85,7 +85,7 @@ testthat::test_that( testthat::test_that( - desc = "availablePairs on Bitmart returns a vector of characters, with lenght > 1", + desc = "Test that available_tickers from bitmart returns a non-empty vector", code = { # 0) skip if online; @@ -128,7 +128,7 @@ testthat::test_that( testthat::test_that( - desc = "availablePairs on Kucoin returns a vector of characters, with lenght > 1", + desc = "Test that available_tickers from kucoin returns a non-empty vector", code = { # 0) skip if online; diff --git a/tests/testthat/test-charting.R b/tests/testthat/test-charting.R index 6c06ecc1..9f316e6b 100644 --- a/tests/testthat/test-charting.R +++ b/tests/testthat/test-charting.R @@ -11,15 +11,18 @@ testthat::test_that( # 1) create chart # with klines test_chart <- chart( - ticker = BTC, + ticker = cryptoQuotes:::control_data$quote, main = kline(), sub = list( volume(), rsi(), macd(), - fgi(index = FGIndex) + smi(), + fgi(index = cryptoQuotes:::control_data$fgindex), + lsr(ratio = cryptoQuotes:::control_data$lsratio) ), indicator = list( + donchian_channel(), dema(), ema(), evwma(), @@ -29,7 +32,8 @@ testthat::test_that( wma(), evwma(), vwap(), - bollinger_bands() + bollinger_bands(), + alma() ) ) @@ -42,9 +46,62 @@ testthat::test_that( # 3) check that its a plotly # object testthat::expect_true( - object = rlang::inherits_any( + object = inherits( x = test_chart, - class = "plotly"), + what = "plotly" + ), + ) + + } +) + + +testthat::test_that( + desc = "Charting with klines and indicators", + code = { + + # 1) create chart + # with klines + test_chart <- chart( + ticker = cryptoQuotes:::control_data$quote, + main = pline(), + sub = list( + volume(), + rsi(), + macd(), + smi(), + fgi(index = cryptoQuotes:::control_data$fgindex), + lsr(ratio = cryptoQuotes:::control_data$lsratio) + ), + indicator = list( + donchian_channel(), + dema(), + ema(), + evwma(), + hma(), + zlema(), + sma(), + wma(), + evwma(), + vwap(), + bollinger_bands(), + alma() + + ) + ) + + # 2) check that there is no erros + testthat::expect_no_error( + test_chart + ) + + # 3) check that its a plotly + # object + testthat::expect_true( + object = inherits( + x = test_chart, + what = "plotly" + ), ) } @@ -58,15 +115,18 @@ testthat::test_that( # 1) create chart # with klines test_chart <- chart( - ticker = BTC, + ticker = cryptoQuotes:::control_data$quote, main = ohlc(), sub = list( volume(), rsi(), macd(), - fgi(index = FGIndex) + smi(), + fgi(index = cryptoQuotes:::control_data$fgindex), + lsr(ratio = cryptoQuotes:::control_data$lsratio) ), indicator = list( + donchian_channel(), dema(), ema(), evwma(), @@ -76,7 +136,8 @@ testthat::test_that( wma(), evwma(), vwap(), - bollinger_bands() + bollinger_bands(), + alma() ) ) @@ -89,9 +150,10 @@ testthat::test_that( # 3) check that its a plotly # object testthat::expect_true( - object = rlang::inherits_any( + object = inherits( x = test_chart, - class = "plotly"), + what = "plotly" + ) ) } @@ -104,7 +166,9 @@ testthat::test_that( set.seed(1903) event_data <- ATOM[ - sample(1:nrow(ATOM), size = 2) + sample( + seq_len(nrow(ATOM)), + size = 2) ] # 1.1) Extract the index @@ -138,7 +202,8 @@ testthat::test_that( event_data$event == 'Buy', yes = 'darkgrey', no = ifelse( - subset(event_data, event == 'Buy')$Close < subset(event_data, event == 'Sell')$Close, + subset(event_data, event == 'Buy')$Close < + subset(event_data, event == 'Sell')$Close, yes = 'green', no = 'red' ) @@ -153,7 +218,7 @@ testthat::test_that( # 2) Chart the the klines # and add the buy and sell events testthat::expect_true( - object = rlang::inherits_any(chart( + object = inherits(chart( ticker = ATOM, main = kline(), sub = list( @@ -168,7 +233,7 @@ testthat::test_that( deficiency = FALSE ) ), - class = "plotly" + what = "plotly" ) ) diff --git a/tests/testthat/test-getFNG.R b/tests/testthat/test-getFNG.R index 96b3b72d..97da18e6 100644 --- a/tests/testthat/test-getFNG.R +++ b/tests/testthat/test-getFNG.R @@ -9,16 +9,17 @@ testthat::test_that( testthat::skip_on_ci() # 2) load FGI - FGI <- get_fgindex( + FGI <- testthat::expect_no_condition(get_fgindex( to = Sys.Date() - 1 ) + ) # 3) test that its an # xts object testthat::expect_true( - object = rlang::inherits_any( + object = inherits( x = FGI, - class = c('xts') + what = c('xts') ) ) diff --git a/tests/testthat/test-getFundingrate.R b/tests/testthat/test-getFundingrate.R index 8f5195e0..bd2139e5 100644 --- a/tests/testthat/test-getFundingrate.R +++ b/tests/testthat/test-getFundingrate.R @@ -32,7 +32,7 @@ testthat::test_that( ) # 1) run without any errors - testthat::expect_no_error( + testthat::expect_no_condition( output <- get_fundingrate( ticker = ticker, source = exchange, @@ -49,10 +49,14 @@ testthat::test_that( year_range <- as.numeric(format(range(zoo::index(output)), "%Y")) # The minimum year has to be greater than 2000 - testthat::expect_gte(min(year_range), expected = 2000, label = error_label) + testthat::expect_gte( + min(year_range), expected = 2000, label = error_label + ) # The maximum year has to be less than the current system year. - testthat::expect_lte(max(year_range), expected = current_year, label = error_label) + testthat::expect_lte( + max(year_range), expected = current_year, label = error_label + ) } diff --git a/tests/testthat/test-getLSRatio.R b/tests/testthat/test-getLSRatio.R index 4afdd402..047f9299 100644 --- a/tests/testthat/test-getLSRatio.R +++ b/tests/testthat/test-getLSRatio.R @@ -43,7 +43,7 @@ testthat::test_that( # 1) get quote without errors # and store - testthat::expect_no_error( + testthat::expect_no_condition( output <- get_lsratio( ticker = ticker, source = exchange, diff --git a/tests/testthat/test-getOpeninterest.R b/tests/testthat/test-getOpeninterest.R index 9f2e1c1f..d37cacce 100644 --- a/tests/testthat/test-getOpeninterest.R +++ b/tests/testthat/test-getOpeninterest.R @@ -10,7 +10,7 @@ testthat::test_that( code = { # Pre-calculate dates - start_date <- Sys.Date() - 7 + start_date <- Sys.Date() - 3 end_date <- Sys.Date() - 1 current_year <- as.numeric(format(Sys.Date(), '%Y')) @@ -25,11 +25,13 @@ testthat::test_that( error_label <- exchange # Run without any errors - testthat::expect_no_error( + testthat::expect_no_condition( output <- get_openinterest( - ticker = "BTCUSDT", + ticker = cryptoQuotes::available_tickers( + source = exchange,futures = TRUE + )[50], source = exchange, - interval = '1d', + interval = '1h', from = start_date, to = end_date ),message = error_label @@ -38,7 +40,7 @@ testthat::test_that( # Check if interval is equal to input interval testthat::expect_equal( object = infer_interval(output), - expected = '1d', + expected = '1h', label = error_label ) @@ -46,10 +48,14 @@ testthat::test_that( year_range <- as.numeric(format(range(zoo::index(output)), "%Y")) # The minimum year has to be greater than 2000 - testthat::expect_gte(min(year_range), expected = 2000, label = error_label) + testthat::expect_gte( + min(year_range), expected = 2000, label = error_label + ) # The maximum year has to be less than the current system year. - testthat::expect_lte(max(year_range), expected = current_year, label = error_label) + testthat::expect_lte( + max(year_range), expected = current_year, label = error_label + ) } } ) diff --git a/tests/testthat/test-getQuote.R b/tests/testthat/test-getQuote.R index 17e6a1ca..28077913 100644 --- a/tests/testthat/test-getQuote.R +++ b/tests/testthat/test-getQuote.R @@ -68,12 +68,17 @@ testthat::test_that( for (interval in intervals) { error_label <- paste( - "Error in get_quote for", exchange, "in", market, "with interval:", interval + "Error in get_quote for", + exchange, + "in", + market, + "with interval:", + interval ) # 1) Return quote on # from exchanges - testthat::expect_no_error( + testthat::expect_no_condition( output <- get_quote( ticker = ticker, source = exchange, diff --git a/tests/testthat/test-infer_interval.R b/tests/testthat/test-infer_interval.R new file mode 100644 index 00000000..d6827c90 --- /dev/null +++ b/tests/testthat/test-infer_interval.R @@ -0,0 +1,107 @@ +# script: test-infer_interval +# author: Serkan Korkmaz, serkor1@duck.com +# date: 2024-05-24 +# objective: Test the infer_interval-function +# and assert that it infers the intervals passed +# into the function. +# script start; + +testthat::test_that( + desc = " + All inferred intervals corresponds + to the actual passed intervals + ", + code = { + + # 1) extract exchanges + exchanges <- suppressMessages( + cryptoQuotes::available_exchanges( + type = "ohlc" + ) + ) + + for (exchange in exchanges) { + + for (lgl in c(TRUE, FALSE)) { + + # 0) extract intervals + # based on exchange and + # market + intervals <- suppressMessages( + cryptoQuotes::available_intervals( + source = exchange, + futures = lgl + ) + ) + + # 1) check if its a character + # vector + testthat::expect_true( + inherits( + intervals, + "character" + ) + ) + + # 2) create a vector + # of TRUE/FALSE values + # based on the inferred interval + lgl_vector <- vapply( + X = intervals, + FUN = function(x) { + + # 2.1) Generate + # date intervals using default_dates + date_interval <- cryptoQuotes:::default_dates( + interval = x, + length = 2 + ) + + # 2.2) extrapolate + # the dates between from and + # to. + dates <- seq( + from = date_interval$from, + to = date_interval$to, + # Add 1 if the interval is days as + # the default_date adds 1 day if chosen + # to avoid errors due to conversion + # on API level + length.out = 2 + as.numeric(x == "1d" | x == "3d") + )[1:2] + + # 2.3) assert that + # the passed interval x is + # equal to the inferred interval + setequal( + x = x, + y = cryptoQuotes:::infer_interval( + x = xts::xts( + x = seq_len(2), + order.by = dates + ) + + ) + ) + + }, + FUN.VALUE = logical(1) + ) + + + testthat::expect_true( + all( + lgl_vector + ) + ) + } + + } + + } +) + +# script end; + + + diff --git a/tests/testthat/test-is-date.R b/tests/testthat/test-is-date.R new file mode 100644 index 00000000..0355cae5 --- /dev/null +++ b/tests/testthat/test-is-date.R @@ -0,0 +1,48 @@ +# script: test is.date-indicator +# author: Serkan Korkmaz, serkor1@duck.com +# date: 2024-05-23 +# objective: This function should verify +# that passed dates can be coerced to date before +# they are passed into the remaining function logic. +# +# It is used in assert in general. +# +# script start; + + +testthat::test_that( + "Test the is.date()-function", { + + # 0) define date-object + # as character + date_object <- "2014-12-29" + + # 1) determine class + # or + testthat::expect_true( + object = cryptoQuotes:::is.date( + x = date_object + ) + ) + + # 2) check if date can be coerced + # to POSITXct + testthat::expect_true( + object = inherits( + x = cryptoQuotes:::coerce_date( + date_object + ), + what = c( + "POSIXct", + "POSIXt" + ) + ) + ) + + } +) + + + + +# script end; diff --git a/tests/testthat/test-kraken.R b/tests/testthat/test-kraken.R new file mode 100644 index 00000000..305d4a41 --- /dev/null +++ b/tests/testthat/test-kraken.R @@ -0,0 +1,237 @@ +# script: Kraken Unit Test +# author: Serkan Korkmaz, serkor1@duck.com +# date: 2024-05-18 +# objective: This unit test is a sample of of the functions +# available in the package for CI/CD. Most tests fails on Github +# because of georestrictions - and this makes the library prone to +# bugs and errors for future contributions. This unit test is a sample test +# to filter errorneous pushses from contributors from the get go. +# +# All tests has to be done locally - but this is an initial security measure +# script start; + +# 1) SPOT +testthat::test_that( + desc = "Test get_quote() for Kraken (SPOT)", + code = { + + # 0) skip if offline + # and on github + testthat::skip_if_offline() + + # 1) get available tickers + testthat::expect_no_condition( + ticker <- cryptoQuotes::available_tickers( + source = "kraken", + futures = FALSE + ) + ) + + # 2) get quote from kraken + testthat::expect_no_condition( + output <- get_quote( + ticker = sample(ticker,size = 1), + source = "kraken", + interval = "1d", + futures = FALSE + ) + ) + + + # 2) test wether the + # ohlc is logical + testthat::expect_true( + all( + output$high >= output$low, + output$open >= output$low, + output$open <= output$high, + output$close >= output$low, + output$close <= output$high + ) + ) + + + # 3) test if dates are reasonable + # within range + date_range <- as.numeric( + format( + range( + zoo::index(output) + ), + format = "%Y" + ) + ) + + testthat::expect_true( + object = all( + min(date_range) >= 2000, + max(date_range) <= as.numeric(format(Sys.Date(), "%Y")) + ) + ) + + } +) + + + + + +# 2) Futures +testthat::test_that( + desc = "Test get_quote() for Kraken (FUTURES)", + code = { + + # 0) skip if offline + # and on github + testthat::skip_if_offline() + + # 1) get available tickers + testthat::expect_no_condition( + ticker <- cryptoQuotes::available_tickers( + source = "kraken", + futures = TRUE + ) + ) + + # 2) get quote from kraken + testthat::expect_no_condition( + output <- get_quote( + ticker = sample(ticker,size = 1), + source = "kraken", + interval = "1d", + futures = TRUE + ) + ) + + + # 2) test wether the + # ohlc is logical + testthat::expect_true( + all( + output$high >= output$low, + output$open >= output$low, + output$open <= output$high, + output$close >= output$low, + output$close <= output$high + ) + ) + + + # 3) test if dates are reasonable + # within range + date_range <- as.numeric( + format( + range( + zoo::index(output) + ), + format = "%Y" + ) + ) + + testthat::expect_true( + object = all( + min(date_range) >= 2000, + max(date_range) <= as.numeric(format(Sys.Date(), "%Y")) + ) + ) + + } +) + +# 2) Long-Short Ration +testthat::test_that( + desc = "Test get_lsr() for Kraken (FUTURES)", + code = { + + # 0) skip if offline + # and on github + testthat::skip_if_offline() + + # 1) get available tickers + testthat::expect_no_condition( + ticker <- cryptoQuotes::available_tickers( + source = "kraken", + futures = TRUE + ) + ) + + # 2) get quote from kraken + testthat::expect_no_condition( + output <- get_lsratio( + ticker = sample(ticker,size = 1), + source = "kraken", + interval = "2d" + ) + ) + + + # 3) test if dates are reasonable + # within range + date_range <- as.numeric( + format( + range( + zoo::index(output) + ), + format = "%Y" + ) + ) + + testthat::expect_true( + object = all( + min(date_range) >= 2000, + max(date_range) <= as.numeric(format(Sys.Date(), "%Y")) + ) + ) + + } +) + +# 3) Open Interest +testthat::test_that( + desc = "Test open_interest() for Kraken (FUTURES)", + code = { + + # 0) skip if offline + # and on github + testthat::skip_if_offline() + + # 1) get available tickers + testthat::expect_no_condition( + ticker <- cryptoQuotes::available_tickers( + source = "kraken", + futures = TRUE + ) + ) + + # 2) get quote from kraken + testthat::expect_no_condition( + output <- get_openinterest( + ticker = sample(ticker,size = 1), + source = "kraken", + interval = "2d" + ) + ) + + + # 3) test if dates are reasonable + # within range + date_range <- as.numeric( + format( + range( + zoo::index(output) + ), + format = "%Y" + ) + ) + + testthat::expect_true( + object = all( + min(date_range) >= 2000, + max(date_range) <= as.numeric(format(Sys.Date(), "%Y")) + ) + ) + + } +) + +# script end; diff --git a/vignettes/articles/00-introduction.Rmd b/vignettes/articles/01-article.Rmd similarity index 67% rename from vignettes/articles/00-introduction.Rmd rename to vignettes/articles/01-article.Rmd index f862b4bd..7df1fdd6 100644 --- a/vignettes/articles/00-introduction.Rmd +++ b/vignettes/articles/01-article.Rmd @@ -1,11 +1,16 @@ --- title: "Cryptocurrency Market Data in R" -subtitle: "The cryptoQuotes way" --- ```{r setup, include=FALSE} knitr::opts_chunk$set( - echo = TRUE + collapse = TRUE, + message = FALSE, + echo = TRUE, + comment = "#>", + out.width = "100%", + out.height = "620px", + fig.align = "center" ) ``` @@ -31,27 +36,28 @@ To get `OHLC` data the `get_quote()`-function is the go-to function, ## SPOT price of ## Bitcoin on the hourly BTC <- get_quote( - ticker = "BTCUSD", - source = "kraken", - futures = FALSE, + ticker = "BTCUSD", + source = "kraken", + futures = FALSE, interval = "1h", - from = Sys.Date() - 1 + from = Sys.Date() - 1 ) ``` -```{r, echo =FALSE, fig.alt="Cryptocurrency Market Data in R"} +```{r, echo = FALSE, fig.alt="Cryptocurrency Market Data in R"} ## print table as a kable ## for a neat presentationb knitr::kable( - caption = 'Hourly Bitcoin OHLC-V data', - align = 'lcccc', + caption = 'Hourly Bitcoin OHLC-V data', + align = 'lcccc', table.attr = "style='width:100%;'", x = data.frame( cbind( - Index = paste(tail(zoo::index(BTC))), + index = paste(tail(zoo::index(BTC))), round(tail(zoo::coredata(BTC)),3) - ),row.names = NULL + ), + row.names = NULL ), format = 'html' ) @@ -67,10 +73,10 @@ One sentiment indicator for Bitcoin is the long-short ratio, which can be retrie ## long-short ratio of ## Bitcoin on the hourly LS_BTC <- get_lsratio( - ticker = "PF_XBTUSD", - source = "kraken", + ticker = "PF_XBTUSD", + source = "kraken", interval = "1h", - from = Sys.Date() - 1 + from = Sys.Date() - 1 ) ``` @@ -79,12 +85,12 @@ LS_BTC <- get_lsratio( ## print table as a kable ## for a neat presentationb knitr::kable( - caption = 'Hourly Bitcoin OHLC-V data', - align = 'lcccc', + caption = 'Hourly Long-Short Ratio on Bitcoin', + align = 'lcccc', table.attr = "style='width:100%;'", x = data.frame( cbind( - Index = paste(tail(zoo::index(LS_BTC))), + index = paste(tail(zoo::index(LS_BTC))), round(tail(zoo::coredata(LS_BTC)),3) ),row.names = NULL ), @@ -93,24 +99,28 @@ knitr::kable( ``` - ## Limitations -There is a limit to the amount of market data that can be extracted in one call. The [Kraken](https://www.kraken.com/) exchange, for example, has a limit on `720` rows of data per call in the spot market, +There is a limit to the amount of market data that can be extracted in one call. The [Kraken](https://www.kraken.com/) exchange, for example, has a limit on `5000` rows of data per call in the futures market, ```{r} ## Get the SPOT ## market for over ## 2000 rows -nrow( - BTC <- get_quote( - ticker = "BTCUSD", - source = "kraken", - futures = FALSE, - interval = "30m", - from = Sys.Date() - 30, - to = Sys.Date() - ) +tryCatch( + get_quote( + ticker = "PF_XBTUSD", + source = "kraken", + futures = TRUE, + interval = "5m", + from = Sys.Date() - 25, + to = Sys.Date() + ), + error = function(error) { + + error + + } ) ``` @@ -120,9 +130,9 @@ If you need more data than this, you need to do multiple calls. One such solutio ## 1) create date ## sequence dates <- seq( - from = as.POSIXct(Sys.Date()), - by = "-30 mins", - length.out = 1440 + from = as.POSIXct(Sys.Date()), + by = "-5 mins", + length.out = 10000 ) ## 2) split the sequence @@ -130,8 +140,8 @@ dates <- seq( ## by assigning numbers ## to each indices of 100 idx <- rep( - x = 1:2, - each = 720 + x = 1:2, + each = 5000 ) ## 3) use the idx to split @@ -145,28 +155,28 @@ split_dates <- split( ## calls in a list ## using lapply ohlc <- lapply( - X = split_dates, + X = split_dates, FUN = function(dates){ - Sys.sleep(1) cryptoQuotes::get_quote( - ticker = "BTCUSD", - source = "kraken", - futures = FALSE, - interval = "30m", - from = min(dates), - to = max(dates) + ticker = "PF_XBTUSD", + source = "kraken", + futures = TRUE, + interval = "5m", + from = min(dates), + to = max(dates) ) - }) + } +) ## 4.1) rbind all ## elements nrow( ohlc <- do.call( - what = rbind, + what = rbind, args = ohlc ) ) diff --git a/vignettes/articles/02-charting.Rmd b/vignettes/articles/02-article.Rmd similarity index 92% rename from vignettes/articles/02-charting.Rmd rename to vignettes/articles/02-article.Rmd index 578376f8..33594943 100644 --- a/vignettes/articles/02-charting.Rmd +++ b/vignettes/articles/02-article.Rmd @@ -1,16 +1,15 @@ --- title: "Interactive Cryptocurrency Charts in R" -subtitle: "The cryptoQuotes way" --- ```{r, include = FALSE} knitr::opts_chunk$set( - collapse = TRUE, - message = FALSE, - comment = "#>", - out.width = "100%", - out.height = "1000", - fig.align = "center" + collapse = TRUE, + message = FALSE, + comment = "#>", + out.width = "100%", + out.height = "620px", + fig.align = "center" ) ``` @@ -28,11 +27,11 @@ Throughout this article we will analyze Bitcoin on the hourly chart called by th ## SPOT price of ## Bitcoin on the hourly BTC <- get_quote( - ticker = "BTCUSD", - source = "kraken", - futures = FALSE, + ticker = "BTCUSD", + source = "kraken", + futures = FALSE, interval = "1h", - from = Sys.Date() - 7 + from = Sys.Date() - 7 ) ``` @@ -148,7 +147,6 @@ event_data <- as.data.frame( # case insensitive event_data$index <- index - # 1.4) add events to the data. # here we use Buys and Sells. event_data$event <- 'Bull Cross' @@ -166,8 +164,8 @@ Finally, the crosses can be plotted using the `chart()` and `addEvents()` functi ## and the Bollinger Bands ## in a candlestick chart chart( - ticker = BTC, - main = kline(), + ticker = BTC, + main = kline(), indicator = list( bollinger_bands(), sma(n = 7), diff --git a/vignettes/articles/03-timezones.Rmd b/vignettes/articles/03-article.Rmd similarity index 89% rename from vignettes/articles/03-timezones.Rmd rename to vignettes/articles/03-article.Rmd index 5d8d62ce..ba5ff2b2 100644 --- a/vignettes/articles/03-timezones.Rmd +++ b/vignettes/articles/03-article.Rmd @@ -4,8 +4,13 @@ title: "Time Zones" ```{r setup, include=FALSE} knitr::opts_chunk$set( - echo = TRUE, - message = FALSE + collapse = TRUE, + message = FALSE, + echo = TRUE, + comment = "#>", + out.width = "100%", + out.height = "620px", + fig.align = "center" ) ``` @@ -60,11 +65,11 @@ BTC_utc <- get_quote( In each case the returned `index` is, alongside the OHLC-V data, different, -```{r,echo=FALSE} +```{r, echo=FALSE} # 1) create a kable # and print knitr::kable( - caption = 'Time zone comparsion', + caption = 'Time zone comparsion', align = 'lr', table.attr = "style='width:100%;'", col.names = c('BTC_local', 'BTC_utc'), @@ -95,11 +100,11 @@ BTC_tzone <- BTC_utc xts::tzone(BTC_tzone) <- "UTC" ``` -```{r,echo=FALSE} +```{r, echo=FALSE} # 1) create a kable # and print knitr::kable( - caption = 'Time zone comparsion', + caption = 'Time zone comparsion', align = 'lr', table.attr = "style='width:100%;'", col.names = c('Original Index', 'Converted Index'), diff --git a/vignettes/articles/04-converting.Rmd b/vignettes/articles/04-article.Rmd similarity index 84% rename from vignettes/articles/04-converting.Rmd rename to vignettes/articles/04-article.Rmd index 13478603..978311a0 100644 --- a/vignettes/articles/04-converting.Rmd +++ b/vignettes/articles/04-article.Rmd @@ -1,13 +1,17 @@ --- title: "Converting XTS and ZOO objects" -subtitle: "What about data integrity?" --- ```{r setup, include=FALSE} knitr::opts_chunk$set( - echo = TRUE, - message = FALSE - ) + collapse = TRUE, + message = FALSE, + echo = TRUE, + comment = "#>", + out.width = "100%", + out.height = "620px", + fig.align = "center" +) ``` ```{r, message = FALSE} @@ -31,12 +35,12 @@ library(magrittr) # using as_tibble tbl <- tibble::as_tibble( x = cbind( - Index = zoo::index(ATOM), + index = zoo::index(ATOM), zoo::coredata(ATOM) ) ) %>% dplyr::mutate( - Index = lubridate::as_datetime( - Index + index = lubridate::as_datetime( + index ) ) @@ -55,10 +59,7 @@ DT <- data.table::as.data.table( ATOM ) -# 2) set column name to upper -colnames(DT)[1] <- 'Index' - -# 3) head data +# 2) head data head(DT, 3) ``` @@ -78,16 +79,17 @@ time_objects <- list( # 2) check if they are all equal all( - sapply( - time_objects, - function(x) { + vapply( + X = time_objects, + FUN = function(x) { setequal( x = x, y = zoo::index(ATOM) ) - } + }, + FUN.VALUE = logical(1) ) ) ``` @@ -106,22 +108,22 @@ open_price <- list( # 2) check if they are all equal all( - sapply( - open_price, - function(x) { + vapply( + X = open_price, + FUN = function(x) { setequal( x = x, y = ATOM$Open ) - } + }, + FUN.VALUE = logical(1) ) ) ``` - ## Why even convert? Even though numerical operations on ```xts```-objects are lightning fast (12% faster than ```data.table```), it comes with a cost; it doesn't support ```factors``` or ```characters```. diff --git a/vignettes/articles/05-quantmod.Rmd b/vignettes/articles/05-article.Rmd similarity index 76% rename from vignettes/articles/05-quantmod.Rmd rename to vignettes/articles/05-article.Rmd index 35aa23db..09a94a5c 100644 --- a/vignettes/articles/05-quantmod.Rmd +++ b/vignettes/articles/05-article.Rmd @@ -4,10 +4,13 @@ title: "Cryptocurrency Market Data with quantmod and TTR" ```{r, include = FALSE} knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>", - message = FALSE, - out.width = "100%" + collapse = TRUE, + message = FALSE, + echo = TRUE, + comment = "#>", + out.width = "100%", + out.height = "620px", + fig.align = "center" ) ``` @@ -23,11 +26,11 @@ The `cryptoQuotes` were built with `quantmod` and `TTR` in mind. To demonstrate ## Bitcoin from ## the spot market BTC <- get_quote( - ticker = "BTCUSD", - source = "kraken", - futures = FALSE, - interval= "1d", - from = "2024-01-01" + ticker = "BTCUSD", + source = "kraken", + futures = FALSE, + interval = "1d", + from = "2024-01-01" ) ``` @@ -43,20 +46,23 @@ Below is an example on how to use the `quantmod::tradeModel` with `BTC`, ```{r} ## 1) specify ## the model -BTC_model <- quantmod::specifyModel( - quantmod::Next(quantmod::OpCl(BTC)) ~ quantmod::Lag(quantmod::OpHi(BTC),0:3) - ) +lhs <- quantmod::Next(quantmod::OpCl(BTC)) +rhs <- quantmod::Lag(quantmod::OpHi(BTC),0:3) + +BTC_model <- quantmod::specifyModel( + formula = lhs ~ rhs +) ## 2) build the ## model built_model <- quantmod::buildModel( - x = BTC_model, - method ='lm', + x = BTC_model, + method = 'lm', training.per = range(head(zoo::index(BTC), 10)) - ) +) ## 3) trade the model -quantmod::tradeModel(built_model,leverage=2) +quantmod::tradeModel(built_model, leverage = 2) ``` ### Charting Cryptocurrency with quantmod @@ -66,9 +72,9 @@ quantmod::tradeModel(built_model,leverage=2) ## BTC with candlesticks ## and Bollinger BAnds quantmod::chartSeries( - x = BTC, + x = BTC, type = "candlesticks", - TA = c( + TA = c( quantmod::addBBands() ) ) @@ -108,5 +114,4 @@ knitr::kable( ), format = 'html' ) - ``` diff --git a/vignettes/cryptoQuotes.Rmd b/vignettes/cryptoQuotes.Rmd index 9bee6e2f..e79d7b49 100644 --- a/vignettes/cryptoQuotes.Rmd +++ b/vignettes/cryptoQuotes.Rmd @@ -1,172 +1,177 @@ --- -title: "cryptoQuotes: Cryptocurrency Market Data in R" -subtitle: "What happens when Elon Musk Tweets about Dogecoin?" +title: "Introduction: Cryptocurrency Market Data in R" output: rmarkdown::html_vignette -always_allow_html: true vignette: > - %\VignetteIndexEntry{cryptoQuotes: Cryptocurrency Market Data in R} + %\VignetteIndexEntry{Introduction: Cryptocurrency Market Data in R} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- - + ```{r, include = FALSE} knitr::opts_chunk$set( - collapse = FALSE, - out.width = "100%", - comment = "#>", - message = FALSE + collapse = TRUE, + comment = "#>", + out.width = "100%", + out.height = "680", + fig.align = "center" ) ``` -```{css, echo=FALSE} -body, .main-container, .container-fluid { - max-width: 920px !important; /* or a specific pixel width, e.g., 1200px */ - margin-left: auto !important; - margin-right: auto !important; -} -``` - - -```{r, message=FALSE} +```{r setup, message = FALSE} library(cryptoQuotes) ``` -## Introduction +This `vignette` is a short introduction to the `cryptoQuotes`-package, for a more extensive introduction on its usecase and limitations please refer to the [wiki](https://github.com/serkor1/cryptoQuotes/wiki). -This high-level `API`-client provides open access to cryptocurrency market data without relying on low-level coding and `API`-keys. Currently all actively traded cryptocurrencies on either `binance`, `bybit`, `bitmart`, `kucoin` and `kraken` are available. +> **NOTE:** This `vignette` is limited by geolocation due to various country specific +> cryptocurrency laws. The introduction, therefore, is limited to what is available in the US. -In this vignette we will explore a case study to showcase the capabilities of the `cryptoQuotes`-package; how did the `Dogecoin`-market react to Elon Musks following tweet, +Throughout this `vignette` we will explore the Bitcoin market data using the `Kraken` exchange. All available `tickers` and its notation various across exchangs, so if you are unfamiliar with the exchange specific notation please use the `available_intervals()`-functions, -
-```{r, echo=FALSE, out.width="80%", fig.cap="Tweet by Elon Musk - the timezone is CET.",fig.align='center'} -## include tweet from -## Elon Musk -knitr::include_graphics( - path = "elonTweet.png" +```{r} +# show a sample of +# the available tickers +sample( + x = available_tickers( + source = "kraken", + futures = FALSE + ), + size = 5 ) ``` -
-## Cryptocurrency Market Analysis in R +These available tickers can be passed into the `ticker`-argument of all the `get_*`-functions with the appropriate `source` and `futures`-argument which, in this case, is `kraken` and `FALSE`. -Elon Musk tweeted (Well, now he X'ed) about `Dogecoin` January 14, 06.18 AM (UTC) - and `Dogecoin` rallied. To determine how fast the markets reacted to his tweets, we could get the market data for Dogecoin in 1 minute intervals the day he tweeeted using the ```getQuotes()```, +## Cryptocurrency market data in R +### Open, High, Low, Close an Volume +We will extract the Bitcoin market data in `hourly` intervals, and store it as `BTC`, ```{r} -## DOGEUSDT the day -## of the tweet on the -## 1m chart -DOGE <- cryptoQuotes::get_quote( - ticker = 'DOGE-USDT', - interval = '1m', - source = 'kucoin', - futures = FALSE, - from = '2022-01-14 07:00:00', - to = '2022-01-14 08:00:00' +## extract Bitcoin +## market on the hourly +## chart +BTC <- get_quote( + ticker = "XBTUSDT", + source = "kraken", + futures = FALSE, + interval = "1h" ) ``` -This returns an object of class `r paste(class(DOGE),collapse = ' and ')` with `r nrow(DOGE)` rows. To calculate the rally within the first minute of the tweet, we can use `xts`-syntax to determine the how much it rallied, +```{r, echo=FALSE} +tail( + BTC +) +``` +The market data can be extracted in different intervals using the `interval`-argument. To see available intervals, the `available_intervals()`-function can be used, ```{r} -## extrat the -## tweet moment -tweet_moment <- DOGE["2022-01-14 07:18:00"] - -## calculate -## rally -cat( - "Doge closed:", round((tweet_moment$close/tweet_moment$open - 1),4) * 100, "%" +## get available +## intervals for OHLC +## on Kraken +available_intervals( + source = "kraken", + type = "ohlc", + futures = FALSE ) ``` +### Sentiment Data -`Dogecoin` rallied `r paste0(round((tweet_moment$close/tweet_moment$open - 1),4) * 100, "%")` within the minute Elon Musk tweeted. - -### Charting price action with candlesticks +To put the Bitcoin price action in perspective, an interesting sentiment indicator like the `long` to `short` ratio can be extracted, -We can illustrate this with candlestick charts using the ```chart()```- and ```kline()```-function, - -```{r, fig.align='center', out.height=800} -## chart the -## price action -## using klines -cryptoQuotes::chart( - ticker = DOGE, - main = cryptoQuotes::kline(), - sub = list( - cryptoQuotes::volume() - ), - options = list( - dark = FALSE +```{r} +## extract long-short +## ratio on Bitcoin +## using the hourly chart +LS_BTC <- try( + get_lsratio( + ticker = "XBTUSDT", + source = "kraken", + interval = "1h" ) ) ``` -### Charting price action with event lines +This gives an `error`. The source of the error is the ticker-naming convention; as the `long` to `short` ratio is specific to the perpetual futures market, and the current ticker is specific to the spot-market, the endpoint throws an error. -To create a, presumably, better visual overview we can add event lines using the ```event_data```-argument, which takes a ```data.frame``` of any kind as argument, +To circumvent this, we can either use perpetual futures throughout the `script`, or modify the `ticker`-argument as follows, ```{r} -## 1) create event data.frame -## by subsetting the data -event_data <- as.data.frame( - zoo::coredata( - DOGE["2022-01-14 07:18:00"] - ) +## extract long-short +## ratio on Bitcoin +## using the hourly chart +LS_BTC <- get_lsratio( + ticker = "PF_XBTUSD", + source = "kraken", + interval = "1h" ) +``` -## 1.1) add the index -## to the event_data -event_data$index <- zoo::index( - DOGE["2022-01-14 07:18:00"] +```{r, echo=FALSE} +tail( + LS_BTC ) +``` -# 1.2) add event label -# to the data -event_data$event <- 'Elon Musk Tweets' +The `ticker` specific to the perpetual futures market can be extracted using the `available_tickers` with `futures = TRUE` as follows, -# 1.3) add color to the -# event label -event_data$color <- 'steelblue' +```{r} +# show a sample of +# the available tickers +sample( + x = available_tickers( + source = "kraken", + futures = TRUE + ), + size = 5 +) ``` -This event data, can be passed into the chart as follows, +## Charting cryptocurrency market data + +The Bitcoin market data can be charted using the `chart()`-function, which uses `plotly` as backend, -```{r, out.height = 800} -## 1) create event data.frame -## by subsetting the data -event_data <- as.data.frame( - zoo::coredata( - DOGE["2022-01-14 07:18:00"] +```{r, fig.alt="cryptocurrency market data with R"} +# candlestick chart with +# volume and Long to Short Ratio +chart( + ticker = BTC, + main = kline(), + sub = list( + volume(), + lsr(ratio = LS_BTC) + ), + options = list( + dark = FALSE ) ) +``` -## 1.1) add the index -## to the event_data -event_data$index <- zoo::index( - DOGE["2022-01-14 07:18:00"] -) +### Adding indicators + +The `cryptoQuotes`-package also acts as an API-client to the `TTR`-package, and supports most of its functions. We can add Moving Average indicators, and bollinger bands to the chart using the `indicator`-argument, -# 1.2) add event label -# to the data -event_data$event <- 'Elon Musk Tweets' - -# 1.3) add color to the -# event label -event_data$color <- 'steelblue' - -## 1) chart the -## price action -## using klines -cryptoQuotes::chart( - ticker = DOGE, - event_data = event_data, - main = cryptoQuotes::kline(), - sub = list( - cryptoQuotes::volume() +```{r, fig.alt="cryptocurrency market data with R"} +# candlestick chart with +# volume and Long to Short Ratio +chart( + ticker = BTC, + main = kline(), + sub = list( + volume(), + lsr(ratio = LS_BTC) + ), + indicator = list( + sma(n = 7), + sma(n = 14), + sma(n = 21), + bollinger_bands( + color = "steelblue" + ) ), options = list( dark = FALSE diff --git a/vignettes/custom_indicators.Rmd b/vignettes/custom_indicators.Rmd new file mode 100644 index 00000000..304f56b4 --- /dev/null +++ b/vignettes/custom_indicators.Rmd @@ -0,0 +1,413 @@ +--- +title: "A Guide on Custom Indicators" +subtitle: "How to build and chart it" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{A Guide on Custom Indicators} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + message = FALSE, + comment = "#>", + out.width = "100%", + out.height = "620px" +) +``` + +```{r setup} +library(cryptoQuotes) +``` + +Trading indicators comes in various forms. From the alignment of the moon relative to the sun, to sophisticated trading rules based on neural networks which incorporates classified features. It is not possible to cover them all in an `R` package. + +In this `vignette` an introduction to the construction of charting indicators are given, and is recommended for those who would want to chart indicators not otherwise found in the `cryptoQuotes`-package. + +> **Note:** Feel free to make a `PR` with your indicators that you wish to share with the +> rest of the community. + +## Charting indicators + +Below is a chart, with the indicators `macd()` and `bollinger_bands()`. Each indicator is created using the `TTR`-package. + +```{r} +chart( + ticker = BTC, + main = kline(), + sub = list( + macd() + ), + indicator = list( + bollinger_bands() + ) +) +``` + +### The anatomy of indicators + +Each indicator is either a *main chart*- or *subchart*-indicator, lets call them `classes` for consistency. The source code for each `class` of indicator is given below, + +
+Main chart indicator (Bollinger Bands) +```{r, echo=FALSE} +bollinger_bands +``` +
+ +
+Subchart indicator (MACD) +```{r, echo=FALSE} +macd +``` +
+ +Common for both indicator `classes` is that they are wrapped in `structure`, with `class = c("plotly", "htmlwidget")`, + +```R +structure( + .Data = { + + # Indicator Logic + + }, + class = c( + yourclass, + "plotly", + "htmlwidget" + ) +) +``` + +What differentiates the two `classes` of indicators, is the addition of `indicator` or `subchart` in the `yourclass`-placeholder. + +The indicator logic is important for the correct charting of your custom indicator. As the `cryptoQuotes`-package uses `plotly` as backend for charting, your `class` of indicator has to be consistent with the use of `plotly`-functions. More specifically; `subchart`-indicators uses `plotly::plot_ly()`-functions, while main chart `indicator` uses `add_*`-functions. + +When creating the custom indicators there is a couple of additional steps needed which will be covered in the examples. + +## Donchian Channels (Example) + +Assume a trading strategy based on Donchian Channels (`TTR::DonchianChannel()`) is needed to optimize your profits. This indicator is a main chart indicator, similar to that of `TTR::BBands()`, + +```{r} +tail( + TTR::DonchianChannel( + HL = BTC[,c("high", "low")] + ) +) +``` + +This indicator has three features; `high`, `mid` and `low`. To chart this indicator, we would need to call the `plotly::add_lines()`-function three times to chart it properly. Each of these features are defined as `layers` in the `cryptoQuotes`-package. All layers get built with the `cryptoQuotes:::build()`-function. + +```{r} +## define custom TA +## donchian_channel +donchian_channel <- function( + ## these arguments are the + ## available arguments in the TTR::DonchianChannel + ## function + n = 10, + include.lag = FALSE, + ## the ellipsis + ## is needed to interact with + ## the chart-function + ... +) { + + structure( + .Data = { + + ## 1) define args + ## as a list from the ellipsis + ## which is how the chart-function + ## communicates with the indicators + args <- list( + ... + ) + + ## 2) define the data, which in this + ## case is the indicator. The indicator + ## function streamlines the data so it works + ## with plotly + data <- cryptoQuotes:::indicator( + ## this is just the ticker + ## that is passed into the chart-function + x = args$data, + + ## columns are the columns of the ohlc + ## which the indicator is calculated on + columns = c("high", "low"), + + ## the function itself + ## can be a custom function + ## too. + .f = TTR::DonchianChannel, + + ## all other arguments + ## passed into .f + n = n, + include.lag = FALSE + ) + + ## each layer represents + ## each output from the indicator + ## in this case we have + ## high, mid and low. + ## + ## The lists represents a plotly-function + ## and its associated parameters. + layers <- list( + ## high + list( + type = "add_lines", + params = list( + showlegend = FALSE, + legendgroup = "DC", + name = "high", + inherit = FALSE, + data = data, + x = ~index, + y = ~high, + line = list( + color = "#d38b68", + width = 0.9 + ) + ) + ), + + ## mid + list( + type = "add_lines", + params = list( + showlegend = FALSE, + legendgroup = "DC", + name = "mid", + inherit = FALSE, + data = data, + x = ~index, + y = ~mid, + line = list( + color = "#d38b68", + dash ='dot', + width = 0.9 + ) + ) + ), + + ## low + list( + type = "add_lines", + params = list( + showlegend = FALSE, + legendgroup = "DC", + name = "low", + inherit = FALSE, + data = data, + x = ~index, + y = ~low, + line = list( + color = "#d38b68", + width = 0.9 + ) + ) + ) + ) + + ## we can add ribbons + ## to the main plot to give + ## it a more structured look. + plot <- plotly::add_ribbons( + showlegend = TRUE, + legendgroup = 'DC', + p = args$plot, + inherit = FALSE, + x = ~index, + ymin = ~low, + ymax = ~high, + data = data, + fillcolor = cryptoQuotes:::as_rgb(alpha = 0.1, hex_color = "#d38b68"), + line = list( + color = "transparent" + ), + name = paste0("DC(", paste(c(n), collapse = ", "), ")") + ) + + ## the plot has to be build + ## using the cryptoQuotes::build-function + invisible( + cryptoQuotes:::build( + plot, + layers = layers + ) + ) + + } + ) + +} +``` + +The indicator function can be passed into the appropriate argument in the `chart()`-function, which will handle everything else, + +```{r} +chart( + ticker = BTC, + main = kline(), + sub = list( + volume() + ), + indicator = list( + bollinger_bands(), + donchian_channel() + ) +) +``` + +## Commodity Channel Index (Example) + +Assume a trading strategy based on Commodity Channel Indices (`TTR::CCI()`) is needed to optimize your profits. This indicator is subchart indicator similar to that of `TTR::RSI()`, + +```{r} +tail( + TTR::CCI( + HLC = BTC[,c("high", "low", "close")] + ) +) +``` + +This indicator has a single feature; `cci`. As this indicator is a subchart indicator with a single feature, we only need a single `layer` built with `plot_ly()`, + + +```{r} +## define custom TA +## Commodity Channel Index (CCI) +cc_index <- function( + ## these arguments are the + ## available arguments in the TTR::CCI + ## function + n = 20, + maType, + c = 0.015, + ## the ellipsis + ## is needed to interact with + ## the chart-function + ... +) { + + structure( + .Data = { + + ## 1) define args + ## as a list from the ellipsis + ## which is how the chart-function + ## communicates with the indicators + args <- list( + ... + ) + + ## 2) define the data, which in this + ## case is the indicator. The indicator + ## function streamlines the data so it works + ## with plotly + data <- cryptoQuotes:::indicator( + ## this is just the ticker + ## that is passed into the chart-function + x = args$data, + + ## columns are the columns of the ohlc + ## which the indicator is calculated on + columns = c("high", "low", "close"), + + ## the function itself + ## can be a custom function + ## too. + .f = TTR::CCI, + + ## all other arguments + ## passed into .f + n = n, + maType = maType, + c = c + ) + + + layer <- list( + list( + type = "plot_ly", + params = list( + name = paste0("CCI(", n,")"), + data = data, + showlegend = TRUE, + x = ~index, + y = ~cci, + type = "scatter", + mode = "lines", + line = list( + color = cryptoQuotes:::as_rgb(alpha = 1, hex_color = "#d38b68"), + width = 0.9 + ) + ) + + ) + ) + + cryptoQuotes:::build( + plot = args$plot, + layers = layer, + annotations = list( + list( + text = "Commodity Channel Index", + x = 0, + y = 1, + font = list( + size = 18 + ), + xref = 'paper', + yref = 'paper', + showarrow = FALSE + ) + ) + ) + + + + } + ) + +} +``` + + +```{r} +chart( + ticker = BTC, + main = kline(), + sub = list( + volume(), + cc_index() + ), + indicator = list( + bollinger_bands(), + donchian_channel() + ) +) +``` + +## Summary + +Creating custom indicators for the `chart()`-functions can be daunting. Two examples of how these are developed in th e `cryptoQuotes`-packages have been covered. + +> **Note:** A full pipeline of charting indicators, custom and built-in, will be released sometime in the future. + +To summarise the example, + +1. Define the `indicator`-function (e.g `TTR::CCI()`) +2. Define the `chart`-function for the indicator (e.g `cc_index()`) + 1. Wrap the `indicator`-function in `cryptoQuotes:::indicator()` + 2. Define the `layers` according to features, and wether its a subchart or main chart indicator + 3. Build the chart using `cryptoQuotes:::build()` +3. Add the `chart`-function for the indicator in the appropriate argument in the `chart()`-function + + diff --git a/vignettes/usecase.Rmd b/vignettes/usecase.Rmd new file mode 100644 index 00000000..1dca1834 --- /dev/null +++ b/vignettes/usecase.Rmd @@ -0,0 +1,154 @@ +--- +title: "Usecase" +subtitle: "What happens when Elon Musk Tweets about Dogecoin?" +output: rmarkdown::html_vignette +always_allow_html: true +vignette: > + %\VignetteIndexEntry{Usecase} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = FALSE, + out.width = "100%", + comment = "#>", + message = FALSE, + out.height = "620px", + fig.align = "center" +) +``` + + +```{r, message=FALSE} +library(cryptoQuotes) +``` + +## Introduction + +This high-level `API`-client provides open access to cryptocurrency market data without relying on low-level coding and `API`-keys. Currently all actively traded cryptocurrencies on either `binance`, `bybit`, `bitmart`, `kucoin` and `kraken` are available. + +In this vignette we will explore a case study to showcase the capabilities of the `cryptoQuotes`-package; how did the `Dogecoin`-market react to Elon Musks following tweet, + +
+```{r, echo=FALSE, out.width="80%", fig.cap="Tweet by Elon Musk - the timezone is CET.",fig.align='center'} +## include tweet from +## Elon Musk +knitr::include_graphics( + path = "elonTweet.png" +) +``` +
+ +## Cryptocurrency Market Analysis in R + +Elon Musk tweeted (Well, now he X'ed) about `Dogecoin` January 14, 06.18 AM (UTC) - and `Dogecoin` rallied. To determine how fast the markets reacted to his tweets, we could get the market data for Dogecoin in 1 minute intervals the day he tweeeted using the ```getQuotes()```, + + + +```{r, eval=FALSE} +## DOGEUSDT the day +## of the tweet on the +## 1m chart +DOGE <- cryptoQuotes::get_quote( + ticker = 'DOGE-USDT', + interval = '1m', + source = 'kucoin', + futures = FALSE, + from = '2022-01-14 07:00:00', + to = '2022-01-14 08:00:00' +) +``` + +This returns an object of class `r paste(class(DOGE),collapse = ' and ')` with `r nrow(DOGE)` rows. To calculate the rally within the first minute of the tweet, we can use `xts`-syntax to determine the how much it rallied, + + +```{r} +## extrat the +## tweet moment +tweet_moment <- DOGE["2022-01-14 07:18:00"] + +## calculate +## rally +cat( + "Doge closed:", round((tweet_moment$close/tweet_moment$open - 1),4) * 100, "%" +) +``` + + +`Dogecoin` rallied `r paste0(round((tweet_moment$close/tweet_moment$open - 1),4) * 100, "%")` within the minute Elon Musk tweeted. + +### Charting price action with candlesticks + +We can illustrate this with candlestick charts using the ```chart()```- and ```kline()```-function, + +```{r, fig.align='center', fig.alt= "Elon Musk DOGE"} +## chart the +## price action +## using klines +cryptoQuotes::chart( + ticker = DOGE, + main = cryptoQuotes::kline(), + indicator = list( + cryptoQuotes::bollinger_bands() + ), + sub = list( + cryptoQuotes::volume() + ), + options = list( + dark = FALSE + ) +) +``` + +### Charting price action with event lines + +To create a, presumably, better visual overview we can add event lines using the ```event_data```-argument, which takes a ```data.frame``` of any kind as argument, + +```{r} +## 1) create event data.frame +## by subsetting the data +event_data <- as.data.frame( + zoo::coredata( + DOGE["2022-01-14 07:18:00"] + ) +) + +## 1.1) add the index +## to the event_data +event_data$index <- zoo::index( + DOGE["2022-01-14 07:18:00"] +) + +# 1.2) add event label +# to the data +event_data$event <- 'Elon Musk Tweets' + +# 1.3) add color to the +# event label +event_data$color <- 'steelblue' +``` + +This event data, can be passed into the chart as follows, + +```{r, fig.alt= "Elon Musk DOGE"} +## 1) chart the +## price action +## using klines +cryptoQuotes::chart( + ticker = DOGE, + event_data = event_data, + main = cryptoQuotes::kline(), + indicator = list( + cryptoQuotes::bollinger_bands() + ), + sub = list( + cryptoQuotes::volume() + ), + options = list( + dark = FALSE + ) +) +``` +