mirror of
https://github.com/mihakralj/QuanTAlib.git
synced 2026-08-07 13:37:44 +00:00
Version 0.1.17
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<Version>0.1.16</Version>
|
||||
<Version>0.1.17</Version>
|
||||
<releaseNotes>
|
||||
</releaseNotes>
|
||||
<Title>QuanTAlib</Title>
|
||||
|
||||
@@ -1,148 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
},
|
||||
"vscode": {
|
||||
"languageId": "dotnet-interactive.csharp"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<div><div></div><div></div><div><strong>Installed Packages</strong><ul><li><span>QuanTAlib, 0.1.10-beta</span></li><li><span>TALib.NETCore, 0.4.4</span></li></ul></div></div>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"#r \"nuget: TALib.NETCore, 0.4.4\" \n",
|
||||
"#r \"nuget: QuanTAlib, 0.1.10-beta\" \n",
|
||||
"\n",
|
||||
"using QuanTAlib;\n",
|
||||
"using TALib;\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
},
|
||||
"vscode": {
|
||||
"languageId": "dotnet-interactive.csharp"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "Error",
|
||||
"evalue": "(1,1): error CS0246: The type or namespace name 'YAHOO_Feed' could not be found (are you missing a using directive or an assembly reference?)",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"(1,1): error CS0246: The type or namespace name 'YAHOO_Feed' could not be found (are you missing a using directive or an assembly reference?)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"YAHOO_Feed aapl = new(2020,\"AAPL\");\n",
|
||||
"TSeries data = aapl.Close;\n",
|
||||
"\n",
|
||||
"data.Count()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
},
|
||||
"vscode": {
|
||||
"languageId": "dotnet-interactive.csharp"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"int period = 10;\n",
|
||||
"\n",
|
||||
"//QuanTAlib SMA algorithm\n",
|
||||
"SMA_Series e = new(data, period, false); \n",
|
||||
"\n",
|
||||
"// direct call to SMA from TA-LIB - with stitching NaNs in front\n",
|
||||
"int outBegIdx, outNbElement;\n",
|
||||
"double[] output = new double[data.Count];\n",
|
||||
"double[] nans = new double[period];\n",
|
||||
"double[] ta_temp = new double[data.Count-period+1];\n",
|
||||
"Array.Fill(nans, double.NaN);\n",
|
||||
"Core.Sma(data.v.ToArray(), 0, data.Count-1, ta_temp, out outBegIdx, out outNbElement, period); //TA-LIB SMA method\n",
|
||||
"nans.CopyTo(output,0);\n",
|
||||
"ta_temp.CopyTo(output,period-1);\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
},
|
||||
"vscode": {
|
||||
"languageId": "dotnet-interactive.csharp"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"QuantLib\t TA-LIB\n",
|
||||
"164.31\t\t 164.31\n",
|
||||
"166.81\t\t 166.81\n",
|
||||
"169.20\t\t 169.20\n",
|
||||
"171.01\t\t 171.01\n",
|
||||
"172.41\t\t 172.41\n",
|
||||
"173.45\t\t 173.45\n",
|
||||
"174.75\t\t 174.75\n",
|
||||
"175.38\t\t 175.38\n",
|
||||
"175.54\t\t 175.54\n",
|
||||
"\n",
|
||||
"1394\t\t 1394\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"// comparing the tail of QuanTAlib and TA-LIB\n",
|
||||
"Console.Write($\"QuanTAlib\\t TA-LIB\\n\");\n",
|
||||
"for (int i=data.Count-10; i<data.Count-1; i++) \n",
|
||||
" Console.Write($\"{e[i].v:f2}\\t\\t {output[i]:f2}\\n\");\n",
|
||||
"\n",
|
||||
"Console.Write($\"\\n{e.Count()}\\t\\t {output.Length}\\n\");\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": ".NET (C#)",
|
||||
"language": "C#",
|
||||
"name": ".net-csharp"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".cs",
|
||||
"mimetype": "text/x-csharp",
|
||||
"name": "C#",
|
||||
"pygments_lexer": "csharp",
|
||||
"version": "9.0"
|
||||
},
|
||||
"orig_nbformat": 4
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
#!csharp
|
||||
|
||||
#r "nuget:QuanTAlib;"
|
||||
using QuanTAlib;
|
||||
|
||||
#!csharp
|
||||
|
||||
public class GBM1_Feed : TBars
|
||||
{
|
||||
static double seed;
|
||||
readonly double drift, volatility;
|
||||
public GBM1_Feed(int Bars = 252, double Volatility = 1.0, double Drift = 0.05, double Seed = 100.0) {
|
||||
seed = Seed;
|
||||
volatility = Volatility*0.01;
|
||||
drift = Drift*0.01;
|
||||
for (int i = 0; i <Bars; i++) {
|
||||
DateTime Timestamp = DateTime.Today.AddDays(i - Bars);
|
||||
this.Add(Timestamp);
|
||||
}
|
||||
}
|
||||
|
||||
public void Add(DateTime timestamp, bool update = false) {
|
||||
double Open = GBM_value(seed, volatility*volatility, drift);
|
||||
double Close = GBM_value(Open, volatility, drift);
|
||||
|
||||
double OCMax = Math.Max(Open,Close);
|
||||
double High = (GBM_value(seed, volatility*0.5, 0));
|
||||
High = (High<OCMax)? 2*OCMax-High : High;
|
||||
|
||||
double OCMin = Math.Min(Open,Close);
|
||||
double Low = (GBM_value(seed, volatility*0.5, 0));
|
||||
Low = (Low>OCMin)? 2*OCMin-Low : Low;
|
||||
|
||||
double Volume = GBM_value(seed*10, volatility*2, Drift:0);
|
||||
|
||||
base.Add((timestamp, Open, High, Low, Close, Volume), update);
|
||||
seed = Close;
|
||||
}
|
||||
|
||||
private static double GBM_value (double Seed, double Volatility, double Drift) {
|
||||
Random rnd = new((int)(DateTime.UtcNow.Ticks));
|
||||
double U1 = 1.0-rnd.NextDouble();
|
||||
double U2 = 1.0-rnd.NextDouble();
|
||||
double Z = Math.Sqrt(-2.0 * Math.Log(U1)) * Math.Sin(2.0 * Math.PI * U2);
|
||||
return Seed * Math.Exp( Drift - (Volatility*Volatility*0.5) + Volatility * Z);
|
||||
}
|
||||
}
|
||||
|
||||
#!csharp
|
||||
|
||||
GBM1_Feed tqqq = new(30);
|
||||
TSeries data = tqqq.Close;
|
||||
SMA_Series sma = new(data, 5, false);
|
||||
MED_Series med = new(data, 5);
|
||||
WMA_Series wma = new(data, 5, false);
|
||||
EMA_Series ema = new(data, 5, false);
|
||||
HMA_Series hma = new(data, 5, false);
|
||||
DEMA_Series dema = new(data, 5, false);
|
||||
TEMA_Series tema = new(data, 5, false);
|
||||
ZLEMA_Series zlema = new(data, 5, false);
|
||||
JMA_Series jma = new(data, 10, 0.0, false);
|
||||
|
||||
Console.WriteLine($"date\t\t Value\t SMA\t MED\t WMA\t EMA\t HMA\t DEMA\t TEMA \tZLEMA\t JMA");
|
||||
for (int i=0; i < data.Length; i++) {
|
||||
Console.Write($"{data[i].t:yyyy-MM-dd}\t {data[i].v:f2}\t {sma[i].v:f2}\t {med[i].v:f2}\t {wma[i].v:f2}\t {ema[i].v:f2}\t {hma[i].v:f2}\t {dema[i].v:f2}\t {tema[i].v:f2}\t {zlema[i].v:f2}\t {jma[i].v:f2}\n");
|
||||
}
|
||||
@@ -1,305 +0,0 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
},
|
||||
"vscode": {
|
||||
"languageId": "dotnet-interactive.csharp"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<div><div></div><div></div><div></div></div>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"#r \"nuget:YahooFinanceApi;\" \n",
|
||||
"#r \"nuget:QuanTAlib;\" \n",
|
||||
"using YahooFinanceApi;\n",
|
||||
"using QuanTAlib;\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
},
|
||||
"vscode": {
|
||||
"languageId": "dotnet-interactive.csharp"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Date\t\t Value\t SMA\t MAD\t STDDEV\t MSE\t MAPE\n",
|
||||
" 2022-03-14\t 150.62\t 150.62\t 0.00\t 0.00\t 0.00\t 0.00\t\n",
|
||||
"2022-03-15\t 155.09\t 152.85\t 2.24\t 3.16\t 5.00\t 0.01\t\n",
|
||||
"2022-03-16\t 159.59\t 155.10\t 2.99\t 4.49\t 13.41\t 0.02\t\n",
|
||||
"2022-03-17\t 160.62\t 156.48\t 3.62\t 4.59\t 15.77\t 0.02\t\n",
|
||||
"2022-03-18\t 163.98\t 157.98\t 4.10\t 5.20\t 21.62\t 0.03\t\n",
|
||||
"2022-03-21\t 165.38\t 160.93\t 3.00\t 4.03\t 13.02\t 0.02\t\n",
|
||||
"2022-03-22\t 168.82\t 163.68\t 2.86\t 3.72\t 11.10\t 0.02\t\n",
|
||||
"2022-03-23\t 170.21\t 165.80\t 2.97\t 3.84\t 11.78\t 0.02\t\n",
|
||||
"2022-03-24\t 174.07\t 168.49\t 3.05\t 4.01\t 12.84\t 0.02\t\n",
|
||||
"2022-03-25\t 174.72\t 170.64\t 3.00\t 3.86\t 11.92\t 0.02\t\n",
|
||||
"2022-03-28\t 175.60\t 172.68\t 2.54\t 2.98\t 7.12\t 0.01\t\n",
|
||||
"2022-03-29\t 178.96\t 174.71\t 2.06\t 3.14\t 7.90\t 0.01\t\n",
|
||||
"2022-03-30\t 177.77\t 176.22\t 1.71\t 2.07\t 3.43\t 0.01\t\n",
|
||||
"2022-03-31\t 174.61\t 176.33\t 1.63\t 1.94\t 3.01\t 0.01\t\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"TSeries data = new();\n",
|
||||
"var history = await Yahoo.GetHistoricalAsync(\"AAPL\", DateTime.Today.AddDays(-19), DateTime.Now, Period.Daily);\n",
|
||||
"SMA_Series sma = new(data, 5, false);\n",
|
||||
"SUB_Series sub = new(sma.STDDEV,sma.MAD);\n",
|
||||
"Console.Write($\"Date\\t\\t Value\\t SMA\\t MAD\\t STDDEV\\t MSE\\t MAPE\\n \");\n",
|
||||
"foreach (var i in history) {\n",
|
||||
" data.Add((i.DateTime, (double)i.Close));\n",
|
||||
" Console.Write($\"{data[^1].t:yyyy-MM-dd}\\t {(double)data:f2}\\t {(double)sma:f2}\\t {(double)sma.MAD:f2}\\t {(double)sma.STDDEV:f2}\\t {(double)sma.MSE:f2}\\t {(double)sma.MAPE:f2}\\t\\n\");\n",
|
||||
"}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
},
|
||||
"vscode": {
|
||||
"languageId": "dotnet-interactive.csharp"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"date\t\t Value\t SMA\t WMA\t EMA\t HMA\t DEMA\t TEMA \tZLEMA \tJMA\r\n",
|
||||
"2022-03-21\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\t 165.38\n",
|
||||
"2022-03-22\t 168.82\t 167.10\t 167.67\t 166.53\t 166.91\t 167.29\t 167.80\t 167.67\t 168.29\n",
|
||||
"2022-03-23\t 170.21\t 168.14\t 168.94\t 167.75\t 168.52\t 169.08\t 169.80\t 170.13\t 170.00\n",
|
||||
"2022-03-24\t 174.07\t 169.62\t 170.99\t 169.86\t 171.53\t 172.15\t 173.27\t 173.19\t 173.30\n",
|
||||
"2022-03-25\t 174.72\t 170.64\t 172.24\t 171.48\t 174.45\t 174.09\t 175.04\t 175.21\t 174.42\n",
|
||||
"2022-03-28\t 175.60\t 172.68\t 173.89\t 172.85\t 175.90\t 175.51\t 176.18\t 175.85\t 175.23\n",
|
||||
"2022-03-29\t 178.96\t 174.71\t 175.98\t 174.89\t 177.60\t 178.01\t 178.78\t 178.30\t 177.49\n",
|
||||
"2022-03-30\t 177.77\t 176.22\t 177.00\t 175.85\t 178.50\t 178.57\t 178.81\t 178.85\t 177.95\n",
|
||||
"2022-03-31\t 174.61\t 176.33\t 176.46\t 175.44\t 177.08\t 176.98\t 176.35\t 175.98\t 176.09\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"TSeries data = new();\n",
|
||||
"var history = await Yahoo.GetHistoricalAsync(\"AAPL\", DateTime.Today.AddDays(-10), DateTime.Now, Period.Daily);\n",
|
||||
"SMA_Series sma = new(data, 5);\n",
|
||||
"WMA_Series wma = new(data, 5);\n",
|
||||
"EMA_Series ema = new(data, 5);\n",
|
||||
"HMA_Series hma = new(data, 5);\n",
|
||||
"DEMA_Series dema = new(data, 5);\n",
|
||||
"TEMA_Series tema = new(data, 5);\n",
|
||||
"ZLEMA_Series zlema = new(data, 5);\n",
|
||||
"JMA_Series jma = new(data, 5);\n",
|
||||
"\n",
|
||||
"Console.WriteLine($\"date\\t\\t Value\\t SMA\\t WMA\\t EMA\\t HMA\\t DEMA\\t TEMA \\tZLEMA \\tJMA\");\n",
|
||||
"foreach (var i in history) {\n",
|
||||
" data.Add((i.DateTime, (double)i.Close)); // adding data will signal dependant indicators\n",
|
||||
"\n",
|
||||
" Console.Write($\"{data[^1].t:yyyy-MM-dd}\\t {(double)data:f2}\\t {(double)sma:f2}\\t {(double)wma:f2}\\t {(double)ema:f2}\\t {(double)hma:f2}\\t {(double)dema:f2}\\t {(double)tema:f2}\\t {(double)zlema:f2}\\t {(double)jma:f2}\\n\");\n",
|
||||
"}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
},
|
||||
"vscode": {
|
||||
"languageId": "dotnet-interactive.csharp"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table><thead><tr><th><i>index</i></th><th>Item1</th><th>Item2</th></tr></thead><tbody><tr><td>0</td><td><span>2022-03-21 00:00:00Z</span></td><td><div class=\"dni-plaintext\">165.380005</div></td></tr><tr><td>1</td><td><span>2022-03-22 00:00:00Z</span></td><td><div class=\"dni-plaintext\">167.9823694096766</div></td></tr><tr><td>2</td><td><span>2022-03-23 00:00:00Z</span></td><td><div class=\"dni-plaintext\">170.06602047454277</div></td></tr><tr><td>3</td><td><span>2022-03-24 00:00:00Z</span></td><td><div class=\"dni-plaintext\">173.24670154378663</div></td></tr><tr><td>4</td><td><span>2022-03-25 00:00:00Z</span></td><td><div class=\"dni-plaintext\">174.81344756154755</div></td></tr><tr><td>5</td><td><span>2022-03-28 00:00:00Z</span></td><td><div class=\"dni-plaintext\">175.53949324963583</div></td></tr><tr><td>6</td><td><span>2022-03-29 00:00:00Z</span></td><td><div class=\"dni-plaintext\">177.89435364830672</div></td></tr><tr><td>7</td><td><span>2022-03-30 00:00:00Z</span></td><td><div class=\"dni-plaintext\">178.39609966493987</div></td></tr><tr><td>8</td><td><span>2022-03-31 00:00:00Z</span></td><td><div class=\"dni-plaintext\">176.03431272212282</div></td></tr></tbody></table>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"ADD_Series two = new(zlema, jma); // even when indicator is created later, it will grab the data from its source table\n",
|
||||
"DIV_Series mean = new(two, 2); // this pair here calculates mean of ZLEMA and JMA indicators\n",
|
||||
"\n",
|
||||
"mean"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
},
|
||||
"vscode": {
|
||||
"languageId": "dotnet-interactive.csharp"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"public class ALMA_Series : TSeries\n",
|
||||
"{\n",
|
||||
" private readonly int _p;\n",
|
||||
" private readonly bool _NaN;\n",
|
||||
" private readonly TSeries _data;\n",
|
||||
" private readonly double _offset, _sigma;\n",
|
||||
" private double _norm;\n",
|
||||
" private readonly System.Collections.Generic.List<double> _buffer = new();\n",
|
||||
" private readonly System.Collections.Generic.List<double> _weights = new();\n",
|
||||
"\n",
|
||||
" public ALMA_Series(TSeries source, int period, double offset = 0.85, double sigma = 6.0, bool useNaN = false)\n",
|
||||
" {\n",
|
||||
" this._p = period;\n",
|
||||
" this._data = source;\n",
|
||||
" this._NaN = useNaN;\n",
|
||||
" _offset = offset;\n",
|
||||
" _sigma = sigma;\n",
|
||||
"\n",
|
||||
" double _m = _offset * (_p - 1);\n",
|
||||
" double _s = _p / _sigma;\n",
|
||||
"\n",
|
||||
" _norm = 0;\n",
|
||||
" for (int i = 0; i < this._p; i++)\n",
|
||||
" {\n",
|
||||
" double wt = Math.Exp(-((i - _m) * (i - _m)) / (2 * _s * _s));\n",
|
||||
" this._weights.Add(wt);\n",
|
||||
" _norm += wt;\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" source.Pub += this.Sub;\n",
|
||||
" if (source.Count > 0)\n",
|
||||
" {\n",
|
||||
" for (int i = 0; i < source.Count; i++)\n",
|
||||
" {\n",
|
||||
" this.Add(source[i], false);\n",
|
||||
" }\n",
|
||||
" }\n",
|
||||
"\n",
|
||||
" }\n",
|
||||
" public new void Add((System.DateTime t, double v) data, bool update = false)\n",
|
||||
" {\n",
|
||||
" if (update) { this._buffer[this._buffer.Count - 1] = data.v; } else { this._buffer.Add(data.v); }\n",
|
||||
" if (this._buffer.Count > this._p) { this._buffer.RemoveAt(0); }\n",
|
||||
"\n",
|
||||
" double _wma = 0;\n",
|
||||
" for (int i = 0; i < this._buffer.Count; i++) { _wma += this._buffer[i] * this._weights[i]; }\n",
|
||||
" if (this._buffer.Count < this._p) {\n",
|
||||
" _norm = 0;\n",
|
||||
" for (int i = 0; i < this._buffer.Count; i++) { _norm += this._weights[i];}\n",
|
||||
" }\n",
|
||||
" _wma /= _norm;\n",
|
||||
"\n",
|
||||
" (System.DateTime t, double v) result = (data.t, (this.Count < this._p - 1 && this._NaN) ? double.NaN : _wma);\n",
|
||||
" if (update) { base[base.Count - 1] = result; } else { base.Add(result); }\n",
|
||||
" }\n",
|
||||
" public void Add(bool update = false)\n",
|
||||
" {\n",
|
||||
" this.Add(this._data[this._data.Count - 1], update);\n",
|
||||
" }\n",
|
||||
" public new void Sub(object source, TSeriesEventArgs e) { this.Add(this._data[this._data.Count - 1], e.update); }\n",
|
||||
"\n",
|
||||
"}"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
},
|
||||
"vscode": {
|
||||
"languageId": "dotnet-interactive.csharp"
|
||||
}
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"TSeries data = new() {212.80, 214.06, 213.89, 214.66, 213.95, 213.95, 214.55, 214.02, 214.51, 213.75, 214.22, 213.43 };\n",
|
||||
"ALMA_Series alma = new(data, period: 10, offset: 0.0, sigma: 6.0, useNaN: true);\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
},
|
||||
"vscode": {
|
||||
"languageId": "dotnet-interactive.csharp"
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"2022-03-31\t 212.80\t NaN\t \n",
|
||||
"2022-03-31\t 214.06\t NaN\t \n",
|
||||
"2022-03-31\t 213.89\t NaN\t \n",
|
||||
"2022-03-31\t 214.66\t NaN\t \n",
|
||||
"2022-03-31\t 213.95\t NaN\t \n",
|
||||
"2022-03-31\t 213.95\t NaN\t \n",
|
||||
"2022-03-31\t 214.55\t NaN\t \n",
|
||||
"2022-03-31\t 214.02\t NaN\t \n",
|
||||
"2022-03-31\t 214.51\t NaN\t \n",
|
||||
"2022-03-31\t 213.75\t 213.58\t \n",
|
||||
"2022-03-31\t 214.22\t 214.11\t \n",
|
||||
"2022-03-31\t 213.43\t 214.17\t \n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"for (int i=0; i<data.Length; i++) {\n",
|
||||
" Console.Write($\"{data[i].t:yyyy-MM-dd}\\t {(double)data[i].v:f2}\\t {alma[i].v:f2}\\t \\n\");\n",
|
||||
"}"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": ".NET (C#)",
|
||||
"language": "C#",
|
||||
"name": ".net-csharp"
|
||||
},
|
||||
"language_info": {
|
||||
"file_extension": ".cs",
|
||||
"mimetype": "text/x-csharp",
|
||||
"name": "C#",
|
||||
"pygments_lexer": "csharp",
|
||||
"version": "9.0"
|
||||
},
|
||||
"orig_nbformat": 4
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
||||
+1
-1
@@ -38,7 +38,7 @@
|
||||
| ⛔ SKEW - Skewness ||||
|
||||
| ⭐ SDEV - Standard Deviation (Volatility) | SDEV_Series |||
|
||||
| ✔️ SSDEV - Sample Standard Deviation | SSDEV_Series |||
|
||||
| ✔️ SMAPE - Symmetric Mean Absolute Percent Error | SMAPE_Series |||
|
||||
| ✔️ SMAPE - Symmetric Mean Absolute Percent Error | SMAPE_Series |||
|
||||
| ✔️ VAR - Population Variance | VAR_Series |||
|
||||
| ✔️ SVAR - Sample Variance | SVAR_Series |||
|
||||
| ⛔ QUANT - Quantile ||||
|
||||
|
||||
+20
-33
@@ -17,7 +17,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 9,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
@@ -27,32 +27,19 @@
|
||||
}
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<div><div></div><div></div><div></div></div>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"index\t data\t\t sma(data)\t ema(sma(data))\t wma(ema(sma(data)))\n",
|
||||
"0\t 2022-03-23\t 170.21\t\t 170.21\t\t NaN\n",
|
||||
"1\t 2022-03-24\t 172.14\t\t 170.85\t\t NaN\n",
|
||||
"2\t 2022-03-25\t 173.00\t\t 171.57\t\t NaN\n",
|
||||
"3\t 2022-03-28\t 173.65\t\t 172.26\t\t NaN\n",
|
||||
"4\t 2022-03-29\t 174.71\t\t 173.08\t\t 172.07\n",
|
||||
"5\t 2022-03-30\t 176.22\t\t 174.13\t\t 172.92\n",
|
||||
"6\t 2022-03-31\t 176.33\t\t 174.86\t\t 173.74\n",
|
||||
"7\t 2022-04-01\t 176.25\t\t 175.32\t\t 174.46\n",
|
||||
"8\t 2022-04-04\t 176.82\t\t 175.82\t\t 175.09\n",
|
||||
"9\t 2022-04-05\t 176.04\t\t 175.89\t\t 175.51\n",
|
||||
"10\t 2022-04-06\t 174.85\t\t 175.55\t\t 175.62\n",
|
||||
"11\t 2022-04-07\t 174.36\t\t 175.15\t\t 175.51\n"
|
||||
"0\t 2022-11-01\t 150.65\t\t 150.65\t\t NaN\n",
|
||||
"1\t 2022-11-02\t 147.84\t\t 149.25\t\t NaN\n",
|
||||
"2\t 2022-11-03\t 144.85\t\t 147.78\t\t NaN\n",
|
||||
"3\t 2022-11-04\t 143.24\t\t 146.64\t\t NaN\n",
|
||||
"4\t 2022-11-07\t 142.37\t\t 145.79\t\t 147.20\n",
|
||||
"5\t 2022-11-08\t 140.14\t\t 143.91\t\t 145.83\n",
|
||||
"6\t 2022-11-09\t 138.11\t\t 141.97\t\t 144.26\n",
|
||||
"7\t 2022-11-10\t 139.71\t\t 141.22\t\t 142.93\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -60,14 +47,14 @@
|
||||
"#r \"nuget:QuanTAlib;\"\n",
|
||||
"using QuanTAlib;\n",
|
||||
"\n",
|
||||
"YAHOO_Feed aapl = new(15, \"AAPL\");\n",
|
||||
"Yahoo_Feed aapl = new(\"AAPL\", 10);\n",
|
||||
"TSeries data = aapl.Close;\n",
|
||||
"SMA_Series sma = new(source: data, period: 5, useNaN: false);\n",
|
||||
"EMA_Series ema = new(sma, period: 5); // by default, indicators expose all data, no NaN values\n",
|
||||
"WMA_Series wma = new(ema, 5, useNaN: true); // for the final calculation we can hide early data with NaNs\n",
|
||||
"\n",
|
||||
"Console.Write($\"index\\t data\\t\\t sma(data)\\t ema(sma(data))\\t wma(ema(sma(data)))\\n\");\n",
|
||||
"for (int i=0; i<data.Count; i++)\n",
|
||||
"for (int i=0; i<aapl.Count; i++)\n",
|
||||
" Console.Write($\"{i}\\t {data[i].t:yyyy-MM-dd}\\t {sma[i].v:f2}\\t\\t {ema[i].v:f2}\\t\\t {wma[i].v:f2}\\n\");"
|
||||
]
|
||||
},
|
||||
@@ -82,7 +69,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 10,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
@@ -95,7 +82,7 @@
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table><thead><tr><th><i>index</i></th><th>Item1</th><th>Item2</th></tr></thead><tbody><tr><td>0</td><td><span>2022-04-07 00:00:00Z</span></td><td><div class=\"dni-plaintext\">105.3</div></td></tr><tr><td>1</td><td><span>2022-04-07 21:57:46Z</span></td><td><div class=\"dni-plaintext\">293.1</div></td></tr><tr><td>2</td><td><span>2022-04-07 21:57:46Z</span></td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>3</td><td><span>2022-04-04 21:57:46Z</span></td><td><div class=\"dni-plaintext\">10</div></td></tr></tbody></table>"
|
||||
"<table><thead><tr><th><i>index</i></th><th>Item1</th><th>Item2</th></tr></thead><tbody><tr><td>0</td><td><span>2022-11-10 00:00:00Z</span></td><td><div class=\"dni-plaintext\">105.3</div></td></tr><tr><td>1</td><td><span>2022-11-10 15:47:46Z</span></td><td><div class=\"dni-plaintext\">293.1</div></td></tr><tr><td>2</td><td><span>2022-11-10 15:47:46Z</span></td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>3</td><td><span>2022-11-07 15:47:46Z</span></td><td><div class=\"dni-plaintext\">10</div></td></tr></tbody></table>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -124,7 +111,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 11,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
@@ -157,7 +144,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 12,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
@@ -193,7 +180,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 13,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
@@ -206,7 +193,7 @@
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><div class=\"dni-plaintext\">Infinity</div></td></tr><tr><td>1</td><td><div class=\"dni-plaintext\">0.6666666666666666</div></td></tr><tr><td>2</td><td><div class=\"dni-plaintext\">0.3076923076923077</div></td></tr><tr><td>3</td><td><div class=\"dni-plaintext\">0.1951219512195122</div></td></tr><tr><td>4</td><td><div class=\"dni-plaintext\">0.1415929203539823</div></td></tr><tr><td>5</td><td><div class=\"dni-plaintext\">0.11072664359861592</div></td></tr><tr><td>6</td><td><div class=\"dni-plaintext\">0.09078014184397164</div></td></tr><tr><td>7</td><td><div class=\"dni-plaintext\">0.07687687687687687</div></td></tr><tr><td>8</td><td><div class=\"dni-plaintext\">0.06664931007550118</div></td></tr><tr><td>9</td><td><div class=\"dni-plaintext\">0.05881677197013211</div></td></tr><tr><td>10</td><td><div class=\"dni-plaintext\">0.2499389797412741</div></td></tr></tbody></table>"
|
||||
"<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><div class=\"dni-plaintext\">Infinity</div></td></tr><tr><td>1</td><td><div class=\"dni-plaintext\">0.6666666666666666</div></td></tr><tr><td>2</td><td><div class=\"dni-plaintext\">0.3333333333333333</div></td></tr><tr><td>3</td><td><div class=\"dni-plaintext\">0.2</div></td></tr><tr><td>4</td><td><div class=\"dni-plaintext\">0.14285714285714285</div></td></tr><tr><td>5</td><td><div class=\"dni-plaintext\">0.1111111111111111</div></td></tr><tr><td>6</td><td><div class=\"dni-plaintext\">0.09090909090909091</div></td></tr><tr><td>7</td><td><div class=\"dni-plaintext\">0.07692307692307693</div></td></tr><tr><td>8</td><td><div class=\"dni-plaintext\">0.06666666666666667</div></td></tr><tr><td>9</td><td><div class=\"dni-plaintext\">0.058823529411764705</div></td></tr><tr><td>10</td><td><div class=\"dni-plaintext\">0.25</div></td></tr></tbody></table>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -237,7 +224,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 15,
|
||||
"metadata": {
|
||||
"dotnet_interactive": {
|
||||
"language": "csharp"
|
||||
@@ -250,7 +237,7 @@
|
||||
{
|
||||
"data": {
|
||||
"text/html": [
|
||||
"<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>1</td><td><div class=\"dni-plaintext\">0.08934530370370339</div></td></tr><tr><td>2</td><td><div class=\"dni-plaintext\">0.3599908358509947</div></td></tr><tr><td>3</td><td><div class=\"dni-plaintext\">0.5984373224068585</div></td></tr><tr><td>4</td><td><div class=\"dni-plaintext\">0.9604679820661939</div></td></tr><tr><td>5</td><td><div class=\"dni-plaintext\">1.17393637722238</div></td></tr><tr><td>6</td><td><div class=\"dni-plaintext\">1.295101583309171</div></td></tr><tr><td>7</td><td><div class=\"dni-plaintext\">1.5073770108948183</div></td></tr><tr><td>8</td><td><div class=\"dni-plaintext\">1.4718244887751928</div></td></tr><tr><td>9</td><td><div class=\"dni-plaintext\">1.1537265475126177</div></td></tr><tr><td>10</td><td><div class=\"dni-plaintext\">0.8550987734004014</div></td></tr><tr><td>11</td><td><div class=\"dni-plaintext\">0.8650928385987653</div></td></tr><tr><td>12</td><td><div class=\"dni-plaintext\">0.5867583008849087</div></td></tr><tr><td>13</td><td><div class=\"dni-plaintext\">0.15053155636913873</div></td></tr><tr><td>14</td><td><div class=\"dni-plaintext\">-0.13622024638714825</div></td></tr></tbody></table>"
|
||||
"<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>1</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>2</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>3</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>4</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>5</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>6</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>7</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>8</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>9</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>10</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>11</td><td><div class=\"dni-plaintext\">0</div></td></tr><tr><td>12</td><td><div class=\"dni-plaintext\">0.13543589743590018</div></td></tr><tr><td>13</td><td><div class=\"dni-plaintext\">-0.03897954353340993</div></td></tr><tr><td>14</td><td><div class=\"dni-plaintext\">-0.17731008431411102</div></td></tr><tr><td>15</td><td><div class=\"dni-plaintext\">-0.24030671152304095</div></td></tr><tr><td>16</td><td><div class=\"dni-plaintext\">-0.08247055673614988</div></td></tr><tr><td>17</td><td><div class=\"dni-plaintext\">-0.47898448490240814</div></td></tr><tr><td>18</td><td><div class=\"dni-plaintext\">-0.9020715041856615</div></td></tr><tr><td>19</td><td><div class=\"dni-plaintext\">-1.3489730137363423</div></td></tr><tr><td colspan=\"2\"><i>(51 more)</i></td></tr></tbody></table>"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
@@ -258,7 +245,7 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"YAHOO_Feed aapl = new(20, \"AAPL\");\n",
|
||||
"Yahoo_Feed aapl = new(\"AAPL\", 100);\n",
|
||||
"TSeries close = aapl.Close; // close will get data from history\n",
|
||||
"EMA_Series slow = new(close,26); // slow gets data from slow through pub-sub eventing\n",
|
||||
"EMA_Series fast = new(close,12); // fast gets data from slow (via eventing)\n",
|
||||
|
||||
@@ -1,244 +0,0 @@
|
||||
#!csharp
|
||||
|
||||
#r "nuget: Plotly.NET, 2.0.0-preview.18 "
|
||||
#r "nuget: Plotly.NET.Interactive, 2.0.0-preview.18 "
|
||||
#r "nuget: QuanTAlib"
|
||||
|
||||
using Plotly.NET;
|
||||
using Plotly.NET.LayoutObjects;
|
||||
using QuanTAlib;
|
||||
|
||||
List<double> x = new() {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96};
|
||||
List<double> Spike = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||
List<double> Impulse = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
|
||||
List<double> Triangle = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2};
|
||||
List<double> Sawtooth = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
|
||||
List<double> Sine = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0.39,0.56,0.72,0.84,0.93,0.99,1,0.97,0.91,0.81,0.68,0.52,0.33,0.14,-0.06,-0.26,-0.44,-0.61,-0.76,-0.87,-0.95,-0.99,-1,-0.96,-0.88,-0.77,-0.63,-0.46,-0.28,-0.08,0.12,0.31,0.49,0.66,0.79,0.9,0.97,1,0.99,0.94,0.85,0.73,0.58,0.41,0.22,0.02,-0.17,-0.37,-0.54,-0.7,-0.83,-0.92,-0.98,-1,-0.98,-0.92,-0.82,-0.69,-0.54,-0.36,-0.17,0.03,0.23,0.42,0.59,0.74};
|
||||
List<double> Chirp = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0.93,0.27,-0.59,-1,-0.71,0.05,0.75,1,0.67,0,-0.67,-0.99,-0.85,-0.34,0.31,0.81,1,0.82,0.35,-0.22,-0.71,-0.98,-0.95,-0.66,-0.2,0.31,0.72,0.96,0.98,0.78,0.43,-0.01,-0.43,-0.77,-0.96,-0.99,-0.85,-0.58,-0.23,0.16,0.51,0.79,0.95,1,0.92,0.73,0.47,0.15,-0.17,-0.47,-0.72,-0.9,-0.99,-0.99,-0.9,-0.74,-0.52,-0.26,0.01,0.28,0.53,0.73,0.88,0.97,1,0.97};
|
||||
List<double> White = new() {-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,0.03,-0.4,-0.47,0.19,-0.4,-0.23,0.31,0.41,0.19,0.16,-0.5,-0.31,-0.21,0.25,0.18,-0.48,-0.1,0.38,0.29,-0.38,-0.08,-0.21,0.34,0.01,-0.46,0.28,-0.48,0.11,0.02,-0.37,0.19,-0.2,0.1,0.24,0.08,-0.22,-0.12,0.15,0.36,-0.43,-0.03,-0.32,0.45,-0.5,-0.04,-0.04,-0.08,-0.18,0.13,-0.33,-0.19,0.36,-0.39,0.2,-0.31,0.28,-0.13,-0.07,-0.29,0.37,0.03,-0.25,-0.06,-0.3,-0.08,-0.09};
|
||||
List<double> Gauss = new() {-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,0,0.03,0.11,-0.1,-0.43,-0.08,0.36,-0.04,-0.04,-0.21,-0.3,0.26,0.2,0.28,0.2,0.27,-0.01,-0.1,-0.23,-0.13,-0.41,-0.23,-0.07,-0.21,0.32,-0.18,-0.48,0.3,0.46,-0.2,0.52,-0.81,-0.25,-0.21,-0.12,-0.18,0.18,0.52,0.29,0.44,0.18,-1.2,0.38,0.24,0.06,0.28,0.34,0.3,-0.13,0.19,-0.5,0.59,-0.36,0.22,-0.23,0.24,0.39,0.13,-0.33,-0.57,-0.23,0.49,-0.13,0.76,0.59,0.61};
|
||||
List<double> B = new() {-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0.4,-0.4,0,-0.28,0.41,-0.54,0.65,-0.75,0.84,-0.91,0.96,-0.99,1,-0.99,0.96,-0.92,0.85,-0.77,0.67,-0.56,0.44,-0.3,0.17,-0.03,-0.11,0.25,-0.39,0.51,-0.63,0.73,-0.82,0.89,-0.95,0.98,-1,0.99,-0.97,0.93,-0.86,0.78,-0.69,0.58,-0.46,0.33,-0.19,0.05,0.09,-0.23,0.36,-0.49,0.61,-0.71,0.81,-0.88,0.94,-0.98,1,-1,0.98,-0.94,0.88,-0.8,0.71,-0.6,0.48,-0.35,0.22,-0.08,-0.06};
|
||||
List<double> HF = new() {-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,-0.6,0.6,0,0.14,-0.76,-0.96,-0.28,0.66,0.99,0.41,-0.54,-1,-0.54,0.42,0.99,0.65,-0.29,-0.96,-0.75,0.15,0.91,0.84,-0.01,-0.85,-0.91,-0.13,0.76,0.96,0.27,-0.66,-0.99,-0.4,0.55,1,0.53,-0.43,-0.99,-0.64,0.3,0.96,0.75,-0.16,-0.92,-0.83,0.02,0.85,0.9,0.12,-0.77,-0.95,-0.26,0.67,0.99,0.4,-0.56,-1,-0.52,0.44,0.99,0.64,-0.3,-0.97,-0.74,0.17,0.92,0.83,-0.03,-0.86};
|
||||
List<double> ImpulseHF = new() {-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,0.05,-0.25,-0.32,-0.09,0.22,0.33,0.14,-0.18,-0.33,-0.18,0.14,0.33,0.22,-0.1,-0.32,-0.25,0.05,0.3,0.28,0,-0.28,-0.3,-0.04,0.25,0.32,0.09,-0.22,-0.33,-0.13,0.18,0.33,0.18,0.86,0.67,0.79,1.1,1.32,1.25,0.95,0.69,0.72,1.01,1.28,1.3,1.04,0.74,0.68,0.91,1.22,1.33,1.13,0.81,0.67,0.83,1.15,1.33,1.21,0.9,0.68,0.75,1.06,1.31,1.28,0.99,0.71};
|
||||
List<double> SawtoothHF = new() {-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,2.7,-0.8,-0.8,3.6,9.3,11.95,10.05,6.3,5,8.3,14.1,17.95,17.25,13.55,11.2,13.25,18.75,23.55,24.2,20.95,17.75,18.45,23.35,28.8,30.8,28.35,24.7,24.05,28,33.75,37,35.65,31.85,28.05,-3.2,1.5,4.8,3.75,-0.8,-4.6,-4.15,0.1,4.25,4.5,0.6,-3.85,-4.75,-1.3,3.35,4.95,2,-2.8,-5,-2.6,2.2,4.95,3.2,-1.5,-4.85,-3.7,0.85,4.6,4.15,-0.15,-4.3};
|
||||
List<double> SineG = new() {-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0.2,-0.2,0,0,0.59,0.83,0.74,0.5,0.91,1.36,0.93,0.87,0.6,0.38,0.78,0.53,0.42,0.14,0.01,-0.45,-0.71,-0.99,-1,-1.36,-1.22,-1.07,-1.17,-0.56,-0.95,-1.11,-0.16,0.18,-0.28,0.64,-0.5,0.24,0.45,0.67,0.72,1.15,1.52,1.28,1.38,1.03,-0.47,0.96,0.65,0.28,0.3,0.17,-0.07,-0.67,-0.51,-1.33,-0.33,-1.34,-0.78,-1.21,-0.68,-0.43,-0.56,-0.87,-0.93,-0.4,0.52,0.1,1.18,1.18,1.35};
|
||||
List<double> ChirpG = new() {0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,0,0.01,1.3,0.3,-0.48,-1.1,-1.14,-0.03,1.11,0.96,0.63,-0.21,-0.97,-0.73,-0.65,-0.06,0.51,1.08,0.99,0.72,0.12,-0.35,-1.12,-1.21,-1.02,-0.87,0.12,0.13,0.24,1.26,1.44,0.58,0.95,-0.82,-0.68,-0.98,-1.08,-1.17,-0.67,-0.06,0.06,0.6,0.69,-0.41,1.33,1.24,0.98,1.01,0.81,0.45,-0.3,-0.28,-1.22,-0.31,-1.35,-0.77,-1.13,-0.5,-0.13,-0.13,-0.32,-0.29,0.3,1.22,0.75,1.73,1.59,1.58};
|
||||
List<double> Complex = new() {175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.1,175.6,175.44,176.27,176.04,176.99,175.49,175.68,174.34,176.4,174.05,174.4,174.2,176.16,175,177.72,174.33,176.96,174.62,174.76,170.9,171.12,171.05,170.01,169.24,172.64,171.96,175.72,174.16,175.81,177.3,178.38,176.75,177.19,175.55,178.49,176.52,178.45,178.04,178.25,177.8,176.97,172.94,174.92,173.98,172.29,171.19,172.54,172.11,175.32,175.63,176.65,173.8,176.04,172.74,175.24,171.84,171.54,172.17,171.85,172.38,170.78,173.49,173.69,171.71,174.38,173.99,174.83};
|
||||
List<double> Market = new() {68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,68.75,68.25,67.75,67.75,72.75,74.75,72.25,71.25,71.75,72.75,77.75,76,76,76,74.75,75.5,74.75,73.75,74,74.75,72.25,72.5,72.25,74.5,74.75,75.75,75.75,75.75,74.25,73.75,74.75,72,71.75,72.5,72.25,71,72,71.75,71.75,73.25,72.5,73.75,74,76.75,75.75,75,75.75,74.5,74.25,73.5,71.75,70.5,69,70.5,70,68.75,67.25,68.5,70.75,70,70.5,68.25,68.25,68.25,63.75,64.25};
|
||||
|
||||
#!csharp
|
||||
|
||||
TSeries data = new();
|
||||
|
||||
// change these two values - the period and the type of observed indicator
|
||||
// currently available indicators are: DEMA_Series, EMA_Series, HEMA_Series, HMA_Series, JMA_Series, RMA_Series, SMA_Series, TEMA_Series, WMA_Series and ZLEMA_Series
|
||||
int Period = 20;
|
||||
HMA_Series indicator=new(source: data, period: Period);
|
||||
|
||||
//On charts below, blue line is the data input, the green line is a JMA reference
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = Spike;
|
||||
ZLEMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count-1; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("Spike");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = Impulse;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count-1; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("Impulse");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = Triangle;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x, series, false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("Triangle");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = Sawtooth;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("Sawtooth");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = Sine;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("Sine");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = Chirp;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("Chirp");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = White;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("White");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = Gauss;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("Gauss");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = B;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("B");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = HF;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("HF");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = ImpulseHF;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("ImpulseHF");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = SawtoothHF;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("SawtoothHF");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = SineG;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("SineG");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = ChirpG;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("ChirpG");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = Complex;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("Complex");
|
||||
chart
|
||||
|
||||
#!csharp
|
||||
|
||||
var series = Market;
|
||||
data = new();
|
||||
indicator=new(source: data, period: Period);
|
||||
JMA_Series reference = new(source: data, period: Period);
|
||||
for (int i=0; i<x.Count; i++) data.Add(((DateTime.Today.AddDays(-x.Count+i)), series[i]));
|
||||
GenericChart.GenericChart ch1 = Chart2D.Chart.Line<double,double,bool>(x,series,false,"data").WithLineStyle(Width: 1.0, Color: Color.fromString("blue"));
|
||||
GenericChart.GenericChart ch2 = Chart2D.Chart.Line<double,double,bool>(x,indicator.v,false,"sig").WithLineStyle(Width: 2, Color: Color.fromString("red"));
|
||||
GenericChart.GenericChart ch3 = Chart2D.Chart.Line<double,double,bool>(x,reference.v,false,"ref").WithLineStyle(Width: 1.5, Color: Color.fromString("green"));
|
||||
var chart = Chart.Combine(new []{ch1,ch2,ch3}).WithSize(1200,400).WithMargin(Margin.init<int, int, int, int, int, bool>(1,1,60,1,1,false)).WithTitle("Maket");
|
||||
chart
|
||||
File diff suppressed because one or more lines are too long
+171
-11
@@ -14,20 +14,180 @@
|
||||
|
||||
Quantitative TA Library (**QuanTAlib**) is an easy-to-use C# library for quantitative technical analysis with base algorithms, charts, signals and strategies useful for trading securities with [Quantower](https://www.quantower.com/) and other C#-based trading platforms.
|
||||
|
||||
**QuanTAlib** is written with some specific design criteria in mind - this is a list of reasons why there is '_yet another C# TA library_':
|
||||
**QuanTAlib** is written with some specific design criteria in mind - some reasons why there is '_yet another C# TA library_':
|
||||
|
||||
- Written in native C# - no code conversion from TA-LIB or other imported/converted TA libraries
|
||||
- No usage of Decimal datatypes, LINQ, interface abstractions, or static classes (all for performance reasons)
|
||||
- No usage of Decimal datatypes, LINQ, interface abstractions, or static classes with tons of methods (all for performance reasons)
|
||||
- Supports both **historical data analysis** (working on bulk of historical arrays) and **real-time analysis** (adding one data item at the time without the need to re-calculate the whole history)
|
||||
- Separation of calculations (**algos**) and visualizations (**charts**)
|
||||
- Handle early data right - no hiding of poor calculations with NaN values (unless explicitly requested), data is as valid as mathematically possible from the first value
|
||||
- Preservation of time-value integrity of each data throughout the calculation chain (each data point has a timestamp)
|
||||
- Usage of events - each data series is an event publisher, each indicator is a subscriber - this allows seamless data flow between indicators without the need of plumbing (see [MACD example](https://github.com/mihakralj/QuanTAlib/blob/main/docs/macd_example.ipynb) to understand how events allow chaining of indicators)
|
||||
- Calculate early data right - no hiding of incomplete calculations with NaN values (unless explicitly requested with useNan: true), data is as valid as mathematically possible from the first value
|
||||
- Usage of events - each data series is an event publisher, each indicator is a subscriber - this allows seamless data flow between indicators)
|
||||
- Seamlessly integrates with **Polyglot notebooks** (.NET Interactive) and used in Jupyter notebooks - see the examples and documentation.
|
||||
|
||||
QuanTAlib does not provide OHLCV quotes - but it can easily connect to any data feeds. There are some data feed classess
|
||||
available (**RND_Feed** for random OHLCV, **YAHOO_Feed** for Yahoo Finance daily stock data)
|
||||
QuanTAlib does not focus on sources of OHLCV quotes. There are some basic data feeds available to use in learning and strategy exploration: `RND_Feed` and `GBM_Feed` for random data feed, `Yahoo_Feed` and `Alphavantage_Feed` for quick grab of basic daily data of US stock market.
|
||||
|
||||
See [Getting Started](https://github.com/mihakralj/QuanTAlib/blob/main/Docs/getting_started.ipynb) .NET interactive notebook to get a feel how library works. Developers can use QuanTAlib in .NET interactive or in console apps, but the best
|
||||
usage of the library is withing C#-enabled trading platforms - see **QuanTower_Charts** folder for Quantower examples.
|
||||
See [Getting Started](https://github.com/mihakralj/QuanTAlib/blob/main/Docs/getting_started.ipynb) .NET interactive notebook to get a feel how library works. Developers can use QuanTAlib in .NET interactive or in console apps, but the best usage of the library is withing C#-enabled trading platforms - see **QuanTower_Charts** folder for Quantower examples.
|
||||
|
||||
[**List of available and planned indicators**](https://github.com/mihakralj/QuanTAlib/blob/main/docs/coverage.md). **So. Much. To. Do...**
|
||||
# Coverage
|
||||
|
||||
⭐= Calculation is validated against other TA libraries
|
||||
|
||||
✔️= Calculation exists but has no cross-validation tests
|
||||
|
||||
⛔= Not implemented (yet)
|
||||
|
||||
| **BASIC TRANSFORMS** | **QuanTAlib** | **TA-LIB** | **Skender** |
|
||||
|--|:--:|:--:|:--:|
|
||||
| ✔️ OC2 - (Open+Close)/2 |️ `.OC2` || ️`GetBaseQuote` |
|
||||
| ⭐ HL2 - Median Price | `.HL2` | `MEDPRICE` | ️`GetBaseQuote` |
|
||||
| ⭐ HLC3 - Typical Price | `.HLC3` | `TYPPRICE` ||
|
||||
| ✔️ OHL3 - (Open+High+Low)/3 | `.OHL3` |||
|
||||
| ⭐ OHLC4 - Average Price | `.OHLC4` | `AVGPRICE` |️ `GetBaseQuote` |
|
||||
| ⭐ HLCC4 - Weighted Price | `.HLCC4` | `WCLPRICE` ||
|
||||
| ✔️ ZL - De-lagged price (Zero-Lag) | `ZL_Series` |||
|
||||
| ⭐ MAX - Max value | `MAX_Series` | `MAX` ||
|
||||
| ⛔ MID - Midpoint value || `MIDPOINT` ||
|
||||
| ⛔ MIDP - Midpoint price || `MIDPRICE` ||
|
||||
| ⭐ MIN - Min value | `MIN_Series` | `MIN` ||
|
||||
| ⭐ ADD - Addition | `ADD_Series` | `ADD` ||
|
||||
| ⭐ SUB - Subtraction | `SUB_Series` | `SUB` ||
|
||||
| ⭐ MUL - Multiplication | `MUL_Series` | `MUL` ||
|
||||
| ⭐ DIV - Division | `DIV_Series` | `DIV` ||
|
||||
|||||
|
||||
| **STATISTICS & NUMERICAL ANALYSIS** | **QuanTAlib** | **TA-LIB** | **Skender** |
|
||||
| ✔️ BIAS - Bias | BIAS_Series |||
|
||||
| ⛔ CORREL - Pearson's Correlation Coefficient || CORREL | GetCorrelation |
|
||||
| ⛔ COVAR - Covariance ||| GetCorrelation |
|
||||
| ✔️ ENTP - Entropy | ENTP_Series |||
|
||||
| ✔️ KURT - Kurtosis | KURT_Series |||
|
||||
| ⭐ LINREG - Linear Regression | LINREG_Series || GetSlope |
|
||||
| ⭐ MAD - Mean Absolute Deviation | MAD_Series || GetSma |
|
||||
| ⭐ MAPE - Mean Absolute Percent Error | MAPE_Series || GetSma |
|
||||
| ✔️ MED - Median value | MED_Series |||
|
||||
| ✔️ MSE - Mean Squared Error | MSE_Series || GetSma |
|
||||
| ⛔ SKEW - Skewness ||||
|
||||
| ⭐ SDEV - Standard Deviation (Volatility) | SDEV_Series |||
|
||||
| ✔️ SSDEV - Sample Standard Deviation | SSDEV_Series |||
|
||||
| ✔️ SMAPE - Symmetric Mean Absolute Percent Error | SMAPE_Series |||
|
||||
| ✔️ VAR - Population Variance | VAR_Series |||
|
||||
| ✔️ SVAR - Sample Variance | SVAR_Series |||
|
||||
| ⛔ QUANT - Quantile ||||
|
||||
| ✔️ WMAPE - Weighted Mean Absolute Percent Error | WMAPE_Series |||
|
||||
| ⛔ ZSCORE - Number of standard deviations from mean ||||
|
||||
|||||
|
||||
| **TREND INDICATORS & AVERAGES** | **QuanTAlib** | **TA-LIB** | **Skender** |
|
||||
| ⛔ AFIRMA - Autoregressive Finite Impulse Response Moving Average ||||
|
||||
| ⭐ ALMA - Arnaud Legoux Moving Average | ALMA_Series || GetAlma |
|
||||
| ⛔ ARIMA - Autoregressive Integrated Moving Average ||||
|
||||
| ⭐ DEMA - Double EMA Average | DEMA_Series | DEMA | GetDema |
|
||||
| ⭐ EMA - Exponential Moving Average | EMA_Series || GetEma |
|
||||
| ⛔ EPMA - Endpoint Moving Average ||| GetEpma |
|
||||
| ⛔ FWMA - Fibonacci's Weighted Moving Average ||||
|
||||
| ✔️ HEMA - Hull/EMA Average | HEMA_Series |||
|
||||
| ⛔ Hilbert Transform Instantaneous Trendline || HT_TRENDLINE | GetHtTrendline |
|
||||
| ⭐ HMA - Hull Moving Average | HMA_Series || GetHma |
|
||||
| ⛔ HWMA - Holt-Winter Moving Average ||||
|
||||
| ✔️ JMA - Jurik Moving Average | JMA_Series |||
|
||||
| ⭐ KAMA - Kaufman's Adaptive Moving Average | KAMA_Series | KAMA | GetKama |
|
||||
| ⛔ LSMA - Least Squares Moving Average ||||
|
||||
| ⭐ MACD - Moving Average Convergence/Divergence | MACD_Series | MACD | GetMacd |
|
||||
| ⛔ MAMA - MESA Adaptive Moving Average || MAMA | GetMama |
|
||||
| ⛔ MMA - Modified Moving Average ||||
|
||||
| ⛔ PPMA - Pivot Point Moving Average ||||
|
||||
| ⛔ PWMA - Pascal's Weighted Moving Average ||||
|
||||
| ✔️ RMA - WildeR's Moving Average | RMA__Series |||
|
||||
| ⛔ SINWMA - Sine Weighted Moving Average ||||
|
||||
| ⭐ SMA - Simple Moving Average | SMA_Series |||
|
||||
| ⭐ SMMA - Smoothed Moving Average | SMMA_Series |||
|
||||
| ⛔ SSF - Ehler's Super Smoother Filter ||||
|
||||
| ⛔ SUP - Supertrend ||||
|
||||
| ⛔ SWMA - Symmetric Weighted Moving Average ||||
|
||||
| ⛔ T3 - Tillson T3 Moving Average ||||
|
||||
| ⭐ TEMA - Triple EMA Average | TEMA_Series |||
|
||||
| ⛔ TRIMA - Triangular Moving Average ||||
|
||||
| ⛔ VIDYA - Variable Index Dynamic Average ||||
|
||||
| ⭐ WMA - Weighted Moving Average | WMA_Series |||
|
||||
| ✔️ ZLEMA - Zero Lag EMA Average | ZLEMA_Series |||
|
||||
|||||
|
||||
| **VOLATILITY INDICATORS** | **QuanTAlib** | **TA-LIB** | **Skender** |
|
||||
| ⭐ ADL - Chaikin Accumulation Distribution Line | ADL_Series | AD | GetAdl |
|
||||
| ⭐ ADOSC - Chaikin Accumulation Distribution Oscillator | ADOSC_Series | ADOSC| GetAdl |
|
||||
| ⭐ ATR - Average True Range | ATR_Series | ATR | GetAtr |
|
||||
| ⭐ ATRP - Average True Range Percent | ATRP_Series || GetAtr |
|
||||
| ✔️ BETA - Beta coefficient || BETA | GetBeta |
|
||||
| ⭐ BBANDS - Bollinger Bands® | BBANDS_Series | BBANDS | GetBollingerBands |
|
||||
| ⛔ CRSI - Connor RSI ||| GetConnorsRsi |
|
||||
| ⛔ DON - Donchian Channels ||| GetDonchian |
|
||||
| ⛔ FCB - Fractal Chaos Bands ||| GetFcb |
|
||||
| ⛔ HV - Historical Volatility ||||
|
||||
| ⛔ ICH - Ichimoku ||| GetIchimoku |
|
||||
| ⛔ KEL - Keltner Channels ||| GetKeltner |
|
||||
| ⛔ NATR - Normalized Average True Range || NATR | GetAtr |
|
||||
| ⭐ RSI - Relative Strength Index | RSI_Series ||
|
||||
| ⛔ SAR - Parabolic Stop and Reverse || SAR | GetParabolicSar |
|
||||
| ⛔ SRSI - Stochastic RSI ||||
|
||||
| ⛔ STARC - Starc Bands ||||
|
||||
| ⭐ TR - True Range | TR_Series |||
|
||||
| ⛔ UI - Ulcer Index ||||
|
||||
| ⛔ VSTOP - Volatility Stop ||||
|
||||
|||||
|
||||
| **MOMENTUM INDICATORS & OSCILLATORS** | **QuanTAlib** | **TA-LIB** | **Skender** |
|
||||
| ⛔ AC - Acceleration Oscillator ||||
|
||||
| ⛔ ADX - Average Directional Movement Index || ADX | GetAdx |
|
||||
| ⛔ ADXR - Average Directional Movement Index Rating || ADXR | GetAdx |
|
||||
| ⛔ AO - Awesome Oscillator ||| GetAwesome |
|
||||
| ⛔ APO - Absolute Price Oscillator || APO ||
|
||||
| ⛔ AROON - Aroon oscillator || AROON | GetAroon |
|
||||
| ⛔ BOP - Balance of Power || BOP | GetBop |
|
||||
| ⭐ CCI - Commodity Channel Index | CCI_Series | CCI | GetCci |
|
||||
| ⛔ CFO - Chande Forcast Oscillator ||||
|
||||
| ⛔ CMF - Chaikin Money Flow ||||
|
||||
| ⛔ CMO - Chande Momentum Oscillator || CMO | GetCmo |
|
||||
| ⛔ COG - Center of Gravity ||||
|
||||
| ⛔ CTI - Ehler's Correlation Trend Indicator ||||
|
||||
| ⛔ DPO - Detrended Price Oscillator ||| GetDpo |
|
||||
| ⛔ DMI - Directional Movement Index || DX | GetAdx |
|
||||
| ⛔ EFI - Elder Ray's Force Index ||| GetElderRay |
|
||||
| ⛔ GAT - Alligator oscillator ||| GetGator |
|
||||
| ⛔ HURST - Hurst Exponent ||| GetHurst |
|
||||
| ⛔ KRI - Kairi Relative Index ||||
|
||||
| ⛔ KVO - Klinger Volume Oscillator ||||
|
||||
| ⛔ MFI - Money Flow Index || MFI | GetMfi |
|
||||
| ⛔ ROC - Rate of Change (Momentum) || MOM | GetRoc |
|
||||
| ⛔ NVI - Negative Volume Index ||||
|
||||
| ⛔ PO - Price Oscillator ||||
|
||||
| ⛔ PPO - Percentage Price Oscillator || PPO ||
|
||||
| ⛔ PMO - Price Momentum Oscillator ||||
|
||||
| ⛔ PVI - Positive Volume Index ||||
|
||||
| ⛔ RVGI - Relative Vigor Index ||||
|
||||
| ⛔ SMI - Stochastic Momentum Index ||||
|
||||
| ⛔ STOCH - Stochastic Oscillator ||||
|
||||
| ⛔ TRIX - 1-day ROC of TEMA ||||
|
||||
| ⛔ TSI - True Strength Index ||||
|
||||
| ⛔ UO - Ultimate Oscillator ||||
|
||||
| ⛔ WGAT - Williams Alligator ||||
|
||||
|||||
|
||||
| **VOLUME INDICATORS** | **QuanTAlib** | **TA-LIB** | **Skender** |
|
||||
| ⛔ AOBV - Archer On-Balance Volume ||||
|
||||
| ⛔ OBV - On-Balance Volume || OBV | GetObv |
|
||||
| ⛔ PRS - Price Relative Strength |||
|
||||
| ⛔ PVOL - Price-Volume ||||
|
||||
| ⛔ PVO - Percentage Volume Oscillator ||||
|
||||
| ⛔ PVR - Price Volume Rank ||||
|
||||
| ⛔ PVT - Price Volume Trend ||||
|
||||
| ⛔ VP - Volume Profile ||||
|
||||
| ⛔ VWAP - Volume Weighted Average Price ||||
|
||||
| ⛔ VWMA - Volume Weighted Moving Average ||||
|
||||
|||||
|
||||
|**Unsorted** | **QuanTAlib** | **TA-LIB** | **Skender** |
|
||||
| ⛔ CHN - Price Channel ||||
|
||||
| ⛔ COPPOCK - Coppock Curve ||||
|
||||
| ⛔ EOM - Ease of Movement ||||
|
||||
| ⛔ HILO - Gann High-Low Activator ||||
|
||||
| ⛔ HT - HT Trendline ||||
|
||||
| ⛔ MCGD - McGinley Dynamic ||||
|
||||
| ⛔ STC - Schaff Trend Cycle ||||
|
||||
| ⛔ WILLR - Larry Williams' %R ||||
|
||||
| ⛔ VOR - Vortex Indicator ||||
|
||||
| ⛔ PVT - Pivot Points ||||
|
||||
| ⛔ KDJ - KDJ Index ||||
|
||||
| ⛔ CHAND - Chandelier Exit ||||
|
||||
|
||||
Reference in New Issue
Block a user