-
Notifications
You must be signed in to change notification settings - Fork 18
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
CTI - Ehler's Correlation Trend - calc and chart
- Loading branch information
Showing
7 changed files
with
164 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
using System.Runtime.CompilerServices; | ||
namespace QuanTAlib; | ||
|
||
/// <summary> | ||
/// CTI: Ehler's Correlation Trend Indicator | ||
/// A momentum oscillator that measures the correlation between the price and a lagged version of the price. | ||
/// </summary> | ||
/// <remarks> | ||
/// The CTI calculation process: | ||
/// 1. Calculate the correlation between the price and a lagged version of the price over a specified period. | ||
/// 2. Normalize the correlation values to oscillate between -1 and 1. | ||
/// 3. Use the normalized correlation values to calculate the CTI. | ||
/// | ||
/// Key characteristics: | ||
/// - Oscillates between -1 and 1 | ||
/// - Positive values indicate bullish momentum | ||
/// - Negative values indicate bearish momentum | ||
/// | ||
/// Formula: | ||
/// CTI = 2 * (Correlation - 0.5) | ||
/// | ||
/// Sources: | ||
/// John Ehlers - "Cybernetic Analysis for Stocks and Futures" (2004) | ||
/// https://www.investopedia.com/terms/c/correlation-trend-indicator.asp | ||
/// </remarks> | ||
[SkipLocalsInit] | ||
public sealed class Cti : AbstractBase | ||
{ | ||
private readonly int _period; | ||
private readonly CircularBuffer _priceBuffer; | ||
private readonly Corr _correlation; | ||
|
||
/// <param name="source">The data source object that publishes updates.</param> | ||
/// <param name="period">The calculation period (default: 20)</param> | ||
[MethodImpl(MethodImplOptions.AggressiveInlining)] | ||
public Cti(object source, int period = 20) : this(period) | ||
{ | ||
var pubEvent = source.GetType().GetEvent("Pub"); | ||
pubEvent?.AddEventHandler(source, new ValueSignal(Sub)); | ||
} | ||
|
||
[MethodImpl(MethodImplOptions.AggressiveInlining)] | ||
public Cti(int period = 20) | ||
{ | ||
_period = period; | ||
_priceBuffer = new CircularBuffer(period); | ||
_correlation = new Corr(period); | ||
WarmupPeriod = period; | ||
Name = "CTI"; | ||
} | ||
|
||
[MethodImpl(MethodImplOptions.AggressiveInlining)] | ||
protected override void ManageState(bool isNew) | ||
{ | ||
if (isNew) | ||
{ | ||
_index++; | ||
} | ||
} | ||
|
||
[MethodImpl(MethodImplOptions.AggressiveInlining)] | ||
protected override double Calculation() | ||
{ | ||
ManageState(Input.IsNew); | ||
|
||
_priceBuffer.Add(Input.Value, Input.IsNew); | ||
var laggedPrice = _index >= _period ? _priceBuffer[_index - _period] : double.NaN; | ||
|
||
_correlation.Calc(new TValue(Input.Time, Input.Value, Input.IsNew), new TValue(Input.Time, laggedPrice, Input.IsNew)); | ||
|
||
if (_index < _period - 1) return double.NaN; | ||
|
||
var correlation = _correlation.Value; | ||
return 2 * (correlation - 0.5); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
using TradingPlatform.BusinessLayer; | ||
using System.Drawing; | ||
|
||
namespace QuanTAlib | ||
{ | ||
public class CtiIndicator : Indicator | ||
{ | ||
[InputParameter("Period", 0, 1, 100, 1, 0)] | ||
public int Period = 20; | ||
|
||
[InputParameter("Source Type", 1, variants: new object[] | ||
{ | ||
"Open", SourceType.Open, | ||
"High", SourceType.High, | ||
"Low", SourceType.Low, | ||
"Close", SourceType.Close, | ||
"HL2", SourceType.HL2, | ||
"OC2", SourceType.OC2, | ||
"OHL3", SourceType.OHL3, | ||
"HLC3", SourceType.HLC3, | ||
"OHLC4", SourceType.OHLC4, | ||
"HLCC4", SourceType.HLCC4 | ||
})] | ||
public SourceType SourceType = SourceType.Close; | ||
|
||
[InputParameter("Show Cold Values", 2)] | ||
public bool ShowColdValues = false; | ||
|
||
private Cti cti; | ||
protected LineSeries? CtiSeries; | ||
public int MinHistoryDepths => Period + 1; | ||
int IWatchlistIndicator.MinHistoryDepths => MinHistoryDepths; | ||
Check failure on line 32 in quantower/Oscillators/CtiIndicator.cs GitHub Actions / Code_Coverage
|
||
|
||
public CtiIndicator() | ||
{ | ||
this.Name = "CTI - Ehler's Correlation Trend Indicator"; | ||
this.Description = "A momentum oscillator that measures the correlation between the price and a lagged version of the price."; | ||
CtiSeries = new($"CTI {Period}", Color: IndicatorExtensions.Oscillators, 2, LineStyle.Solid); | ||
AddLineSeries(CtiSeries); | ||
} | ||
|
||
protected override void OnInit() | ||
{ | ||
cti = new Cti(this.Period); | ||
base.OnInit(); | ||
} | ||
|
||
protected override void OnUpdate(UpdateArgs args) | ||
{ | ||
TValue input = this.GetInputValue(args, Source); | ||
cti.Calc(value); | ||
|
||
CtiSeries!.SetValue(cti.Value); | ||
CtiSeries!.SetMarker(0, Color.Transparent); | ||
} | ||
|
||
public override string ShortName => $"CTI ({Period}:{SourceName})"; | ||
|
||
#pragma warning disable CA1416 // Validate platform compatibility | ||
public override void OnPaintChart(PaintChartEventArgs args) | ||
{ | ||
base.OnPaintChart(args); | ||
this.PaintSmoothCurve(args, CtiSeries!, cti!.WarmupPeriod, showColdValues: ShowColdValues, tension: 0.2); | ||
} | ||
} | ||
} |