Auto stash before rebase of "origin/main"

This commit is contained in:
Miha Kralj
2022-09-03 12:31:06 -07:00
parent 31a92331d4
commit ade6322657
7 changed files with 515 additions and 513 deletions
+125 -124
View File
@@ -1,124 +1,125 @@
namespace QuanTAlib;
using System;
using System.Text.Json;
/* <summary>
Alphavantage - Free API to collect quotes for stock, Forex and crypto. It requires a (free) API key
Get API key at https://www.alphavantage.co/support/#api-key
Parameters:
Symbol: stock ("AAPL"), crypto ("BTC") or forex pair (divided by dash: "USD-EUR")
Extended: if true, return 2,000 rows. if false, return 100 rows
Interval: enum with options of Month, Week, Day, Hour, Min30, Min15, Min5, Min1
APIkey: unique Alphavantage API key
</summary> */
public class Alphavantage_Feed : TBars
{
public enum Interval { Month, Week, Day, Hour, Min30, Min15, Min5, Min1}
public Alphavantage_Feed(string Symbol = "IBM", bool Extended = false, Interval Interval = Interval.Day, string APIkey = "demo")
{
string outputsize = "compact";
if (Extended) { outputsize = "full"; }
System.Net.Http.HttpClient client = new();
JsonElement json = new();
var tokens = Symbol.Split('-');
if (tokens.Length > 1)
{
string req = "https://www.alphavantage.co/query?function=FX" + GetInterval(Interval) + "&from_symbol=" + tokens[0] + "&to_symbol=" + tokens[1] + "&outputsize=" + outputsize + "&apikey=" + APIkey;
var msg = client.GetStringAsync(req).Result;
var jres = JsonSerializer.Deserialize<JsonDocument>(msg).RootElement;
switch (Interval)
{
case Interval.Month: jres.TryGetProperty("Time Series FX (Monthly)", out json); break;
case Interval.Week: jres.TryGetProperty("Time Series FX (Weekly)", out json); break;
case Interval.Day: jres.TryGetProperty("Time Series FX (Daily)", out json); break;
case Interval.Hour: jres.TryGetProperty("Time Series FX (60min)", out json); break;
case Interval.Min30: jres.TryGetProperty("Time Series FX (30min)", out json); break;
case Interval.Min15: jres.TryGetProperty("Time Series FX (15min)", out json); break;
case Interval.Min5: jres.TryGetProperty("Time Series FX (5min)", out json); break;
case Interval.Min1: jres.TryGetProperty("Time Series FX (1min)", out json); break;
}
}
if (json.ValueKind == JsonValueKind.Undefined)
{
string req = "https://www.alphavantage.co/query?function=TIME_SERIES" + GetInterval(Interval) + "&symbol=" + Symbol + "&outputsize=" + outputsize + "&apikey=" + APIkey;
var msg = client.GetStringAsync(req).Result;
var jres = JsonSerializer.Deserialize<JsonDocument>(msg).RootElement;
switch (Interval)
{
case Interval.Month: jres.TryGetProperty("Monthly Time Series", out json); break;
case Interval.Week: jres.TryGetProperty("Weekly Time Series", out json); break;
case Interval.Day: jres.TryGetProperty("Time Series (Daily)", out json); break;
case Interval.Hour: jres.TryGetProperty("Time Series (60min)", out json); break;
case Interval.Min30: jres.TryGetProperty("Time Series (30min)", out json); break;
case Interval.Min15: jres.TryGetProperty("Time Series (15min)", out json); break;
case Interval.Min5: jres.TryGetProperty("Time Series (5min)", out json); break;
case Interval.Min1: jres.TryGetProperty("Time Series (1min)", out json); break;
}
}
if (json.ValueKind == JsonValueKind.Undefined)
{
string req;
if ((int)Interval < 3) { req = "https://www.alphavantage.co/query?function=DIGITAL_CURRENCY" + GetInterval(Interval) + "&symbol=" + Symbol + "&market=USD&&outputsize=" + outputsize + "&apikey=" + APIkey; }
else { req = "https://www.alphavantage.co/query?function=CRYPTO" + GetInterval(Interval) + "&symbol=" + Symbol + "&market=USD&&outputsize=" + outputsize + "&apikey=" + APIkey; }
var msg = client.GetStringAsync(req).Result;
var jres = JsonSerializer.Deserialize<JsonDocument>(msg).RootElement;
switch (Interval)
{
case Interval.Month: jres.TryGetProperty("Time Series (Digital Currency Monthly)", out json); break;
case Interval.Week: jres.TryGetProperty("Time Series (Digital Currency Weekly)", out json); break;
case Interval.Day: jres.TryGetProperty("Time Series (Digital Currency Daily)", out json); break;
case Interval.Hour: jres.TryGetProperty("Time Series Crypto (60min)", out json); break;
case Interval.Min30: jres.TryGetProperty("Time Series Crypto (30min)", out json); break;
case Interval.Min15: jres.TryGetProperty("Time Series Crypto (15min)", out json); break;
case Interval.Min5: jres.TryGetProperty("Time Series Crypto (5min)", out json); break;
case Interval.Min1: jres.TryGetProperty("Time Series Crypto (1min)", out json); break;
}
}
if (json.ValueKind != JsonValueKind.Undefined)
{
foreach (var val in json.EnumerateObject()) { base.Add(GetOHLC(val)); }
}
}
private static (DateTime t, double o, double h, double l, double c, double v) GetOHLC(JsonProperty json)
{
double o, h, l, c, v;
o = h = l = c = v = 0;
DateTime date = Convert.ToDateTime(json.Name);
foreach (var val in json.Value.EnumerateObject())
{
switch (val.Name)
{
case "1. open": o = Convert.ToDouble(val.Value.ToString()); break;
case "1b. open (USD)": o = Convert.ToDouble(val.Value.ToString()); break;
case "2. high": h = Convert.ToDouble(val.Value.ToString()); break;
case "2b. high (USD)": h = Convert.ToDouble(val.Value.ToString()); break;
case "3. low": l = Convert.ToDouble(val.Value.ToString()); break;
case "3b. low (USD)": l = Convert.ToDouble(val.Value.ToString()); break;
case "4. close": c = Convert.ToDouble(val.Value.ToString()); break;
case "4b. close (USD)": c = Convert.ToDouble(val.Value.ToString()); break;
case "5. adjusted close": c = Convert.ToDouble(val.Value.ToString()); break;
case "5. volume": v = Convert.ToDouble(val.Value.ToString()); break;
case "6. volume": v = Convert.ToDouble(val.Value.ToString()); break;
}
}
return (date, o, h, l, c, v);
}
private static string GetInterval(Interval interval = Interval.Day) => interval switch
{
Interval.Month => "_MONTHLY",
Interval.Week => "_WEEKLY",
Interval.Day => "_DAILY",
Interval.Hour => "_INTRADAY&interval=60min",
Interval.Min30 => "_INTRADAY&interval=30min",
Interval.Min15 => "_INTRADAY&interval=15min",
Interval.Min5 => "_INTRADAY&interval=5min",
Interval.Min1 => "_INTRADAY&interval=1min",
_ => "_DAILY"
};
}
namespace QuanTAlib;
using System;
using System.Text.Json;
/* <summary>
Alphavantage - Free API to collect quotes for stock, Forex and crypto. It requires a (free) API key
Get API key at https://www.alphavantage.co/support/#api-key
Parameters:
Symbol: stock ("AAPL"), crypto ("BTC") or forex pair (divided by dash: "USD-EUR")
Extended: if true, return 2,000 rows. if false, return 100 rows
Interval: enum with options of Month, Week, Day, Hour, Min30, Min15, Min5, Min1
APIkey: unique Alphavantage API key
</summary> */
public class Alphavantage_Feed : TBars
{
public enum Interval { Month, Week, Day, Hour, Min30, Min15, Min5, Min1}
public Alphavantage_Feed(string Symbol = "IBM", bool Extended = false, Interval Interval = Interval.Day, string APIkey = "demo")
{
string outputsize = "compact";
if (Extended) { outputsize = "full"; }
System.Net.Http.HttpClient client = new();
JsonElement json = new();
var tokens = Symbol.Split('-');
if (tokens.Length > 1)
{
string req = "https://www.alphavantage.co/query?function=FX" + GetInterval(Interval) + "&from_symbol=" + tokens[0] + "&to_symbol=" + tokens[1] + "&outputsize=" + outputsize + "&apikey=" + APIkey;
var msg = client.GetStringAsync(req).Result;
var jres = JsonSerializer.Deserialize<JsonDocument>(msg).RootElement;
switch (Interval)
{
case Interval.Month: jres.TryGetProperty("Time Series FX (Monthly)", out json); break;
case Interval.Week: jres.TryGetProperty("Time Series FX (Weekly)", out json); break;
case Interval.Day: jres.TryGetProperty("Time Series FX (Daily)", out json); break;
case Interval.Hour: jres.TryGetProperty("Time Series FX (60min)", out json); break;
case Interval.Min30: jres.TryGetProperty("Time Series FX (30min)", out json); break;
case Interval.Min15: jres.TryGetProperty("Time Series FX (15min)", out json); break;
case Interval.Min5: jres.TryGetProperty("Time Series FX (5min)", out json); break;
case Interval.Min1: jres.TryGetProperty("Time Series FX (1min)", out json); break;
}
}
if (json.ValueKind == JsonValueKind.Undefined)
{
string req = "https://www.alphavantage.co/query?function=TIME_SERIES" + GetInterval(Interval) + "&symbol=" + Symbol + "&outputsize=" + outputsize + "&apikey=" + APIkey;
var msg = client.GetStringAsync(req).Result;
var jres = JsonSerializer.Deserialize<JsonDocument>(msg).RootElement;
switch (Interval)
{
case Interval.Month: jres.TryGetProperty("Monthly Time Series", out json); break;
case Interval.Week: jres.TryGetProperty("Weekly Time Series", out json); break;
case Interval.Day: jres.TryGetProperty("Time Series (Daily)", out json); break;
case Interval.Hour: jres.TryGetProperty("Time Series (60min)", out json); break;
case Interval.Min30: jres.TryGetProperty("Time Series (30min)", out json); break;
case Interval.Min15: jres.TryGetProperty("Time Series (15min)", out json); break;
case Interval.Min5: jres.TryGetProperty("Time Series (5min)", out json); break;
case Interval.Min1: jres.TryGetProperty("Time Series (1min)", out json); break;
}
}
if (json.ValueKind == JsonValueKind.Undefined)
{
string req;
if ((int)Interval < 3) { req = "https://www.alphavantage.co/query?function=DIGITAL_CURRENCY" + GetInterval(Interval) + "&symbol=" + Symbol + "&market=USD&&outputsize=" + outputsize + "&apikey=" + APIkey; }
else { req = "https://www.alphavantage.co/query?function=CRYPTO" + GetInterval(Interval) + "&symbol=" + Symbol + "&market=USD&&outputsize=" + outputsize + "&apikey=" + APIkey; }
var msg = client.GetStringAsync(req).Result;
var jres = JsonSerializer.Deserialize<JsonDocument>(msg).RootElement;
switch (Interval)
{
case Interval.Month: jres.TryGetProperty("Time Series (Digital Currency Monthly)", out json); break;
case Interval.Week: jres.TryGetProperty("Time Series (Digital Currency Weekly)", out json); break;
case Interval.Day: jres.TryGetProperty("Time Series (Digital Currency Daily)", out json); break;
case Interval.Hour: jres.TryGetProperty("Time Series Crypto (60min)", out json); break;
case Interval.Min30: jres.TryGetProperty("Time Series Crypto (30min)", out json); break;
case Interval.Min15: jres.TryGetProperty("Time Series Crypto (15min)", out json); break;
case Interval.Min5: jres.TryGetProperty("Time Series Crypto (5min)", out json); break;
case Interval.Min1: jres.TryGetProperty("Time Series Crypto (1min)", out json); break;
}
}
if (json.ValueKind != JsonValueKind.Undefined)
{
foreach (var val in json.EnumerateObject()) { base.Add(GetOHLC(val)); }
}
}
private static (DateTime t, double o, double h, double l, double c, double v) GetOHLC(JsonProperty json)
{
double o, h, l, c, v;
o = h = l = c = v = 0;
DateTime date = Convert.ToDateTime(json.Name);
foreach (var val in json.Value.EnumerateObject())
{
switch (val.Name)
{
case "1. open": o = Convert.ToDouble(val.Value.ToString()); break;
case "1b. open (USD)": o = Convert.ToDouble(val.Value.ToString()); break;
case "2. high": h = Convert.ToDouble(val.Value.ToString()); break;
case "2b. high (USD)": h = Convert.ToDouble(val.Value.ToString()); break;
case "3. low": l = Convert.ToDouble(val.Value.ToString()); break;
case "3b. low (USD)": l = Convert.ToDouble(val.Value.ToString()); break;
case "4. close": c = Convert.ToDouble(val.Value.ToString()); break;
case "4b. close (USD)": c = Convert.ToDouble(val.Value.ToString()); break;
case "5. adjusted close": c = Convert.ToDouble(val.Value.ToString()); break;
case "5. volume": v = Convert.ToDouble(val.Value.ToString()); break;
case "6. volume": v = Convert.ToDouble(val.Value.ToString()); break;
}
}
return (date, o, h, l, c, v);
}
private static string GetInterval(Interval interval = Interval.Day) => interval switch
{
Interval.Month => "_MONTHLY",
Interval.Week => "_WEEKLY",
Interval.Day => "_DAILY",
Interval.Hour => "_INTRADAY&interval=60min",
Interval.Min30 => "_INTRADAY&interval=30min",
Interval.Min15 => "_INTRADAY&interval=15min",
Interval.Min5 => "_INTRADAY&interval=5min",
Interval.Min1 => "_INTRADAY&interval=1min",
_ => "_DAILY"
};
}
+59 -59
View File
@@ -1,60 +1,60 @@
namespace QuanTAlib;
using System;
/* <summary>
GBM - Geometric Brownian Motion is a random simulator of market movement, returning List<Quote>
GBM can be used for testing indicators, validation and Monte Carlo simulations of strategies.
Sample usage:
GBM-Random data = new(); // generates 1 year (252) list of bars
GBM-Random data = new(Bars: 1000); // generates 1,000 bars
GBM-Random data = new(Bars: 252, Volatility: 0.05, Drift: 0.0005, Seed: 100.0)
Parameters
Bars: number of bars (quotes) requested
Volatility: how dymamic/volatile the series should be; default is 1
Drift: incremental drift due to annual interest rate; default is 5%
Seed: starting value of the random series; should not be 0
</summary> */
public class GBM_Feed : TBars
{
double seed;
readonly double drift, volatility;
public GBM_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);
}
namespace QuanTAlib;
using System;
/* <summary>
GBM - Geometric Brownian Motion is a random simulator of market movement, returning List<Quote>
GBM can be used for testing indicators, validation and Monte Carlo simulations of strategies.
Sample usage:
GBM-Random data = new(); // generates 1 year (252) list of bars
GBM-Random data = new(Bars: 1000); // generates 1,000 bars
GBM-Random data = new(Bars: 252, Volatility: 0.05, Drift: 0.0005, Seed: 100.0)
Parameters
Bars: number of bars (quotes) requested
Volatility: how dymamic/volatile the series should be; default is 1
Drift: incremental drift due to annual interest rate; default is 5%
Seed: starting value of the random series; should not be 0
</summary> */
public class GBM_Feed : TBars
{
double seed;
readonly double drift, volatility;
public GBM_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);
}
}
+68 -68
View File
@@ -1,68 +1,68 @@
namespace QuanTAlib;
using System;
/* <summary>
ALMA: Arnaud Legoux Moving Average
The ALMA moving average uses the curve of the Normal (Gauss) distribution, which
can be shifted from 0 to 1. This allows regulating the smoothness and high
sensitivity of the indicator. Sigma is another parameter that is responsible for
the shape of the curve coefficients. This moving average reduces lag of the data
in conjunction with smoothing to reduce noise.
Sources:
https://phemex.com/academy/what-is-arnaud-legoux-moving-averages
https://www.prorealcode.com/prorealtime-indicators/alma-arnaud-legoux-moving-average/
</summary> */
public class ALMA_Series : Single_TSeries_Indicator
{
private readonly System.Collections.Generic.List<double> _buffer = new();
private readonly double[] _weight;
private double _norm;
private readonly double _offset, _sigma;
public ALMA_Series(TSeries source, int period, double offset = 0.85, double sigma = 6.0, bool useNaN = false)
: base(source, period, useNaN)
{
_offset = offset;
_sigma = sigma;
_weight = new double[period];
if (this._data.Count > 0) { base.Add(this._data); }
}
public override void Add((System.DateTime t, double v) TValue, bool update)
{
if (update) { this._buffer[this._buffer.Count - 1] = TValue.v; }
else { this._buffer.Add(TValue.v); }
if (this._buffer.Count > this._p) { this._buffer.RemoveAt(0); }
if (this._buffer.Count <= _p) { calc_weights(); }
double _weightedSum = 0;
for (int i = 0; i < this._buffer.Count; i++) { _weightedSum += _weight[i] * _buffer[i]; }
double _alma = _weightedSum / _norm;
var ret = (TValue.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _alma);
base.Add(ret, update);
}
private void calc_weights()
{
int _len = this._buffer.Count;
_norm = 0;
double _m = _offset * (_len - 1);
double _s = _len / _sigma;
for (int i = 0; i < _len; i++)
{
double _wt = Math.Exp(-((i - _m) * (i - _m)) / (2 * _s * _s));
_weight[i] = _wt;
_norm += _wt;
}
}
}
namespace QuanTAlib;
using System;
/* <summary>
ALMA: Arnaud Legoux Moving Average
The ALMA moving average uses the curve of the Normal (Gauss) distribution, which
can be shifted from 0 to 1. This allows regulating the smoothness and high
sensitivity of the indicator. Sigma is another parameter that is responsible for
the shape of the curve coefficients. This moving average reduces lag of the data
in conjunction with smoothing to reduce noise.
Sources:
https://phemex.com/academy/what-is-arnaud-legoux-moving-averages
https://www.prorealcode.com/prorealtime-indicators/alma-arnaud-legoux-moving-average/
</summary> */
public class ALMA_Series : Single_TSeries_Indicator
{
private readonly System.Collections.Generic.List<double> _buffer = new();
private readonly double[] _weight;
private double _norm;
private readonly double _offset, _sigma;
public ALMA_Series(TSeries source, int period, double offset = 0.85, double sigma = 6.0, bool useNaN = false)
: base(source, period, useNaN)
{
_offset = offset;
_sigma = sigma;
_weight = new double[period];
if (this._data.Count > 0) { base.Add(this._data); }
}
public override void Add((System.DateTime t, double v) TValue, bool update)
{
if (update) { this._buffer[this._buffer.Count - 1] = TValue.v; }
else { this._buffer.Add(TValue.v); }
if (this._buffer.Count > this._p) { this._buffer.RemoveAt(0); }
if (this._buffer.Count <= _p) { calc_weights(); }
double _weightedSum = 0;
for (int i = 0; i < this._buffer.Count; i++) { _weightedSum += _weight[i] * _buffer[i]; }
double _alma = _weightedSum / _norm;
var ret = (TValue.t, this.Count < this._p - 1 && this._NaN ? double.NaN : _alma);
base.Add(ret, update);
}
private void calc_weights()
{
int _len = this._buffer.Count;
_norm = 0;
double _m = _offset * (_len - 1);
double _s = _len / _sigma;
for (int i = 0; i < _len; i++)
{
double _wt = Math.Exp(-((i - _m) * (i - _m)) / (2 * _s * _s));
_weight[i] = _wt;
_norm += _wt;
}
}
}
+2
View File
@@ -0,0 +1,2 @@
//class with customer record
public class customer
+71 -71
View File
@@ -1,72 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Version>0.1.14</Version>
<releaseNotes>
</releaseNotes>
<Title>QuanTAlib</Title>
<Product>Library of Technical Indicators for .NET</Product>
<Description>Quantitative Technical Analysis library for both real-time (streaming) and historical data analysis</Description>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/mihakralj/QuanTAlib</RepositoryUrl>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<Authors>Miha Kralj</Authors>
<Copyright>Miha Kralj</Copyright>
<PackageReadmeFile>readme.md</PackageReadmeFile>
<TargetFrameworks>net7.0;net6.0;netstandard2.0</TargetFrameworks>
<ImplicitUsings>disable</ImplicitUsings>
<LangVersion>preview</LangVersion>
<Nullable>disable</Nullable>
<DisableImplicitNamespaceImports>true</DisableImplicitNamespaceImports>
<NeutralLanguage>en-US</NeutralLanguage>
<RootNamespace>QuanTAlib</RootNamespace>
<AssemblyName>QuanTAlib</AssemblyName>
<IsPublishable>True</IsPublishable>
<PlatformTarget>AnyCPU</PlatformTarget>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<DebugType>embedded</DebugType>
<ProduceReferenceAssembly>True</ProduceReferenceAssembly>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageTags>
Indicators;Stock;Market;Technical;Analysis;Algorithmic;Trading;Trade;Trend;Momentum;Finance;Algorithm;Algo;
AlgoTrading;Financial;Strategy;Chart;Charting;Oscillator;Overlay;Equity;Bitcoin;Crypto;Cryptocurrency;Forex;
Quantitative;Historical;Quotes;
</PackageTags>
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
<PackageLicenseFile></PackageLicenseFile>
<SynchReleaseVersion>false</SynchReleaseVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>full</DebugType>
<Optimize>True</Optimize>
<WarningLevel>7</WarningLevel>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<PlatformTarget>anycpu</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DebugType></DebugType>
<Optimize>True</Optimize>
<WarningLevel>7</WarningLevel>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<PlatformTarget>anycpu</PlatformTarget>
</PropertyGroup>
<PropertyGroup>
<PackageIcon>QuanTAlib2.png</PackageIcon>
<PackageIconUrl>https://raw.githubusercontent.com/mihakralj/QuanTAlib/main/.github/QuanTAlib2.png</PackageIconUrl>
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
</PropertyGroup>
<ItemGroup>
<None Include="..\Docs\readme.md">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
<None Include="..\.github\QuanTAlib2.png">
<Pack>True</Pack>
<Visible>False</Visible>
<PackagePath></PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.Text.Json" Version="7.0.0-preview.4.22229.4" />
</ItemGroup>
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Version>0.1.14</Version>
<releaseNotes>
</releaseNotes>
<Title>QuanTAlib</Title>
<Product>Library of Technical Indicators for .NET</Product>
<Description>Quantitative Technical Analysis library for both real-time (streaming) and historical data analysis</Description>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/mihakralj/QuanTAlib</RepositoryUrl>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<Authors>Miha Kralj</Authors>
<Copyright>Miha Kralj</Copyright>
<PackageReadmeFile>readme.md</PackageReadmeFile>
<TargetFrameworks>net7.0;net6.0;netstandard2.0</TargetFrameworks>
<ImplicitUsings>disable</ImplicitUsings>
<LangVersion>preview</LangVersion>
<Nullable>disable</Nullable>
<DisableImplicitNamespaceImports>true</DisableImplicitNamespaceImports>
<NeutralLanguage>en-US</NeutralLanguage>
<RootNamespace>QuanTAlib</RootNamespace>
<AssemblyName>QuanTAlib</AssemblyName>
<IsPublishable>True</IsPublishable>
<PlatformTarget>AnyCPU</PlatformTarget>
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
<DebugType>embedded</DebugType>
<ProduceReferenceAssembly>True</ProduceReferenceAssembly>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageTags>
Indicators;Stock;Market;Technical;Analysis;Algorithmic;Trading;Trade;Trend;Momentum;Finance;Algorithm;Algo;
AlgoTrading;Financial;Strategy;Chart;Charting;Oscillator;Overlay;Equity;Bitcoin;Crypto;Cryptocurrency;Forex;
Quantitative;Historical;Quotes;
</PackageTags>
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
<PackageLicenseFile></PackageLicenseFile>
<SynchReleaseVersion>false</SynchReleaseVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebugType>full</DebugType>
<Optimize>True</Optimize>
<WarningLevel>7</WarningLevel>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<PlatformTarget>anycpu</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DebugType></DebugType>
<Optimize>True</Optimize>
<WarningLevel>7</WarningLevel>
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
<PlatformTarget>anycpu</PlatformTarget>
</PropertyGroup>
<PropertyGroup>
<PackageIcon>QuanTAlib2.png</PackageIcon>
<PackageIconUrl>https://raw.githubusercontent.com/mihakralj/QuanTAlib/main/.github/QuanTAlib2.png</PackageIconUrl>
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
</PropertyGroup>
<ItemGroup>
<None Include="..\Docs\readme.md">
<Pack>True</Pack>
<PackagePath></PackagePath>
</None>
<None Include="..\.github\QuanTAlib2.png">
<Pack>True</Pack>
<Visible>False</Visible>
<PackagePath></PackagePath>
</None>
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.Text.Json" Version="7.0.0-preview.4.22229.4" />
</ItemGroup>
</Project>
-1
View File
@@ -1 +0,0 @@
+190 -190
View File
File diff suppressed because one or more lines are too long