|
| 1 | +package momentum |
| 2 | + |
| 3 | +import ( |
| 4 | + "github.com/cinar/indicator/v2/helper" |
| 5 | + "github.com/cinar/indicator/v2/trend" |
| 6 | +) |
| 7 | + |
| 8 | +type PringsSpecialK[T helper.Float] struct { |
| 9 | + Roc10 *trend.Roc[T] |
| 10 | + Roc15 *trend.Roc[T] |
| 11 | + Roc50 *trend.Roc[T] |
| 12 | + Roc65 *trend.Roc[T] |
| 13 | + Roc75 *trend.Roc[T] |
| 14 | + Roc100 *trend.Roc[T] |
| 15 | + Roc130 *trend.Roc[T] |
| 16 | + Roc195 *trend.Roc[T] |
| 17 | + |
| 18 | + Sma10 *trend.Sma[T] |
| 19 | + Sma15 *trend.Sma[T] |
| 20 | + Sma20 *trend.Sma[T] |
| 21 | + Sma30 *trend.Sma[T] |
| 22 | + Sma40 *trend.Sma[T] |
| 23 | + Sma65 *trend.Sma[T] |
| 24 | + Sma75 *trend.Sma[T] |
| 25 | + Sma100 *trend.Sma[T] |
| 26 | + Sma195 *trend.Sma[T] |
| 27 | + Sma265 *trend.Sma[T] |
| 28 | + Sma390 *trend.Sma[T] |
| 29 | + Sma530 *trend.Sma[T] |
| 30 | +} |
| 31 | + |
| 32 | +// NewPringsSpecialK function initializes a new Martin Pring's Special K instance. |
| 33 | +func NewPringsSpecialK[T helper.Float]() *PringsSpecialK[T] { |
| 34 | + return &PringsSpecialK[T]{ |
| 35 | + Roc10: trend.NewRocWithPeriod[T](10), |
| 36 | + Roc15: trend.NewRocWithPeriod[T](15), |
| 37 | + Roc50: trend.NewRocWithPeriod[T](50), |
| 38 | + Roc65: trend.NewRocWithPeriod[T](65), |
| 39 | + Roc75: trend.NewRocWithPeriod[T](75), |
| 40 | + Roc100: trend.NewRocWithPeriod[T](100), |
| 41 | + Roc130: trend.NewRocWithPeriod[T](130), |
| 42 | + Roc195: trend.NewRocWithPeriod[T](195), |
| 43 | + |
| 44 | + Sma10: trend.NewSmaWithPeriod[T](10), |
| 45 | + Sma15: trend.NewSmaWithPeriod[T](15), |
| 46 | + Sma20: trend.NewSmaWithPeriod[T](20), |
| 47 | + Sma30: trend.NewSmaWithPeriod[T](30), |
| 48 | + Sma40: trend.NewSmaWithPeriod[T](40), |
| 49 | + Sma65: trend.NewSmaWithPeriod[T](65), |
| 50 | + Sma75: trend.NewSmaWithPeriod[T](75), |
| 51 | + Sma100: trend.NewSmaWithPeriod[T](100), |
| 52 | + Sma195: trend.NewSmaWithPeriod[T](195), |
| 53 | + Sma265: trend.NewSmaWithPeriod[T](265), |
| 54 | + Sma390: trend.NewSmaWithPeriod[T](390), |
| 55 | + Sma530: trend.NewSmaWithPeriod[T](530), |
| 56 | + } |
| 57 | +} |
| 58 | + |
| 59 | +func (p *PringsSpecialK[T]) Compute(closings <-chan T) <-chan T { |
| 60 | + c := helper.Duplicate(closings, 8) |
| 61 | + |
| 62 | + roc10 := p.Roc10.Compute(c[0]) |
| 63 | + roc15 := p.Roc15.Compute(c[1]) |
| 64 | + roc50 := p.Roc50.Compute(c[2]) |
| 65 | + roc65 := p.Roc65.Compute(c[3]) |
| 66 | + roc75 := p.Roc75.Compute(c[4]) |
| 67 | + roc100 := p.Roc100.Compute(c[5]) |
| 68 | + roc130 := p.Roc130.Compute(c[6]) |
| 69 | + roc195 := p.Roc195.Compute(c[7]) |
| 70 | + |
| 71 | + roc10s := helper.Duplicate(roc10, 3) |
| 72 | + sma10 := p.Sma10.Compute(roc10s[0]) |
| 73 | + sma15 := p.Sma15.Compute(roc10s[1]) |
| 74 | + sma20 := p.Sma20.Compute(roc10s[2]) |
| 75 | + sma30 := p.Sma30.Compute(roc15) |
| 76 | + sma40 := p.Sma40.Compute(roc50) |
| 77 | + sma65 := p.Sma65.Compute(roc65) |
| 78 | + sma75 := p.Sma75.Compute(roc75) |
| 79 | + sma100 := p.Sma100.Compute(roc100) |
| 80 | + roc130s := helper.Duplicate(roc130, 3) |
| 81 | + sma195 := p.Sma195.Compute(roc130s[0]) |
| 82 | + sma265 := p.Sma265.Compute(roc130s[1]) |
| 83 | + sma390 := p.Sma390.Compute(roc130s[2]) |
| 84 | + sma530 := p.Sma530.Compute(roc195) |
| 85 | + |
| 86 | + maxIdle := p.Sma530.IdlePeriod() + p.Roc195.IdlePeriod() |
| 87 | + |
| 88 | + sma10 = helper.Skip(sma10, maxIdle-p.Sma10.IdlePeriod()-p.Roc10.IdlePeriod()) |
| 89 | + sma15 = helper.Skip(sma15, maxIdle-p.Sma15.IdlePeriod()-p.Roc10.IdlePeriod()) |
| 90 | + sma20 = helper.Skip(sma20, maxIdle-p.Sma20.IdlePeriod()-p.Roc10.IdlePeriod()) |
| 91 | + sma30 = helper.Skip(sma30, maxIdle-p.Sma30.IdlePeriod()-p.Roc15.IdlePeriod()) |
| 92 | + sma40 = helper.Skip(sma40, maxIdle-p.Sma40.IdlePeriod()-p.Roc50.IdlePeriod()) |
| 93 | + sma65 = helper.Skip(sma65, maxIdle-p.Sma65.IdlePeriod()-p.Roc65.IdlePeriod()) |
| 94 | + sma75 = helper.Skip(sma75, maxIdle-p.Sma75.IdlePeriod()-p.Roc75.IdlePeriod()) |
| 95 | + sma100 = helper.Skip(sma100, maxIdle-p.Sma100.IdlePeriod()-p.Roc100.IdlePeriod()) |
| 96 | + sma195 = helper.Skip(sma195, maxIdle-p.Sma195.IdlePeriod()-p.Roc130.IdlePeriod()) |
| 97 | + sma265 = helper.Skip(sma265, maxIdle-p.Sma265.IdlePeriod()-p.Roc130.IdlePeriod()) |
| 98 | + sma390 = helper.Skip(sma390, maxIdle-p.Sma390.IdlePeriod()-p.Roc130.IdlePeriod()) |
| 99 | + //sma530 = helper.Skip(sma530, p.Sma530.IdlePeriod()-p.Sma530.IdlePeriod()) |
| 100 | + |
| 101 | + p0 := helper.MultiplyBy(sma10, 1) |
| 102 | + p1 := helper.Add(p0, helper.MultiplyBy(sma15, 2)) |
| 103 | + p2 := helper.Add(p1, helper.MultiplyBy(sma20, 3)) |
| 104 | + p3 := helper.Add(p2, helper.MultiplyBy(sma30, 4)) |
| 105 | + p4 := helper.Add(p3, helper.MultiplyBy(sma40, 1)) |
| 106 | + p5 := helper.Add(p4, helper.MultiplyBy(sma65, 2)) |
| 107 | + p6 := helper.Add(p5, helper.MultiplyBy(sma75, 3)) |
| 108 | + p7 := helper.Add(p6, helper.MultiplyBy(sma100, 4)) |
| 109 | + p8 := helper.Add(p7, helper.MultiplyBy(sma195, 1)) |
| 110 | + p9 := helper.Add(p8, helper.MultiplyBy(sma265, 2)) |
| 111 | + p10 := helper.Add(p9, helper.MultiplyBy(sma390, 3)) |
| 112 | + p11 := helper.Add(p10, helper.MultiplyBy(sma530, 4)) |
| 113 | + |
| 114 | + return p11 |
| 115 | +} |
0 commit comments