-
Notifications
You must be signed in to change notification settings - Fork 3
/
Knoxville Divergence.cs
79 lines (71 loc) · 2.97 KB
/
Knoxville Divergence.cs
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
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
namespace cAlgo
{
[Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
public class KnoxvilleDivergence : Indicator
{
[Parameter("Period", DefaultValue = 30)]
public int Period { get; set; }
[Output("Bullish Divergence", Color = Colors.Green, PlotType = PlotType.Points, Thickness = 5)]
public IndicatorDataSeries BullishDiv { get; set; }
[Output("Bearish Divergence", Color = Colors.Red, PlotType = PlotType.Points, Thickness = 5)]
public IndicatorDataSeries BearishDiv { get; set; }
private bool BullDFlag = false;
private bool BearDFlag = false;
private int MinPeriod = 4;
private MomentumOscillator _momentum;
private RelativeStrengthIndex _rsi;
protected override void Initialize()
{
_momentum = Indicators.MomentumOscillator(MarketSeries.Close, 20);
_rsi = Indicators.RelativeStrengthIndex(MarketSeries.Close, 21);
}
public override void Calculate(int index)
{
BullDFlag = false;
BearDFlag = false;
if (index < Period)
BullishDiv[index] = BearishDiv[index] = double.NaN;
else
{
// Calculate divergence presence.
for (int i = MinPeriod; i <= Period; i++)
{
if (_momentum.Result.LastValue > _momentum.Result.Last(i))
{
if (MarketSeries.Close.LastValue < MarketSeries.Close.Last(i))
{
if (MarketSeries.Low.LastValue <= MarketSeries.Low.Minimum(i))
{
if (_rsi.Result.Minimum(i) <= 30)
{
BullDFlag = true;
}
}
}
}
else if (_momentum.Result.LastValue < _momentum.Result.Last(i))
{
if (MarketSeries.Close.LastValue > MarketSeries.Close.Last(i))
{
if (MarketSeries.High.LastValue >= MarketSeries.High.Maximum(i))
{
if (_rsi.Result.Maximum(i) >= 70)
{
BearDFlag = true;
}
}
}
}
}
// Draw indicator.
BullishDiv[index] = BullDFlag == true ? MarketSeries.Low.LastValue - 10 * Symbol.PipSize : double.NaN;
BearishDiv[index] = BearDFlag == true ? MarketSeries.High.LastValue + 10 * Symbol.PipSize : double.NaN;
}
}
}
}