Documentation

This commit is contained in:
Miha Kralj
2024-10-16 18:28:06 -07:00
parent e5a1948fc0
commit fbe4046b5d
17 changed files with 2619 additions and 286 deletions
+3 -3
View File
@@ -25,7 +25,7 @@ public class BarIndicatorTests
private static readonly ITValue[] indicators = new ITValue[]
{
new Atr(period: 14),
new Jvolty(period: 14)
// Add other TBar-based indicators here
};
@@ -80,14 +80,14 @@ public class BarIndicatorTests
if (methods.Count > 0)
{
// Prefer the method with TBar parameter
var method = methods.FirstOrDefault(m =>
var method = methods.Find(m =>
{
var parameters = m.GetParameters();
return parameters.Length == 1 && parameters[0].ParameterType == typeof(TBar);
});
// If not found, return the first method
return method ?? methods.First();
return method ?? methods[0];
}
type = type.BaseType!;
+1 -2
View File
@@ -13,7 +13,7 @@ namespace QuanTAlib
{
public class QuantowerTests
{
private void TestIndicator<T>(string fieldName = "ma") where T : Indicator, new()
private static void TestIndicator<T>(string fieldName = "ma") where T : Indicator, new()
{
var indicator = new T();
try
@@ -95,7 +95,6 @@ namespace QuanTAlib
// Volatility Indicators
[Fact] public void Atr() => TestIndicator<AtrIndicator>("atr");
[Fact] public void Jvolty() => TestIndicator<JvoltyIndicator>("jvolty");
[Fact] public void Historical() => TestIndicator<HistoricalIndicator>("historical");
[Fact] public void Realized() => TestIndicator<RealizedIndicator>("realized");
-15
View File
@@ -57,21 +57,6 @@ public class VolatilityUpdateTests
Assert.Equal(initialValue, finalValue, precision);
}
[Fact]
public void Jvolty_Update()
{
var indicator = new Jvolty(period: 14);
double initialValue = indicator.Calc(new TBar(DateTime.Now, ReferenceValue, ReferenceValue, ReferenceValue, ReferenceValue, 1000, IsNew: true));
for (int i = 0; i < RandomUpdates; i++)
{
indicator.Calc(GetRandomBar(false));
}
double finalValue = indicator.Calc(new TBar(DateTime.Now, ReferenceValue, ReferenceValue, ReferenceValue, ReferenceValue, 1000, IsNew: false));
Assert.Equal(initialValue, finalValue, precision);
}
[Fact]
public void Realized_Update()
{
+134
View File
@@ -0,0 +1,134 @@
AC,Acceleration Oscillator
AD,Chaikin A/D Line
ADOSC,Chaikin A/D Oscillator
ADL,Accumulation / Distribution Line
ADX,Average Directional Movement Index
ADXR,Average Directional Movement Index Rating
Alligator,Alligator Indicator
ALMA,Arnaud Legoux Moving Average
AO,Awesome Oscillator
APO,Absolute Price Oscillator
AROON,Aroon Indicator
AROONOSC,Aroon Oscillator
ATS,ATR Trailing Stop
ATR,Average True Range
AVGPRICE,Average Price
BB,Bollinger Bands
BBF,Bollinger Bands Flat
BBP,Bull and Bear Power
BC,Beta Coefficient
BETA,Beta
BOP,Balance of Power
CCI,Commodity Channel Index
CE,Chandelier Exit
Channel,Price Channel
CI,Choppiness Index
CMF,Chaikin Money Flow
CMO,Chande Momentum Oscillator
CORREL,Pearson's Correlation Coefficient
CRSI,ConnorsRSI
DC,Donchian Channels
DCP,Dominant Cycle Periods
DEMA,Double Exponential Moving Average
DMI,Directional Movement Index
DPO,Detrended Price Oscillator
DX,Directional Movement Index
EMA,Exponential Moving Average
EPMA,Endpoint Moving Average
ERI,Elder-ray Index
FCB,Fractal Chaos Bands
FI,Force Index
GO,Gator Oscillator
HE,Hurst Exponent
HMA,Hull Moving Average
HT_TRENDLINE,Hilbert Transform - Instantaneous Trendline
HT_TRENDMODE,Hilbert Transform - Trend vs Cycle Mode
HV,Historical Volatility
IC,Ichimoku Cloud
KAMA,Kaufman Adaptive Moving Average
KDJ,KDJ Index
Keltner,Keltner Channel
KVO,Klinger Volume Oscillator
LINEARREG,Linear Regression
LINEARREG_ANGLE,Linear Regression Angle
LINEARREG_INTERCEPT,Linear Regression Intercept
LINEARREG_SLOPE,Linear Regression Slope
LSMA,Least Squares Moving Average
LWMA,Linearly Weighted Moving Average
MACDEXT,MACD with controllable MA type
MACDFIX,Moving Average Convergence Divergence Fix 12/26
MAD,Mean absolute deviation
MAE,Moving Average Envelope
MAMA,MESA Adaptive Moving Average
MAPE,Mean absolute percentage error
MAX,Highest value over a specified period
MAXINDEX,Index of highest value over a specified period
MD,McGinley Dynamic
MEDPRICE,Median Price
MFI,Money Flow Index
MIN,Lowest value over a specified period
MININDEX,Index of lowest value over a specified period
MINMAX,Lowest and highest values over a specified period
MINMAXINDEX,Indexes of lowest and highest values over a period
MMA,Modified Moving Average
MOM,Momentum
MSE,Mean square error
NATR,Normalized Average True Range
OBV,On Balance Volume
OsMA,Moving Average of Oscillator
PAZ,Price Action Zones
Pivots,Pivots
PMO,Price Momentum Oscillator
PP,Pivot Points
PPO,Percentage Price Oscillator
PPMA,Pivot Point Moving Average
PRS,Price Relative Strength
PVI,Positive Volume Index
PVO,Percentage Volume Oscillator
Qstick,Qstick Indicator
R2,R-Squared (Coefficient of Determination)
Regression,Regression Line Indicator
RLW,%R Larry Williams
RMA,Running Moving Average
ROC,Rate of Change
ROCB,ROC with Bands
RPP,Rolling Pivot Points
RRA,Rescaled Range Analysis
RSI,Relative Strength Index
SAR,Parabolic SAR
SAREXT,Parabolic SAR - Extended
SDC,Standard Deviation Channels
SI,Swing Index
SLR,Slope and Linear Regression
SMA,Simple Moving Average
SMI,Stochastic Momentum Index
SMMA,Smoothed Moving Average
ST,SuperTrend
STARC,STARC Bands
STC,Schaff Trend Cycle
STDDEV,Standard Deviation
STOCH,Stochastic
STOCHF,Stochastic Fast
STOCHRSI,Stochastic Relative Strength Index
SUM,Summation
T3,Triple Exponential Moving Average (T3)
TEMA,Triple Exponential Moving Average
TRANGE,True Range
TRIMA,Triangular Moving Average
TRIX,1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
TSI,True Strength Index
TYPPRICE,Typical Price
UI,Ulcer Index
ULTOSC,Ultimate Oscillator
VAR,Variance
VI,Vortex Indicator
Volume,Volume Indicator
VS,Volatility Stop
VWAP,Volume Weighted Average Price
VWMA,Volume Weighted Moving Average
WA,Williams Alligator
WCLPRICE,Weighted Close Price
WF,Williams Fractal
WMA,Weighted Moving Average
ZS,Z-Score
ZZ,ZigZag Indicator
1 AC Acceleration Oscillator
2 AD Chaikin A/D Line
3 ADOSC Chaikin A/D Oscillator
4 ADL Accumulation / Distribution Line
5 ADX Average Directional Movement Index
6 ADXR Average Directional Movement Index Rating
7 Alligator Alligator Indicator
8 ALMA Arnaud Legoux Moving Average
9 AO Awesome Oscillator
10 APO Absolute Price Oscillator
11 AROON Aroon Indicator
12 AROONOSC Aroon Oscillator
13 ATS ATR Trailing Stop
14 ATR Average True Range
15 AVGPRICE Average Price
16 BB Bollinger Bands
17 BBF Bollinger Bands Flat
18 BBP Bull and Bear Power
19 BC Beta Coefficient
20 BETA Beta
21 BOP Balance of Power
22 CCI Commodity Channel Index
23 CE Chandelier Exit
24 Channel Price Channel
25 CI Choppiness Index
26 CMF Chaikin Money Flow
27 CMO Chande Momentum Oscillator
28 CORREL Pearson's Correlation Coefficient
29 CRSI ConnorsRSI
30 DC Donchian Channels
31 DCP Dominant Cycle Periods
32 DEMA Double Exponential Moving Average
33 DMI Directional Movement Index
34 DPO Detrended Price Oscillator
35 DX Directional Movement Index
36 EMA Exponential Moving Average
37 EPMA Endpoint Moving Average
38 ERI Elder-ray Index
39 FCB Fractal Chaos Bands
40 FI Force Index
41 GO Gator Oscillator
42 HE Hurst Exponent
43 HMA Hull Moving Average
44 HT_TRENDLINE Hilbert Transform - Instantaneous Trendline
45 HT_TRENDMODE Hilbert Transform - Trend vs Cycle Mode
46 HV Historical Volatility
47 IC Ichimoku Cloud
48 KAMA Kaufman Adaptive Moving Average
49 KDJ KDJ Index
50 Keltner Keltner Channel
51 KVO Klinger Volume Oscillator
52 LINEARREG Linear Regression
53 LINEARREG_ANGLE Linear Regression Angle
54 LINEARREG_INTERCEPT Linear Regression Intercept
55 LINEARREG_SLOPE Linear Regression Slope
56 LSMA Least Squares Moving Average
57 LWMA Linearly Weighted Moving Average
58 MACDEXT MACD with controllable MA type
59 MACDFIX Moving Average Convergence Divergence Fix 12/26
60 MAD Mean absolute deviation
61 MAE Moving Average Envelope
62 MAMA MESA Adaptive Moving Average
63 MAPE Mean absolute percentage error
64 MAX Highest value over a specified period
65 MAXINDEX Index of highest value over a specified period
66 MD McGinley Dynamic
67 MEDPRICE Median Price
68 MFI Money Flow Index
69 MIN Lowest value over a specified period
70 MININDEX Index of lowest value over a specified period
71 MINMAX Lowest and highest values over a specified period
72 MINMAXINDEX Indexes of lowest and highest values over a period
73 MMA Modified Moving Average
74 MOM Momentum
75 MSE Mean square error
76 NATR Normalized Average True Range
77 OBV On Balance Volume
78 OsMA Moving Average of Oscillator
79 PAZ Price Action Zones
80 Pivots Pivots
81 PMO Price Momentum Oscillator
82 PP Pivot Points
83 PPO Percentage Price Oscillator
84 PPMA Pivot Point Moving Average
85 PRS Price Relative Strength
86 PVI Positive Volume Index
87 PVO Percentage Volume Oscillator
88 Qstick Qstick Indicator
89 R2 R-Squared (Coefficient of Determination)
90 Regression Regression Line Indicator
91 RLW %R Larry Williams
92 RMA Running Moving Average
93 ROC Rate of Change
94 ROCB ROC with Bands
95 RPP Rolling Pivot Points
96 RRA Rescaled Range Analysis
97 RSI Relative Strength Index
98 SAR Parabolic SAR
99 SAREXT Parabolic SAR - Extended
100 SDC Standard Deviation Channels
101 SI Swing Index
102 SLR Slope and Linear Regression
103 SMA Simple Moving Average
104 SMI Stochastic Momentum Index
105 SMMA Smoothed Moving Average
106 ST SuperTrend
107 STARC STARC Bands
108 STC Schaff Trend Cycle
109 STDDEV Standard Deviation
110 STOCH Stochastic
111 STOCHF Stochastic Fast
112 STOCHRSI Stochastic Relative Strength Index
113 SUM Summation
114 T3 Triple Exponential Moving Average (T3)
115 TEMA Triple Exponential Moving Average
116 TRANGE True Range
117 TRIMA Triangular Moving Average
118 TRIX 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
119 TSI True Strength Index
120 TYPPRICE Typical Price
121 UI Ulcer Index
122 ULTOSC Ultimate Oscillator
123 VAR Variance
124 VI Vortex Indicator
125 Volume Volume Indicator
126 VS Volatility Stop
127 VWAP Volume Weighted Average Price
128 VWMA Volume Weighted Moving Average
129 WA Williams Alligator
130 WCLPRICE Weighted Close Price
131 WF Williams Fractal
132 WMA Weighted Moving Average
133 ZS Z-Score
134 ZZ ZigZag Indicator
+313 -5
View File
@@ -1,5 +1,313 @@
# Backlog and done
|**QT**|**Chart**|Cmnt|Docs|isNew|Validation|
|--|:--:|:--:|:--:|:--:|:--:|
|AFIRMA|✔️|||||
| AD | Chaikin A/D Line |
| AROON | Aroon Indicator |
| ADX | Average Directional Movement Index |
| ADXR | Average Directional Movement Index Rating |
| DX | Directional Movement Index |
| SAR | Parabolic SAR |
| SAREXT | Parabolic SAR - Extended |
| HT_TRENDLINE | Hilbert Transform - Instantaneous Trendline |
| HT_TRENDMODE | Hilbert Transform - Trend vs Cycle Mode |
| ZZ | ZigZag Indicator |
| DMI | Directional Movement Index |
| Alligator | Alligator Indicator |
| Regression | Regression Line Indicator |
| SI | Swing Index |
| ATS | ATR Trailing Stop |
| ERI | Elder-ray Index |
| GO | Gator Oscillator |
| HE | Hurst Exponent |
| IC | Ichimoku Cloud |
| ST | SuperTrend |
| VI | Vortex Indicator |
| WA | Williams Alligator |
| RSI | Relative Strength Index |
| CCI | Commodity Channel Index |
| MOM | Momentum |
| ROC | Rate of Change |
| PPO | Percentage Price Oscillator |
| AO | Awesome Oscillator |
| CMO | Chande Momentum Oscillator |
| TRIX | 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA |
| ULTOSC | Ultimate Oscillator |
| AROONOSC | Aroon Oscillator |
| ADOSC | Chaikin A/D Oscillator |
| APO | Absolute Price Oscillator |
| STOCH | Stochastic |
| STOCHF | Stochastic Fast |
| STOCHRSI | Stochastic Relative Strength Index |
| Qstick | Qstick Indicator |
| RLW | %R Larry Williams |
| AC | Acceleration Oscillator |
| TSI | True Strength Index |
| CRSI | ConnorsRSI |
| DPO | Detrended Price Oscillator |
| KDJ | KDJ Index |
| STC | Schaff Trend Cycle |
| SMI | Stochastic Momentum Index |
| BB | Bollinger Bands |
| Keltner | Keltner Channel |
| BBF | Bollinger Bands Flat |
| Channel | Price Channel |
| MAE | Moving Average Envelope |
| PAZ | Price Action Zones |
| DC | Donchian Channels |
| FCB | Fractal Chaos Bands |
| PP | Pivot Points |
| RPP | Rolling Pivot Points |
| STARC | STARC Bands |
| SDC | Standard Deviation Channels |
| OBV | On Balance Volume |
| PVI | Positive Volume Index |
| Volume | Volume Indicator |
| MFI | Money Flow Index |
| ADL | Accumulation / Distribution Line |
| CMF | Chaikin Money Flow |
| FI | Force Index |
| KVO | Klinger Volume Oscillator |
| PVO | Percentage Volume Oscillator |
| ATS | ATR Trailing Stop |
| CE | Chandelier Exit |
| SAR | Parabolic SAR |
| ST | SuperTrend |
| VS | Volatility Stop |
| Pivots | Pivots |
| WF | Williams Fractal |
| EMA | Exponential Moving Average |
| SMA | Simple Moving Average |
| LWMA | Linearly Weighted Moving Average |
| SMMA | Smoothed Moving Average |
| MMA | Modified Moving Average |
| KAMA | Kaufman Adaptive Moving Average |
| DEMA | Double Exponential Moving Average |
| TEMA | Triple Exponential Moving Average |
| MAMA | MESA Adaptive Moving Average |
| TRIMA | Triangular Moving Average |
| T3 | Triple Exponential Moving Average (T3) |
| PPMA | Pivot Point Moving Average |
| WMA | Weighted Moving Average |
| ALMA | Arnaud Legoux Moving Average |
| EPMA | Endpoint Moving Average |
| HMA | Hull Moving Average |
| LSMA | Least Squares Moving Average |
| MD | McGinley Dynamic |
| RMA | Running Moving Average |
| VWAP | Volume Weighted Average Price |
| VWMA | Volume Weighted Moving Average |
| ATR | Average True Range |
| NATR | Normalized Average True Range |
| TRANGE | True Range |
| STDDEV | Standard Deviation |
| HV | Historical Volatility |
| BOP | Balance of Power |
| BBP | Bull and Bear Power |
| CI | Choppiness Index |
| DCP | Dominant Cycle Periods |
| PMO | Price Momentum Oscillator |
| PRS | Price Relative Strength |
| ROCB | ROC with Bands |
| RRA | Rescaled Range Analysis |
| UI | Ulcer Index |
| CORREL | Pearson's Correlation Coefficient |
| BETA | Beta |
| VAR | Variance |
| AVGPRICE | Average Price |
| MEDPRICE | Median Price |
| TYPPRICE | Typical Price |
| WCLPRICE | Weighted Close Price |
| SUM | Summation |
| MAX | Highest value over a specified period |
| MIN | Lowest value over a specified period |
| MAXINDEX | Index of highest value over a specified period |
| MININDEX | Index of lowest value over a specified period |
| MINMAX | Lowest and highest values over a specified period |
| MINMAXINDEX | Indexes of lowest and highest values over a period |
| BC | Beta Coefficient |
| MAD | Mean absolute deviation |
| MAPE | Mean absolute percentage error |
| MSE | Mean square error |
| R2 | R-Squared (Coefficient of Determination) |
| SLR | Slope and Linear Regression |
| ZS | Z-Score |
| AD | Chaikin A/D Line |
| AROON | Aroon Indicator |
| ADX | Average Directional Movement Index |
| ADXR | Average Directional Movement Index Rating |
| DX | Directional Movement Index |
| SAR | Parabolic SAR |
| SAREXT | Parabolic SAR - Extended |
| HT_TRENDLINE | Hilbert Transform - Instantaneous Trendline |
| HT_TRENDMODE | Hilbert Transform - Trend vs Cycle Mode |
| ZZ | ZigZag Indicator |
| DMI | Directional Movement Index |
| Alligator | Alligator Indicator |
| Regression | Regression Line Indicator |
| SI | Swing Index |
| ATS | ATR Trailing Stop |
| ERI | Elder-ray Index |
| GO | Gator Oscillator |
| HE | Hurst Exponent |
| IC | Ichimoku Cloud |
| ST | SuperTrend |
| VI | Vortex Indicator |
| WA | Williams Alligator |
| RSI | Relative Strength Index |
| CCI | Commodity Channel Index |
| MOM | Momentum |
| ROC | Rate of Change |
| PPO | Percentage Price Oscillator |
| AO | Awesome Oscillator |
| CMO | Chande Momentum Oscillator |
| TRIX | 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA |
| ULTOSC | Ultimate Oscillator |
| AROONOSC | Aroon Oscillator |
| ADOSC | Chaikin A/D Oscillator |
| APO | Absolute Price Oscillator |
| STOCH | Stochastic |
| STOCHF | Stochastic Fast |
| STOCHRSI | Stochastic Relative Strength Index |
| Qstick | Qstick Indicator |
| RLW | %R Larry Williams |
| AC | Acceleration Oscillator |
| TSI | True Strength Index |
| CRSI | ConnorsRSI |
| DPO | Detrended Price Oscillator |
| KDJ | KDJ Index |
| STC | Schaff Trend Cycle |
| SMI | Stochastic Momentum Index |
| BB | Bollinger Bands |
| Keltner | Keltner Channel |
| BBF | Bollinger Bands Flat |
| Channel | Price Channel |
| MAE | Moving Average Envelope |
| PAZ | Price Action Zones |
| DC | Donchian Channels |
| FCB | Fractal Chaos Bands |
| PP | Pivot Points |
| RPP | Rolling Pivot Points |
| STARC | STARC Bands |
| SDC | Standard Deviation Channels |
| OBV | On Balance Volume |
| PVI | Positive Volume Index |
| Volume | Volume Indicator |
| MFI | Money Flow Index |
| ADL | Accumulation / Distribution Line |
| CMF | Chaikin Money Flow |
| FI | Force Index |
| KVO | Klinger Volume Oscillator |
| PVO | Percentage Volume Oscillator |
| ATS | ATR Trailing Stop |
| CE | Chandelier Exit |
| SAR | Parabolic SAR |
| ST | SuperTrend |
| VS | Volatility Stop |
| Pivots | Pivots |
| WF | Williams Fractal |
| ALMA | Arnaud Legoux Moving Average |
| EPMA | Endpoint Moving Average |
| HMA | Hull Moving Average |
| LSMA | Least Squares Moving Average |
| MD | McGinley Dynamic |
| RMA | Running Moving Average |
| T3 | Tillson T3 Moving Average |
| VWAP | Volume Weighted Average Price |
| VWMA | Volume Weighted Moving Average |
| BOP | Balance of Power |
| BBP | Bull and Bear Power |
| CI | Choppiness Index |
| DCP | Dominant Cycle Periods |
| PMO | Price Momentum Oscillator |
| PRS | Price Relative Strength |
| ROCB | ROC with Bands |
| RRA | Rescaled Range Analysis |
| UI | Ulcer Index |
| BC | Beta Coefficient |
| MAD | Mean absolute deviation |
| MAPE | Mean absolute percentage error |
| MSE | Mean square error |
| R2 | R-Squared (Coefficient of Determination) |
| SLR | Slope and Linear Regression |
| ZS | Z-Score |
| EMA | Exponential Moving Average |
| SMA | Simple Moving Average |
| LWMA | Linearly Weighted Moving Average |
| SMMA | Smoothed Moving Average |
| MMA | Modified Moving Average |
| KAMA | Kaufman Adaptive Moving Average |
| DEMA | Double Exponential Moving Average |
| TEMA | Triple Exponential Moving Average |
| MAMA | MESA Adaptive Moving Average |
| TRIMA | Triangular Moving Average |
| T3 | Triple Exponential Moving Average (T3) |
| PPMA | Pivot Point Moving Average |
| MAE | Moving Average Envelope |
| MACD | Moving Average Convergence Divergence |
| MACDEXT | MACD with controllable MA type |
| MACDFIX | Moving Average Convergence Divergence Fix 12/26 |
| OsMA | Moving Average of Oscillator |
| Regression | Regression Indicator |
| LINEARREG | Linear Regression |
| LINEARREG_ANGLE | Linear Regression Angle |
| LINEARREG_INTERCEPT | Linear Regression Intercept |
| LINEARREG_SLOPE | Linear Regression Slope |
| RSI | Relative Strength Index |
| CCI | Commodity Channel Index |
| MOM | Momentum |
| ROC | Rate of Change |
| PPO | Percentage Price Oscillator |
| AO | Awesome Oscillator |
| CMO | Chande Momentum Oscillator |
| TRIX | 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA |
| ULTOSC | Ultimate Oscillator |
| AROONOSC | Aroon Oscillator |
| ADOSC | Chaikin A/D Oscillator |
| APO | Absolute Price Oscillator |
| STOCH | Stochastic |
| STOCHF | Stochastic Fast |
| STOCHRSI | Stochastic Relative Strength Index |
| Qstick | Qstick Indicator |
| RLW | %R Larry Williams |
| AC | Acceleration Oscillator |
| TSI | True Strength Index |
| AD | Chaikin A/D Line |
| AROON | Aroon Indicator |
| ADX | Average Directional Movement Index |
| ADXR | Average Directional Movement Index Rating |
| DX | Directional Movement Index |
| SAR | Parabolic SAR |
| SAREXT | Parabolic SAR - Extended |
| HT_TRENDLINE | Hilbert Transform - Instantaneous Trendline |
| HT_TRENDMODE | Hilbert Transform - Trend vs Cycle Mode |
| ZZ | ZigZag Indicator |
| DMI | Directional Movement Index |
| Alligator | Alligator Indicator |
| Regression | Regression Line Indicator |
| SI | Swing Index |
| ATR | Average True Range |
| NATR | Normalized Average True Range |
| TRANGE | True Range |
| STDDEV | Standard Deviation |
| HV | Historical Volatility |
| BB | Bollinger Bands |
| Keltner | Keltner Channel |
| BBF | Bollinger Bands Flat |
| Channel | Price Channel |
| MAE | Moving Average Envelope |
| PAZ | Price Action Zones |
| OBV | On Balance Volume |
| PVI | Positive Volume Index |
| Volume | Volume Indicator |
| MFI | Money Flow Index |
| CORREL | Pearson's Correlation Coefficient |
| BETA | Beta |
| VAR | Variance |
| AVGPRICE | Average Price |
| MEDPRICE | Median Price |
| TYPPRICE | Typical Price |
| WCLPRICE | Weighted Close Price |
| SUM | Summation |
| MAX | Highest value over a specified period |
| MIN | Lowest value over a specified period |
| MAXINDEX | Index of highest value over a specified period |
| MININDEX | Index of lowest value over a specified period |
| MINMAX | Lowest and highest values over a specified period |
| MINMAXINDEX | Indexes of lowest and highest values over a period |
+34 -10
View File
@@ -1,7 +1,34 @@
* [QuanTAlib](/)
* [Home](/)
* Introduction
* [Overview]()
* [Features]()
* [Historical vs Real-time analysis](essays/realtime.md)
* [Indicators](indicators/indicators.md)
* Averages & Trends
* Core Concepts
* [Time Series Data Handling]()
* [Calculation classes]()
* [Presentation Classes]()
* QuanTAlib C# Library
* [Installation]()
* [Quick Start Guide]()
* [Usage Examples]()
* [Tests and Validation]()
* Quantower Charts
* [Installation]()
* [Quick Start Guide]()
* [Using VS Code for QuanTower coding](setup/vscode.md)
* [Using DotPeek](setup/dotpeek.md)
* [Creating Custom Indicators]()
* [Inspecting Quantower Internals]()
* [Available Indicators](indicators/indicators.md)
* Basic Transforms
* Numerical Analysis
* Errors
* Moving Averages
* [AFIRMA - Adaptive Filtering Integrated Recursive Moving Average](indicators/averages/afirma/afirma.md)
* [Calculation](indicators/averages/afirma/calc.md)
* [Analysis](indicators/averages/afirma/analysis.md)
@@ -14,7 +41,6 @@
* [Calculation](indicators/averages/ama/calc.md)
* [Analysis](indicators/averages/ama/analysis.md)
* [Charts](indicators/averages/ama/charts.md)
* [Convolutiuon]
* [DEMA - Double Exponential Moving Average](indicators/averages/dema/dema.md)
* [Calculation](indicators/averages/dema/calc.md)
* [Analysis](indicators/averages/dema/analysis.md)
@@ -61,11 +87,9 @@
* VIDYA - Variable Index Dynamic Average
* WMA - Weighted Moving Average
* ZLEMA - Weighted Moving Average
* Basic Data Transforms
* [Statistics & Numerical Analysis](indicators/statistics/list.md)
* Trends
* Momentum
* Oscillators
* Volatility
* Volume
* Momentum & Oscillators
* Development
* [VS Code](setup/vscode.md)
* [DotPeek](setup/dotpeek.md)
+46 -69
View File
@@ -2,76 +2,38 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<title>QuanTAlib Documentation</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="description" content="Description">
<meta name="description" content="Documentation for QuanTAlib, a quantitative technical analysis library">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsify-themeable@0/dist/css/theme-simple-dark.css" integrity="sha384-G+RAlt+LEfAH/nY+DZh3+XIhRboypMI32hiJ9BwnmjF41May5BWQKyrDrEkNdV/i" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/katex.min.css" integrity="sha384-3UiQGuEI4TTMaFmGIZumfRPtfKQ3trwQE2JgosJxCnGmQpL/lJdjpcHkaaFwHlcI" crossorigin="anonymous">
<style>
.markdown-section {
max-width: none !important;
width: 100% !important;
}
.sidebar-nav {
line-height: 1.5;
font-size: 12px;
}
.markdown-section table tbody td {
padding: 4px 1px;
}
:root {
--sidebar-width: 350px;
--sidebar-nav-link-padding: 2px 0;
--sidebar-nav-pagelink-padding: 2px 0 2px 12px;
--sidebar-nav-indent: 12px;
}
.content {
left: var(--sidebar-width);
}
.sidebar-toggle {
width: var(--sidebar-width);
}
/* Updated styles for partially expandable sidebar */
.sidebar-nav ul ul ul ul {
overflow: hidden;
max-height: 0;
transition: max-height 0.3s ease-out;
}
.sidebar-nav ul ul ul li:hover > ul {
max-height: 1000px;
transition: max-height 0.3s ease-in;
}
.sidebar-nav .collapse.level-4 > ul {
max-height: 0 !important;
}
.sidebar-nav .collapse.level-4:hover > ul {
max-height: 1000px !important;
}
.sidebar-nav .folder > .app-sub-sidebar {
display: block !important;
}
/* Ensure levels 1, 2, and 3 are always visible */
.sidebar-nav > ul,
.sidebar-nav > ul > li > ul,
.sidebar-nav > ul > li > ul > li > ul {
max-height: none !important;
overflow: visible !important;
}
</style>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div id="app"></div>
<script>
window.$docsify = {
name: 'QuanTAlib',
repo: 'https://github.com/mihakralj/quantalib',
homepage: 'readme.md',
loadSidebar: true,
subMaxLevel: 4, // Increased to allow for level 4+ items
name: '',
repo: '',
sidebarDisplayLevel: 3, // Changed to keep levels 1, 2, and 3 expanded
auto2top: true,
mergeNavbar: true,
sidebarDisplayLevel: 0, // Add this line to collapse all sidebar items initially
search: {
maxAge: 86400000,
paths: 'auto',
placeholder: 'Type to search',
noData: 'No Results!',
depth: 6,
hideOtherSidebarContent: false,
},
pagination: {
previousText: 'Previous',
nextText: 'Next',
crossChapter: true,
crossChapterText: true,
},
themeable: {
readyTransition: true,
responsiveTables: true
@@ -79,18 +41,33 @@
latex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$', '$$']],
}
},
executeScript: true,
externalLinkTarget: '_blank',
cornerExternalLinkTarget: '_blank',
relativePath: false,
toc: {
scope: '.markdown-section',
headings: 'h1, h2, h3, h4, h5, h6',
title: 'Table of Contents',
},
copyCode: {
buttonText: 'Copy to clipboard',
errorText: 'Error',
successText: 'Copied'
},
plugins: [
]
};
</script>
<!-- plugins -->
<script src="https://cdn.jsdelivr.net/npm/docsify-sidebar-collapse/dist/docsify-sidebar-collapse.min.js" integrity="sha384-lMHOyuqf3B/T/BgfYxUKprN0bdRf8KhVTE11w76Tvtze86XHVSDYzxqNGDGgIi9I" crossorigin="anonymous"></script>
<!-- Docsify v4 -->
<script src="https://cdn.jsdelivr.net/npm/docsify@4/lib/docsify.min.js" integrity="sha384-KaHhgnx/OTLoJ4J33SSJsF4x1pk4I7q3s5ZOfIDHJYl6IG7Oyn2vNDsHiWJe46fD" crossorigin="anonymous"></script>
<!-- docsify-themeable -->
<script src="https://cdn.jsdelivr.net/npm/docsify-themeable@0/dist/js/docsify-themeable.min.js" integrity="sha384-ibjVZCUwWPrRrNc9BNkbbJvtYmTh8GYDNQgj+2jQVNDudOFgSQWs+Es6JhdoTIvf" crossorigin="anonymous"></script>
<!-- KaTeX -->
<script src="https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/katex.min.js" integrity="sha384-G0zcxDFp5LWZtDuRMnBkk3EphCK1lhEf4UEyEM693ka574TZGwo4IWwS6QLzM/2t" crossorigin="anonymous"></script>
<!-- docsify-katex plugin -->
<script src="https://cdn.jsdelivr.net/npm/docsify-sidebar-collapse/dist/docsify-sidebar-collapse.min.js" integrity="sha384-lMHOyuqf3B/T/BgfYxUKprN0bdRf8KhVTE11w76Tvtze86XHVSDYzxqNGDGgIi9I" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/docsify/lib/plugins/search.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/docsify-copy-code/dist/docsify-copy-code.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/docsify-pagination/dist/docsify-pagination.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/docsify/lib/plugins/zoom-image.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/docsify-tabs/dist/docsify-tabs.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/docsify-katex@1.4.3/dist/docsify-katex.js" integrity="sha384-M76M/x5vGyeoej1covQQifl7T945mY+qgzNVrM/urHMCYjP8tnMsx5WCdeLZ74UE" crossorigin="anonymous"></script>
</body>
</html>
</html>
+1602
View File
File diff suppressed because it is too large Load Diff
+57 -6
View File
@@ -2,10 +2,11 @@ namespace QuanTAlib;
/// <summary>
/// EMA: Exponential Moving Average
/// EMA needs very short history buffer and calculates the EMA value using just the
/// previous EMA value. The weight of the new datapoint (alpha) is alpha = 2 / (period + 1)
/// </summary>
/// <remarks>
/// EMA needs very short history buffer and calculates the EMA value using just the
/// previous EMA value. The weight of the new datapoint (alpha) is alpha = 2 / (period + 1)
///
/// Key characteristics:
/// - Uses no buffer, relying only on the previous EMA value.
/// - The weight of new data points is calculated as alpha = 2 / (period + 1).
@@ -19,19 +20,52 @@ namespace QuanTAlib;
/// - https://www.investopedia.com/ask/answers/122314/what-exponential-moving-average-ema-formula-and-how-ema-calculated.asp
/// - https://blog.fugue88.ws/archives/2017-01/The-correct-way-to-start-an-Exponential-Moving-Average-EMA
/// </remarks>
public class Ema : AbstractBase
{
// inherited _index
// inherited _value
/// <summary>
/// The period for the EMA calculation.
/// </summary>
private readonly int _period;
/// <summary>
/// Circular buffer for SMA calculation.
/// </summary>
private CircularBuffer _sma;
/// <summary>
/// The last calculated EMA value.
/// </summary>
private double _lastEma, _p_lastEma;
/// <summary>
/// Compensator for early EMA values.
/// </summary>
private double _e, _p_e;
/// <summary>
/// The smoothing factor for EMA calculation.
/// </summary>
private readonly double _k;
/// <summary>
/// Flags to track initialization status.
/// </summary>
private bool _isInit, _p_isInit;
/// <summary>
/// Flag to determine whether to use SMA for initial values.
/// </summary>
private readonly bool _useSma;
/// <summary>
/// Initializes a new instance of the Ema class with a specified period.
/// </summary>
/// <param name="period">The period for EMA calculation.</param>
/// <param name="useSma">Whether to use SMA for initial values. Default is true.</param>
/// <exception cref="ArgumentOutOfRangeException">Thrown when period is less than 1.</exception>
public Ema(int period, bool useSma = true)
{
if (period < 1)
@@ -47,6 +81,10 @@ public class Ema : AbstractBase
Init();
}
/// <summary>
/// Initializes a new instance of the Ema class with a specified alpha value.
/// </summary>
/// <param name="alpha">The smoothing factor for EMA calculation.</param>
public Ema(double alpha)
{
_k = alpha;
@@ -57,13 +95,21 @@ public class Ema : AbstractBase
Init();
}
/// <summary>
/// Initializes a new instance of the Ema class with a specified source and period.
/// </summary>
/// <param name="source">The source object for event subscription.</param>
/// <param name="period">The period for EMA calculation.</param>
/// <param name="useSma">Whether to use SMA for initial values. Default is true.</param>
public Ema(object source, int period, bool useSma = true) : this(period, useSma)
{
var pubEvent = source.GetType().GetEvent("Pub");
pubEvent?.AddEventHandler(source, new ValueSignal(Sub));
}
//inhereted public void Sub(object source, in ValueEventArgs args)
/// <summary>
/// Initializes the Ema instance.
/// </summary>
public override void Init()
{
base.Init();
@@ -74,6 +120,10 @@ public class Ema : AbstractBase
_sma = new(_period);
}
/// <summary>
/// Manages the state of the Ema instance.
/// </summary>
/// <param name="isNew">Indicates whether the input is new.</param>
protected override void ManageState(bool isNew)
{
if (isNew)
@@ -92,8 +142,9 @@ public class Ema : AbstractBase
}
/// <summary>
/// Core EMA calculation
/// Performs the EMA calculation.
/// </summary>
/// <returns>The calculated EMA value.</returns>
protected override double Calculation()
{
double result, _ema;
@@ -118,7 +169,7 @@ public class Ema : AbstractBase
_ema = _k * (Input.Value - _lastEma) + _lastEma;
// _useSma decides if we use compensator or not
result = (_useSma || _e == 0) ? _ema : _ema / (1 - _e);
result = (_useSma || _e <= double.Epsilon) ? _ema : _ema / (1 - _e);
}
_lastEma = _ema;
IsHot = _index >= WarmupPeriod;
+85 -61
View File
@@ -1,68 +1,91 @@
/// <summary>
/// Represents a Jurik Moving Average, based on known and reverse-engineered insights
/// </summary>
namespace QuanTAlib;
//TODO fails consistency test
public class Jma : AbstractBase
{
public readonly int Period;
private readonly int _period;
private readonly double _phase;
private readonly int _vshort, _vlong;
private readonly CircularBuffer _values;
private readonly CircularBuffer _voltyShort;
private readonly CircularBuffer _vsumBuff;
private readonly CircularBuffer _avoltyBuff;
private double _beta, _len1, _pow1;
private double _upperBand, _lowerBand, _prevMa1, _prevDet0, _prevDet1, _prevJma;
private double _p_UpperBand, _p_LowerBand, _p_prevMa1, _p_prevDet0, _p_prevDet1, _p_prevJma;
private double _len1;
private double _pow1;
private readonly double _beta;
private double _upperBand, _lowerBand, _p_upperBand, _p_lowerBand;
private double _prevMa1, _prevDet0, _prevDet1, _prevJma, _p_prevMa1, _p_prevDet0, _p_prevDet1, _p_prevJma;
private double _vSum, _p_vSum;
public Jma(int period, double phase = 0, int vshort = 10)
public double UpperBand { get; set; }
public double LowerBand { get; set; }
public double Volty { get; set; }
/// <summary>
/// Initializes a new instance of the Jma class with the specified parameters.
/// </summary>
/// <param name="period">The period over which to calculate the Jvolty.</param>
/// <param name="phase">The phase parameter for the JMA-style calculation.</param>
/// <exception cref="ArgumentOutOfRangeException">
/// Thrown when period is less than 1.
/// </exception>
public Jma(int period, int phase = 0)
{
if (period < 1)
{
throw new ArgumentOutOfRangeException(nameof(period), "Period must be greater than or equal to 1.");
}
Period = period;
_vshort = vshort;
_vlong = 65;
_period = period;
_phase = Math.Clamp((phase * 0.01) + 1.5, 0.5, 2.5);
_values = new CircularBuffer(period);
_voltyShort = new CircularBuffer(vshort);
_vsumBuff = new CircularBuffer(_vlong);
_avoltyBuff = new CircularBuffer(2);
_vsumBuff = new CircularBuffer(10);
_avoltyBuff = new CircularBuffer(65);
_beta = 0.45 * (period - 1) / (0.45 * (period - 1) + 2);
Name = "JMA";
WarmupPeriod = period * 2;
Init();
Name = $"JMA({period})";
}
public Jma(object source, int period, double phase = 0, int vshort = 10) : this(period, phase, vshort)
/// <summary>
/// Initializes a new instance of the Jvolty class with the specified source and parameters.
/// </summary>
/// <param name="source">The source object to subscribe to for value updates.</param>
/// <param name="period">The period over which to calculate the Jvolty.</param>
/// <param name="phase">The phase parameter for the JMA-style calculation.</param>
public Jma(object source, int period, int phase = 0) : this(period, phase)
{
var pubEvent = source.GetType().GetEvent("Pub");
pubEvent?.AddEventHandler(source, new ValueSignal(Sub));
}
/// <summary>
/// Initializes the Jma instance by setting up the initial state.
/// </summary>
public override void Init()
{
_upperBand = _lowerBand = _prevMa1 = _prevDet0 = _prevDet1 = _prevJma = 0.0;
_p_UpperBand = _p_LowerBand = _p_prevMa1 = _p_prevDet0 = _p_prevDet1 = _p_prevJma = 0.0;
_beta = 0.45 * (Period - 1) / (0.45 * (Period - 1) + 2);
_len1 = Math.Max((Math.Log(Math.Sqrt(Period - 1)) / Math.Log(2.0)) + 2.0, 0);
base.Init();
_upperBand = _lowerBand = 0.0;
_p_upperBand = _p_lowerBand = 0.0;
_len1 = Math.Max((Math.Log(Math.Sqrt(_period - 1)) / Math.Log(2.0)) + 2.0, 0);
_pow1 = Math.Max(_len1 - 2.0, 0.5);
_avoltyBuff.Clear();
_avoltyBuff.Add(0, true);
_avoltyBuff.Add(0, true);
base.Init();
_vsumBuff.Clear();
}
/// <summary>
/// Manages the state of the Jma instance based on whether a new value is being processed.
/// </summary>
/// <param name="isNew">Indicates whether the current input is a new value.</param>
protected override void ManageState(bool isNew)
{
if (isNew)
{
_lastValidValue = Input.Value;
_index++;
// Save current state
_p_UpperBand = _upperBand;
_p_LowerBand = _lowerBand;
_p_upperBand = _upperBand;
_p_lowerBand = _lowerBand;
_p_vSum = _vSum;
_p_prevMa1 = _prevMa1;
_p_prevDet0 = _prevDet0;
_p_prevDet1 = _prevDet1;
@@ -70,67 +93,68 @@ public class Jma : AbstractBase
}
else
{
// Restore previous state
_upperBand = _p_UpperBand;
_lowerBand = _p_LowerBand;
_upperBand = _p_upperBand;
_lowerBand = _p_lowerBand;
_vSum = _p_vSum;
_prevMa1 = _p_prevMa1;
_prevDet0 = _p_prevDet0;
_prevDet1 = _p_prevDet1;
_prevJma = _p_prevJma;
}
}
/// <summary>
/// Performs the Jma calculation for the current value.
/// </summary>
/// <returns>
/// The calculated Jma value for the current input.
/// </returns>
protected override double Calculation()
{
ManageState(Input.IsNew);
_values.Add(Input.Value, Input.IsNew);
double price = Input.Value;
if (_index == 1)
{
_prevMa1 = _prevJma = Input.Value;
return Input.Value;
_upperBand = _lowerBand = price;
}
double hprice = _values.Max();
double lprice = _values.Min();
double del1 = hprice - _upperBand;
double del2 = lprice - _lowerBand;
double del1 = price - _upperBand;
double del2 = price - _lowerBand;
double volty = Math.Max(Math.Abs(del1), Math.Abs(del2));
_voltyShort.Add(volty, Input.IsNew);
double vsum = _vsumBuff.Newest() + 0.1 * (volty - _voltyShort.Oldest());
_vsumBuff.Add(vsum, Input.IsNew);
_vsumBuff.Add(volty, Input.IsNew);
_vSum += (_vsumBuff[^1] - _vsumBuff[0]) / 10;
_avoltyBuff.Add(_vSum, Input.IsNew);
double avgvolty = _avoltyBuff.Average();
double prevAvolty = _avoltyBuff.Newest();
double avolty = prevAvolty + 2.0 / (Math.Max(4.0 * Period, 30) + 1.0) * (vsum - prevAvolty);
_avoltyBuff.Add(avolty, Input.IsNew);
double rvolty = (avgvolty > 0) ? volty / avgvolty : 1;
rvolty = Math.Min(Math.Max(rvolty, 1.0), Math.Pow(_len1, 1.0 / _pow1));
double dVolty = (avolty > 0) ? volty / avolty : 0;
dVolty = Math.Min(Math.Max(dVolty, 1.0), Math.Pow(_len1, 1.0 / _pow1));
double pow2 = Math.Pow(rvolty, _pow1);
double Kv = Math.Pow(_beta, Math.Sqrt(pow2));
double pow2 = Math.Pow(dVolty, _pow1);
double len2 = Math.Sqrt(0.5 * (Period - 1)) * _len1;
double _Kv = Math.Pow(len2 / (len2 + 1), Math.Sqrt(pow2));
_upperBand = (del1 > 0) ? hprice : hprice - (_Kv * del1);
_lowerBand = (del2 < 0) ? lprice : lprice - (_Kv * del2);
_upperBand = (del1 >= 0) ? price : price - (Kv * del1);
_lowerBand = (del2 <= 0) ? price : price - (Kv * del2);
double alpha = Math.Pow(_beta, pow2);
double ma1 = (1 - alpha) * Input.Value + alpha * _prevMa1;
_prevMa1 = ma1;
double det0 = (1 - _beta) * (Input.Value - ma1) + _beta * _prevDet0;
double det0 = (price - ma1) * (1 - _beta) + _beta * _prevDet0;
_prevDet0 = det0;
double ma2 = ma1 + (_phase + 1) * det0;
double ma2 = ma1 + _phase * det0;
double det1 = ((1 - alpha) * (1 - alpha) * (ma2 - _prevJma)) + (alpha * alpha * _prevDet1);
double det1 = ((ma2 - _prevJma) * (1 - alpha) * (1 - alpha) ) + (alpha * alpha * _prevDet1);
_prevDet1 = det1;
double jma = _prevJma + det1;
_prevJma = jma;
UpperBand = _upperBand;
LowerBand = _lowerBand;
Volty = volty;
IsHot = _index >= WarmupPeriod;
return jma;
}
}
}
+70 -38
View File
@@ -7,17 +7,25 @@ namespace QuanTAlib;
public class Jvolty : AbstractBase
{
private readonly int _period;
private readonly CircularBuffer _values;
private readonly CircularBuffer _voltyShort;
private readonly double _phase;
private readonly CircularBuffer _vsumBuff;
private readonly CircularBuffer _avoltyBuff;
private double _len1;
private double _pow1;
private double _upperBand;
private double _lowerBand;
private double _p_upperBand;
private double _p_lowerBand;
private readonly double _beta;
private double _upperBand, _lowerBand, _p_upperBand, _p_lowerBand;
private double _prevMa1, _prevDet0, _prevDet1, _prevJma, _p_prevMa1, _p_prevDet0, _p_prevDet1, _p_prevJma;
private double _vSum, _p_vSum;
public double UpperBand { get; set; }
public double LowerBand { get; set; }
public double Volty { get; set; }
public double VSum { get; set; }
public double Jma { get; set; }
public double AvgVolty { get; set; }
/// <summary>
/// Initializes a new instance of the Jvolty class with the specified parameters.
@@ -28,22 +36,21 @@ public class Jvolty : AbstractBase
/// <exception cref="ArgumentOutOfRangeException">
/// Thrown when period is less than 1.
/// </exception>
public Jvolty(int period, int vshort = 10)
public Jvolty(int period, int phase = 0)
{
if (period < 1)
{
throw new ArgumentOutOfRangeException(nameof(period), "Period must be greater than or equal to 1.");
}
_period = period;
int _vlong = 65;
_phase = Math.Clamp((phase * 0.01) + 1.5, 0.5, 2.5);
_values = new CircularBuffer(period);
_voltyShort = new CircularBuffer(vshort);
_vsumBuff = new CircularBuffer(_vlong);
_avoltyBuff = new CircularBuffer(2);
_vsumBuff = new CircularBuffer(10);
_avoltyBuff = new CircularBuffer(65);
_beta = 0.45 * (period - 1) / (0.45 * (period - 1) + 2);
WarmupPeriod = period * 2;
Name = $"JVOLTY({period},{vshort})";
Name = $"JVOLTY({period})";
}
/// <summary>
@@ -53,7 +60,7 @@ public class Jvolty : AbstractBase
/// <param name="period">The period over which to calculate the Jvolty.</param>
/// <param name="phase">The phase parameter for the JMA-style calculation.</param>
/// <param name="vshort">The short-term volatility period.</param>
public Jvolty(object source, int period, int vshort = 10) : this(period, vshort)
public Jvolty(object source, int period, int phase = 0) : this(period, phase)
{
var pubEvent = source.GetType().GetEvent("Pub");
pubEvent?.AddEventHandler(source, new BarSignal(Sub));
@@ -70,8 +77,7 @@ public class Jvolty : AbstractBase
_len1 = Math.Max((Math.Log(Math.Sqrt(_period - 1)) / Math.Log(2.0)) + 2.0, 0);
_pow1 = Math.Max(_len1 - 2.0, 0.5);
_avoltyBuff.Clear();
_avoltyBuff.Add(0, true);
_avoltyBuff.Add(0, true);
_vsumBuff.Clear();
}
/// <summary>
@@ -85,11 +91,21 @@ public class Jvolty : AbstractBase
_index++;
_p_upperBand = _upperBand;
_p_lowerBand = _lowerBand;
_p_vSum = _vSum;
_p_prevMa1 = _prevMa1;
_p_prevDet0 = _prevDet0;
_p_prevDet1 = _prevDet1;
_p_prevJma = _prevJma;
}
else
{
_upperBand = _p_upperBand;
_lowerBand = _p_lowerBand;
_vSum = _p_vSum;
_prevMa1 = _p_prevMa1;
_prevDet0 = _p_prevDet0;
_prevDet1 = _p_prevDet1;
_prevJma = _p_prevJma;
}
}
@@ -101,41 +117,57 @@ public class Jvolty : AbstractBase
/// </returns>
protected override double Calculation()
{
ManageState(BarInput.IsNew);
_values.Add(BarInput.Close, BarInput.IsNew);
ManageState(Input.IsNew);
double price = Input.Value;
if (_index == 1)
{
return 0;
_upperBand = _lowerBand = price;
}
double hprice = _values.Max();
double lprice = _values.Min();
double del1 = hprice - _upperBand;
double del2 = lprice - _lowerBand;
double del1 = price - _upperBand;
double del2 = price - _lowerBand;
double volty = Math.Max(Math.Abs(del1), Math.Abs(del2));
_voltyShort.Add(volty, BarInput.IsNew);
double vsum = _vsumBuff.Newest() + 0.1 * (volty - _voltyShort.Oldest());
_vsumBuff.Add(vsum, BarInput.IsNew);
_vsumBuff.Add(volty, Input.IsNew);
_vSum += (_vsumBuff[^1] - _vsumBuff[0]) / 10;
_avoltyBuff.Add(_vSum, Input.IsNew);
double avgvolty = _avoltyBuff.Average();
double prevAvolty = _avoltyBuff.Newest();
double avolty = prevAvolty + 2.0 / (Math.Max(4.0 * _period, 30) + 1.0) * (vsum - prevAvolty);
_avoltyBuff.Add(avolty, BarInput.IsNew);
double rvolty = (avgvolty > 0) ? volty / avgvolty : 1;
rvolty = Math.Min(Math.Max(rvolty, 1.0), Math.Pow(_len1, 1.0 / _pow1));
double dVolty = (avolty > 0) ? volty / avolty : 0;
dVolty = Math.Min(Math.Max(dVolty, 1.0), Math.Pow(_len1, 1.0 / _pow1));
double pow2 = Math.Pow(rvolty, _pow1);
double Kv = Math.Pow(_beta, Math.Sqrt(pow2));
double pow2 = Math.Pow(dVolty, _pow1);
double len2 = Math.Sqrt(0.5 * (_period - 1)) * _len1;
double Kv = Math.Pow(len2 / (len2 + 1), Math.Sqrt(pow2));
_upperBand = (del1 >= 0) ? price : price - (Kv * del1);
_lowerBand = (del2 <= 0) ? price : price - (Kv * del2);
_upperBand = (del1 > 0) ? hprice : hprice - (Kv * del1);
_lowerBand = (del2 < 0) ? lprice : lprice - (Kv * del2);
double alpha = Math.Pow(_beta, pow2);
double ma1 = (1 - alpha) * Input.Value + alpha * _prevMa1;
_prevMa1 = ma1;
double det0 = (price - ma1) * (1 - _beta) + _beta * _prevDet0;
_prevDet0 = det0;
double ma2 = ma1 + _phase * det0;
double det1 = ((ma2 - _prevJma) * (1 - alpha) * (1 - alpha) ) + (alpha * alpha * _prevDet1);
_prevDet1 = det1;
double jma = _prevJma + det1;
_prevJma = jma;
UpperBand = _upperBand;
LowerBand = _lowerBand;
Volty = volty;
VSum = _vSum;
AvgVolty = avgvolty;
Jma = jma;
IsHot = _index >= WarmupPeriod;
return volty;
}
}
+1 -1
View File
@@ -18,11 +18,11 @@
## OHLC Input (Open, High, Low, Close)
- **Average True Range (ATR) (High, Low, Close)**
- Garman-Klass Volatility
- Rogers-Satchell Volatility
- Yang-Zhang Volatility
- Parkinson Volatility (High, Low)
- Average True Range (ATR) (High, Low, Close)
- Chaikin Volatility (High, Low)
- Keltner Channels (typically Close, High, Low)
- High-Low Volatility (High, Low)
+90 -69
View File
@@ -82,58 +82,77 @@ TSeries MarketJMA = new() { 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,
#!csharp
public class Jma1 : AbstractBase
public class Jmaxx : AbstractBase
{
public readonly int Period;
private readonly double _period;
private readonly double _phase;
private readonly int _vshort, _vlong;
private CircularBuffer _voltyShort;
private CircularBuffer _vsumBuff;
private CircularBuffer _avoltyBuff;
private readonly CircularBuffer _vsumBuff;
private readonly CircularBuffer _avoltyBuff;
private double _beta, _len1, _pow1;
private double _upperBand, _lowerBand, _prevMa1, _prevDet0, _prevDet1, _prevJma;
private double _p_UpperBand, _p_LowerBand, _p_prevMa1, _p_prevDet0, _p_prevDet1, _p_prevJma;
private double _len1;
private double _pow1;
private readonly double _beta;
private double _upperBand, _lowerBand, _p_upperBand, _p_lowerBand;
private double _prevMa1, _prevDet0, _prevDet1, _prevJma, _p_prevMa1, _p_prevDet0, _p_prevDet1, _p_prevJma;
private double _vSum, _p_vSum;
public Jma1(int period, double phase = 0, int vshort = 10) : base()
public double UpperBand { get; set; }
public double LowerBand { get; set; }
public double Volty { get; set; }
/// <summary>
/// Initializes a new instance of the Jma class with the specified parameters.
/// </summary>
/// <param name="period">The period over which to calculate the Jvolty.</param>
/// <param name="phase">The phase parameter for the JMA-style calculation.</param>
/// <exception cref="ArgumentOutOfRangeException">
/// Thrown when period is less than 1.
/// </exception>
public Jmaxx(int period, int phase = 0)
{
if (period < 1)
{
throw new ArgumentOutOfRangeException(nameof(period), "Period must be greater than or equal to 1.");
}
Period = period;
_vshort = vshort;
_vlong = 65;
_period = period;
_phase = Math.Clamp((phase * 0.01) + 1.5, 0.5, 2.5);
_voltyShort = new CircularBuffer(vshort);
_vsumBuff = new CircularBuffer(_vlong);
_avoltyBuff = new CircularBuffer(2);
_vsumBuff = new CircularBuffer(10);
_avoltyBuff = new CircularBuffer(65);
_beta = 0.45 * (_period - 1) / (0.45 * (_period - 1) + 2);
Name = "JMA";
WarmupPeriod = period * 2;
Init();
WarmupPeriod = (int)_period * 2;
Name = $"JMA({period})";
}
/// <summary>
/// Initializes the Jma instance by setting up the initial state.
/// </summary>
public override void Init()
{
_upperBand = _lowerBand = _prevMa1 = _prevDet0 = _prevDet1 = _prevJma = 0.0;
_p_UpperBand = _p_LowerBand = _p_prevMa1 = _p_prevDet0 = _p_prevDet1 = _p_prevJma = 0.0;
_avoltyBuff.Clear();
_avoltyBuff.Add(0, true);
_avoltyBuff.Add(0, true);
base.Init();
_upperBand = _lowerBand = 0.0;
_p_upperBand = _p_lowerBand = 0.0;
_len1 = Math.Max((Math.Log(Math.Sqrt(_period - 1)) / Math.Log(2.0)) + 2.0, 0);
_pow1 = Math.Max(_len1 - 2.0, 0.5);
_avoltyBuff.Clear();
_vsumBuff.Clear();
}
/// <summary>
/// Manages the state of the Jma instance based on whether a new value is being processed.
/// </summary>
/// <param name="isNew">Indicates whether the current input is a new value.</param>
protected override void ManageState(bool isNew)
{
if (isNew)
{
_lastValidValue = Input.Value;
_index++;
// Save current state
_p_UpperBand = _upperBand;
_p_LowerBand = _lowerBand;
_p_upperBand = _upperBand;
_p_lowerBand = _lowerBand;
_p_vSum = _vSum;
_p_prevMa1 = _prevMa1;
_p_prevDet0 = _prevDet0;
_p_prevDet1 = _prevDet1;
@@ -141,66 +160,73 @@ public class Jma1 : AbstractBase
}
else
{
// Restore previous state
_upperBand = _p_UpperBand;
_lowerBand = _p_LowerBand;
_upperBand = _p_upperBand;
_lowerBand = _p_lowerBand;
_vSum = _p_vSum;
_prevMa1 = _p_prevMa1;
_prevDet0 = _p_prevDet0;
_prevDet1 = _p_prevDet1;
_prevJma = _p_prevJma;
}
}
/// <summary>
/// Performs the Jma calculation for the current value.
/// </summary>
/// <returns>
/// The calculated Jma value for the current input.
/// </returns>
protected override double Calculation()
{
ManageState(Input.IsNew);
double price = Input.Value;
if (_index == 1)
{
_prevMa1 = _prevJma = Input.Value;
return Input.Value;
_upperBand = _lowerBand = price;
}
double del1 = Input.Value - _upperBand;
double del2 = Input.Value - _lowerBand;
double del1 = price - _upperBand;
double del2 = price - _lowerBand;
double volty = Math.Max(Math.Abs(del1), Math.Abs(del2));
_voltyShort.Add(volty, Input.IsNew);
double vsum = _vsumBuff.Newest() + 0.1 * (volty - _voltyShort.Oldest());
_vsumBuff.Add(vsum, Input.IsNew);
_vsumBuff.Add(volty, Input.IsNew);
_vSum += (_vsumBuff[^1] - _vsumBuff[0]) / 10;
_avoltyBuff.Add(_vSum, Input.IsNew);
double avgvolty = _avoltyBuff.Average();
double avolty = 0;
for (int i = 0; i < _vsumBuff.Count; i++) { avolty += _vsumBuff[i]; }
avolty /= _vsumBuff.Count;
double rvolty = (avgvolty > 0) ? volty / avgvolty : 1;
rvolty = Math.Min(Math.Max(rvolty, 1.0), Math.Pow(_len1, 1.0 / _pow1));
double rVolty = (avolty > 0) ? volty / avolty *20: 0;
double _len1 = Math.Max((Math.Log(Math.Sqrt(Period)) / Math.Log(2.0)) + 2.0, 0);
double _pow1 = Math.Max(_len1 - 2, 0.5);
double pow2 = Math.Pow(rvolty, _pow1);
double Kv = Math.Pow(_beta, Math.Sqrt(pow2));
rVolty = Math.Clamp(rVolty, 1.0, Math.Pow(_len1, 1.0 / _pow1));
_upperBand = (del1 >= 0) ? price : price - (Kv * del1);
_lowerBand = (del2 <= 0) ? price : price - (Kv * del2);
double _pow2 = Math.Pow(rVolty, _pow1);
double _beta = 0.45 * (Period - 1) / (0.45 * (Period - 1) + 2);
double len2 = Math.Sqrt(0.5 * (Period - 1)) * _len1;
double _Kv = Math.Pow (_beta, Math.Sqrt(_pow2)) *1.5;
_upperBand = (del1 > 0) ? Input.Value : Input.Value - (_Kv * del1);
_lowerBand = (del2 < 0) ? Input.Value : Input.Value - (_Kv * del2);
double alpha = Math.Pow(_beta, _pow2);
double ma1 = alpha * (_prevMa1 - Input.Value) + Input.Value;
double alpha = Math.Pow(_beta, pow2);
double ma1 = (1 - alpha) * Input.Value + alpha * _prevMa1;
_prevMa1 = ma1;
double det0 = _beta * (_prevDet0 - Input.Value + ma1) + Input.Value - ma1;
double det0 = (price - ma1) * (1 - _beta) + _beta * _prevDet0;
_prevDet0 = det0;
double ma2 = ma1 + _phase * det0;
double det1 = ((1 - alpha) * (1 - alpha) * (ma2 - _prevJma)) + (alpha * alpha * _prevDet1 );
double det1 = ((ma2 - _prevJma) * (1 - alpha) * (1 - alpha) ) + (alpha * alpha * _prevDet1);
_prevDet1 = det1;
double jma = _prevJma + det1;
_prevJma = jma;
UpperBand = _upperBand;
LowerBand = _lowerBand;
Volty = volty;
IsHot = _index >= WarmupPeriod;
return jma;
}
@@ -208,22 +234,17 @@ public class Jma1 : AbstractBase
#!csharp
TSeries ma = Triangle;
TSeries re = TriangleJMA;
TSeries ma = Complex;
TSeries re = ComplexJMA;
TSeries out1 = new();
TSeries out2 = new();
Jma calc = new(10);
Jma1 calc1 = new(10);
Jmaxx calc = new(10);
foreach (var value in ma) { out1.Add(calc.Calc(value)); }
foreach (var value in ma) { out2.Add(calc1.Calc(value)); }
Plot plt = new();
var sigplot = plt.Add.Signal(ma.v.ToArray()[60..80]);
var jmaplot = plt.Add.Signal(re.v.ToArray()[60..80]); sigplot.Color = ScottPlot.Colors.Red; sigplot.LineWidth = 2; jmaplot.LineWidth = 3;
//var jma1plot = plt.Add.Signal(out1.v.ToArray()[60..80]); jma1plot.Color = ScottPlot.Colors.Purple; jma1plot.LineWidth = 3;
var jma2plot = plt.Add.Signal(out2.v.ToArray()[60..80]); jma2plot.Color = ScottPlot.Colors.Blue; jma2plot.LineWidth = 3;
var jma1plot = plt.Add.Signal(out1.v.ToArray()[60..80]); jma1plot.Color = ScottPlot.Colors.Purple; jma1plot.LineWidth = 3;
plt.Display();
#!csharp
#r "nuget: Plotly.net.Interactive"
using Plotly.NET.Interactive;
+1 -1
View File
@@ -9,7 +9,7 @@ public class JmaIndicator : Indicator, IWatchlistIndicator
public int Periods { get; set; } = 10;
[InputParameter("Phase", sortIndex: 2, -100, 100, 1, 0)]
public double Phase { get; set; } = 0;
public int Phase { get; set; } = 0;
[InputParameter("Data source", sortIndex: 4, variants: [
"Open", SourceType.Open,
+95
View File
@@ -0,0 +1,95 @@
using System.Diagnostics.Metrics;
using System.Drawing;
using TradingPlatform.BusinessLayer;
namespace QuanTAlib;
public class MacdIndicator : Indicator, IWatchlistIndicator
{
[InputParameter("Slow EMA", sortIndex: 1, 1, 1000, 1, 0)]
public int Slow { get; set; } = 26;
[InputParameter("Fast EMA", sortIndex: 2, 1, 2000, 1, 0)]
public int Fast { get; set; } = 12;
[InputParameter("Signal line", sortIndex: 3, 1, 2000, 1, 0)]
public int Signal { get; set; } = 9;
[InputParameter("Use SMA for warmup period", sortIndex: 2)]
public bool UseSMA { get; set; } = false;
[InputParameter("Data source", sortIndex: 3, variants: [
"Open", SourceType.Open,
"High", SourceType.High,
"Low", SourceType.Low,
"Close", SourceType.Close,
"HL/2 (Median)", SourceType.HL2,
"OC/2 (Midpoint)", SourceType.OC2,
"OHL/3 (Mean)", SourceType.OHL3,
"HLC/3 (Typical)", SourceType.HLC3,
"OHLC/4 (Average)", SourceType.OHLC4,
"HLCC/4 (Weighted)", SourceType.HLCC4
])]
public SourceType Source { get; set; } = SourceType.Close;
[InputParameter("Show cold values", sortIndex: 21)]
public bool ShowColdValues { get; set; } = true;
private Ema? slow_ma;
private Ema? fast_ma;
private Ema? signal_ma;
protected LineSeries? MainSeries;
protected LineSeries? SignalSeries;
protected string? SourceName;
public int MinHistoryDepths => Slow;
int IWatchlistIndicator.MinHistoryDepths => MinHistoryDepths;
public override string ShortName => $"MACD {Slow}:{Fast}:{Signal}";
public MacdIndicator()
{
OnBackGround = true;
SeparateWindow = true;
SourceName = Source.ToString();
Name = "MACD - Moving Average Convergence Divergence";
Description = "MACD";
MainSeries = new(name: $"MAIN", color: Color.Yellow, width: 2, style: LineStyle.Solid);
SignalSeries = new(name: $"SIGNAL", color: Color.Blue, width: 2, style: LineStyle.Solid);
AddLineSeries(MainSeries);
AddLineSeries(SignalSeries);
}
protected override void OnInit()
{
slow_ma = new(Slow, useSma: UseSMA);
fast_ma = new(Fast, useSma: UseSMA);
signal_ma = new(Signal, useSma: UseSMA);
SourceName = Source.ToString();
base.OnInit();
}
protected override void OnUpdate(UpdateArgs args)
{
TValue input = this.GetInputValue(args, Source);
slow_ma!.Calc(input);
fast_ma!.Calc(input);
double main = fast_ma.Value - slow_ma.Value;
signal_ma!.Calc(main);
MainSeries!.SetValue(main);
MainSeries!.SetMarker(0, Color.Transparent); //OnPaintChart draws the line, hidden here
SignalSeries!.SetValue(signal_ma.Value);
SignalSeries!.SetMarker(0, Color.Transparent); //OnPaintChart draws the line, hidden here
}
public override void OnPaintChart(PaintChartEventArgs args)
{
base.OnPaintChart(args);
this.PaintSmoothCurve(args, MainSeries!, slow_ma!.WarmupPeriod, showColdValues: ShowColdValues, tension: 0.2);
this.PaintSmoothCurve(args, SignalSeries!, slow_ma!.WarmupPeriod, showColdValues: ShowColdValues, tension: 0.2);
this.DrawText(args, Description);
}
}
+64
View File
@@ -0,0 +1,64 @@
using System.Drawing;
using TradingPlatform.BusinessLayer;
namespace QuanTAlib;
public class JbandsIndicator : Indicator, IWatchlistIndicator
{
[InputParameter("Periods", sortIndex: 1, 1, 2000, 1, 0)]
public int Periods { get; set; } = 14;
[InputParameter("Data source", sortIndex: 5, variants: [
"Open", SourceType.Open,
"High", SourceType.High,
"Low", SourceType.Low,
"Close", SourceType.Close,
"HL/2 (Median)", SourceType.HL2,
"OC/2 (Midpoint)", SourceType.OC2,
"OHL/3 (Mean)", SourceType.OHL3,
"HLC/3 (Typical)", SourceType.HLC3,
"OHLC/4 (Average)", SourceType.OHLC4,
"HLCC/4 (Weighted)", SourceType.HLCC4
])]
public SourceType Source { get; set; } = SourceType.Close;
[InputParameter("vShort", sortIndex: 6, -100, 100, 1, 0)]
public int Phase { get; set; } = 10;
private Jma? jma;
protected LineSeries? UbSeries;
protected LineSeries? LbSeries;
protected string? SourceName;
public static int MinHistoryDepths => 2;
int IWatchlistIndicator.MinHistoryDepths => MinHistoryDepths;
public JbandsIndicator()
{
Name = "JBANDS - Mark Jurik's Bands";
Description = "Upper and Lower Bands.";
SeparateWindow = false;
UbSeries = new("UB", Color.Blue, 2, LineStyle.Solid);
LbSeries = new("LB", Color.Red, 2, LineStyle.Solid);
AddLineSeries(UbSeries);
AddLineSeries(LbSeries);
}
protected override void OnInit()
{
jma = new(Periods, phase: Phase);
SourceName = Source.ToString();
base.OnInit();
}
protected override void OnUpdate(UpdateArgs args)
{
TValue input = this.GetInputValue(args, Source);
jma!.Calc(input);
UbSeries!.SetValue(jma.UpperBand);
LbSeries!.SetValue(jma.LowerBand);
}
public override string ShortName => $"JBands ({Periods}:{Phase})";
}
+23 -6
View File
@@ -6,11 +6,27 @@ namespace QuanTAlib;
public class JvoltyIndicator : Indicator, IWatchlistIndicator
{
[InputParameter("Periods", sortIndex: 1, 1, 2000, 1, 0)]
public int Periods { get; set; } = 20;
public int Periods { get; set; } = 14;
private Jvolty? jvolty;
[InputParameter("Data source", sortIndex: 5, variants: [
"Open", SourceType.Open,
"High", SourceType.High,
"Low", SourceType.Low,
"Close", SourceType.Close,
"HL/2 (Median)", SourceType.HL2,
"OC/2 (Midpoint)", SourceType.OC2,
"OHL/3 (Mean)", SourceType.OHL3,
"HLC/3 (Typical)", SourceType.HLC3,
"OHLC/4 (Average)", SourceType.OHLC4,
"HLCC/4 (Weighted)", SourceType.HLCC4
])]
public SourceType Source { get; set; } = SourceType.Close;
private Jma? jma;
protected LineSeries? JvoltySeries;
public static int MinHistoryDepths => 2;
int IWatchlistIndicator.MinHistoryDepths => MinHistoryDepths;
public JvoltyIndicator()
@@ -25,16 +41,17 @@ public class JvoltyIndicator : Indicator, IWatchlistIndicator
protected override void OnInit()
{
jvolty = new (Periods);
jma = new(Periods);
base.OnInit();
}
protected override void OnUpdate(UpdateArgs args)
{
TBar input = IndicatorExtensions.GetInputBar(this, args);
TValue result = jvolty!.Calc(input);
TValue input = this.GetInputValue(args, Source);
jma!.Calc(input);
JvoltySeries!.SetValue(jma.Volty);
JvoltySeries!.SetValue(result.Value);
}
public override string ShortName => $"JVOLTY ({Periods})";