From 4199188f36dcc6b321e2789cdcdcca3c65c7a578 Mon Sep 17 00:00:00 2001 From: Onur Cinar Date: Wed, 27 Dec 2023 20:55:33 -0800 Subject: [PATCH] KDJ indicator is added. --- README.md | 8 +- trend/README.md | 86 ++++++++++++++ trend/kdj.go | 115 +++++++++++++++++++ trend/kdj_test.go | 53 +++++++++ trend/testdata/kdj.csv | 252 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 510 insertions(+), 4 deletions(-) create mode 100644 trend/kdj.go create mode 100644 trend/kdj_test.go create mode 100644 trend/testdata/kdj.csv diff --git a/README.md b/README.md index 5e7b64f..412f219 100644 --- a/README.md +++ b/README.md @@ -37,11 +37,11 @@ The following list of indicators are currently supported by this package: - [Exponential Moving Average (EMA)](trend/README.md#type-ema) - [Mass Index (MI)](trend/README.md#type-massindex) - [Moving Average Convergence Divergence (MACD)](trend/README.md#type-macd) -- [Moving Max](trend/README.md#func-movingmax) -- [Moving Min](trend/README.md#func-movingmin) -- [Moving Sum](trend/README.md#func-movingsum) +- [Moving Max](trend/README.md#type-movingmax) +- [Moving Min](trend/README.md#type-movingmin) +- [Moving Sum](trend/README.md#type-movingsum) - Parabolic SAR -- Random Index (KDJ) +- [Random Index (KDJ)](trend/README.md#type-kdj) - Rolling Moving Average (RMA) - [Simple Moving Average (SMA)](trend/README.md#type-sma) - [Since Change](helper/README.md#func-since) diff --git a/trend/README.md b/trend/README.md index b2b797e..a3b874a 100644 --- a/trend/README.md +++ b/trend/README.md @@ -41,6 +41,10 @@ The information provided on this project is strictly for informational purposes - [type Ema](<#Ema>) - [func NewEma\[T helper.Number\]\(\) \*Ema\[T\]](<#NewEma>) - [func \(ema \*Ema\[T\]\) Compute\(c \<\-chan T\) \<\-chan T](<#Ema[T].Compute>) +- [type Kdj](<#Kdj>) + - [func NewKdj\[T helper.Number\]\(\) \*Kdj\[T\]](<#NewKdj>) + - [func \(kdj \*Kdj\[T\]\) Compute\(high, low, closing \<\-chan T\) \(\<\-chan T, \<\-chan T, \<\-chan T\)](<#Kdj[T].Compute>) + - [func \(kdj \*Kdj\[T\]\) IdlePeriod\(\) int](<#Kdj[T].IdlePeriod>) - [type Macd](<#Macd>) - [func NewMacd\[T helper.Number\]\(\) \*Macd\[T\]](<#NewMacd>) - [func \(m \*Macd\[T\]\) Compute\(c \<\-chan T\) \(\<\-chan T, \<\-chan T\)](<#Macd[T].Compute>) @@ -95,6 +99,22 @@ const ( ) ``` + + +```go +const ( + // DefaultKdjMinMaxPeriod is the default period for moving min + // of low, and moving max of high. + DefaultKdjMinMaxPeriod = 9 + + // DefaultKdjSma1Period is the default period for SMA of RSV. + DefaultKdjSma1Period = 3 + + // DefaultKdjSma2Period is the default period for SMA of K. + DefaultKdjSma2Period = 3 +) +``` + ```go @@ -374,6 +394,72 @@ func (ema *Ema[T]) Compute(c <-chan T) <-chan T Compute function takes a channel of numbers and computes the EMA over the specified period. + +## type [Kdj]() + +Kdj represents the configuration parameters for calculating the KDJ, also known as the Random Index. KDJ is calculated similar to the Stochastic Oscillator with the difference of having the J line. It is used to analyze the trend and entry points. + +The K and D lines show if the asset is overbought when they crosses above 80%, and oversold when they crosses below 20%. The J line represents the divergence. + +``` +RSV = ((Closing - Min(Low, rPeriod)) +/ (Max(High, rPeriod) - Min(Low, rPeriod))) * 100 + +K = Sma(RSV, kPeriod) +D = Sma(K, dPeriod) +J = (3 * K) - (2 * D) +``` + +Example: + +``` +kdj := NewKdj[float64]() +values := kdj.Compute(highs, lows, closings) +``` + +```go +type Kdj[T helper.Number] struct { + // MovingMax is the highest high. + MovingMax *MovingMax[T] + + // MovingMin is the lowest low. + MovingMin *MovingMin[T] + + // Sma1 is the SMA of RSV. + Sma1 *Sma[T] + + // Sma2 is the SMA of K. + Sma2 *Sma[T] +} +``` + + +### func [NewKdj]() + +```go +func NewKdj[T helper.Number]() *Kdj[T] +``` + +NewKdj function initializes a new Kdj instance with the default parameters + + +### func \(\*Kdj\[T\]\) [Compute]() + +```go +func (kdj *Kdj[T]) Compute(high, low, closing <-chan T) (<-chan T, <-chan T, <-chan T) +``` + +Compute function takes a channel of numbers and computes the KDJ over the specified period. Returns K, D, J. + + +### func \(\*Kdj\[T\]\) [IdlePeriod]() + +```go +func (kdj *Kdj[T]) IdlePeriod() int +``` + +IdlePeriod is the initial period that KDJ won't yield any results. + ## type [Macd]() diff --git a/trend/kdj.go b/trend/kdj.go new file mode 100644 index 0000000..31edf5d --- /dev/null +++ b/trend/kdj.go @@ -0,0 +1,115 @@ +// Copyright (c) 2021-2023 Onur Cinar. +// The source code is provided under GNU AGPLv3 License. +// https://github.com/cinar/indicator + +package trend + +import "github.com/cinar/indicator/helper" + +const ( + // DefaultKdjMinMaxPeriod is the default period for moving min + // of low, and moving max of high. + DefaultKdjMinMaxPeriod = 9 + + // DefaultKdjSma1Period is the default period for SMA of RSV. + DefaultKdjSma1Period = 3 + + // DefaultKdjSma2Period is the default period for SMA of K. + DefaultKdjSma2Period = 3 +) + +// Kdj represents the configuration parameters for calculating the +// KDJ, also known as the Random Index. KDJ is calculated similar +// to the Stochastic Oscillator with the difference of having the +// J line. It is used to analyze the trend and entry points. +// +// The K and D lines show if the asset is overbought when they +// crosses above 80%, and oversold when they crosses below +// 20%. The J line represents the divergence. +// +// RSV = ((Closing - Min(Low, rPeriod)) +// / (Max(High, rPeriod) - Min(Low, rPeriod))) * 100 +// +// K = Sma(RSV, kPeriod) +// D = Sma(K, dPeriod) +// J = (3 * K) - (2 * D) +// +// Example: +// +// kdj := NewKdj[float64]() +// values := kdj.Compute(highs, lows, closings) +type Kdj[T helper.Number] struct { + // MovingMax is the highest high. + MovingMax *MovingMax[T] + + // MovingMin is the lowest low. + MovingMin *MovingMin[T] + + // Sma1 is the SMA of RSV. + Sma1 *Sma[T] + + // Sma2 is the SMA of K. + Sma2 *Sma[T] +} + +// NewKdj function initializes a new Kdj instance with the default parameters +func NewKdj[T helper.Number]() *Kdj[T] { + kdj := &Kdj[T]{ + MovingMax: NewMovingMax[T](), + MovingMin: NewMovingMin[T](), + Sma1: NewSma[T](), + Sma2: NewSma[T](), + } + + kdj.MovingMax.Period = DefaultKdjMinMaxPeriod + kdj.MovingMin.Period = DefaultKdjMinMaxPeriod + kdj.Sma1.Period = DefaultKdjSma1Period + kdj.Sma2.Period = DefaultKdjSma2Period + + return kdj +} + +// Compute function takes a channel of numbers and computes the KDJ +// over the specified period. Returns K, D, J. +func (kdj *Kdj[T]) Compute(high, low, closing <-chan T) (<-chan T, <-chan T, <-chan T) { + highest := kdj.MovingMax.Compute(high) + lowests := helper.Duplicate( + kdj.MovingMin.Compute(low), + 2, + ) + + closing = helper.Skip(closing, kdj.MovingMax.Period-1) + + rsv := helper.MultiplyBy( + helper.Divide( + helper.Subtract(closing, lowests[0]), + helper.Subtract(highest, lowests[1]), + ), + 100, + ) + + ks := helper.Duplicate( + kdj.Sma1.Compute(rsv), + 3, + ) + + ds := helper.Duplicate( + kdj.Sma2.Compute(ks[0]), + 2, + ) + + ks[1] = helper.Skip(ks[1], kdj.Sma2.Period-1) + ks[2] = helper.Skip(ks[2], kdj.Sma2.Period-1) + + j := helper.Subtract( + helper.MultiplyBy(ks[1], 3), + helper.MultiplyBy(ds[0], 2), + ) + + return ks[2], ds[1], j +} + +// IdlePeriod is the initial period that KDJ won't yield any results. +func (kdj *Kdj[T]) IdlePeriod() int { + return kdj.MovingMax.Period + kdj.Sma1.Period + kdj.Sma2.Period - 3 +} diff --git a/trend/kdj_test.go b/trend/kdj_test.go new file mode 100644 index 0000000..4253c62 --- /dev/null +++ b/trend/kdj_test.go @@ -0,0 +1,53 @@ +// Copyright (c) 2021-2023 Onur Cinar. +// The source code is provided under GNU AGPLv3 License. +// https://github.com/cinar/indicator + +package trend_test + +import ( + "testing" + + "github.com/cinar/indicator/helper" + "github.com/cinar/indicator/trend" +) + +func TestKdj(t *testing.T) { + type Data struct { + High float64 + Low float64 + Close float64 + K float64 + D float64 + J float64 + } + + input, err := helper.ReadFromCsvFile[Data]("testdata/kdj.csv", true) + if err != nil { + t.Fatal(err) + } + + inputs := helper.Duplicate(input, 6) + high := helper.Map(inputs[0], func(d *Data) float64 { return d.High }) + low := helper.Map(inputs[1], func(d *Data) float64 { return d.Low }) + closing := helper.Map(inputs[2], func(d *Data) float64 { return d.Close }) + expectedK := helper.Map(inputs[3], func(d *Data) float64 { return d.K }) + expectedD := helper.Map(inputs[4], func(d *Data) float64 { return d.D }) + expectedJ := helper.Map(inputs[5], func(d *Data) float64 { return d.J }) + + kdj := trend.NewKdj[float64]() + actualK, actualD, actualJ := kdj.Compute(high, low, closing) + + actualK = helper.RoundDigits(actualK, 2) + actualK = helper.Shift(actualK, kdj.IdlePeriod(), 0) + + actualD = helper.RoundDigits(actualD, 2) + actualD = helper.Shift(actualD, kdj.IdlePeriod(), 0) + + actualJ = helper.RoundDigits(actualJ, 2) + actualJ = helper.Shift(actualJ, kdj.IdlePeriod(), 0) + + err = helper.CheckEquals(actualK, expectedK, actualD, expectedD, actualJ, expectedJ) + if err != nil { + t.Fatal(err) + } +} diff --git a/trend/testdata/kdj.csv b/trend/testdata/kdj.csv new file mode 100644 index 0000000..5e59d60 --- /dev/null +++ b/trend/testdata/kdj.csv @@ -0,0 +1,252 @@ +High,Low,Close,K,D,J +318.600006,308.700012,318.600006,0,0,0 +319.559998,313.299988,315.839996,0,0,0 +316.380005,312.75,316.149994,0,0,0 +315.660004,308.730011,310.570007,0,0,0 +310.290009,306.350006,307.779999,0,0,0 +309.380005,304.920013,305.820007,0,0,0 +307.48999,305.089996,305.98999,0,0,0 +308.339996,304.709991,306.390015,0,0,0 +311.910004,305.459991,311.450012,0,0,0 +318.910004,310.820007,312.329987,0,0,0 +316.359985,308.399994,309.290009,0,0,0 +306.959991,299.450012,301.910004,0,0,0 +302.470001,297.76001,300,18.5,31.18,-6.88 +301.480011,297.149994,300.029999,12.16,20.91,-5.35 +304.190002,297,302,15.55,15.4,15.85 +308.540009,304.160004,307.820007,28.48,18.73,47.98 +306.5,297.640015,302.690002,32.72,25.58,47.01 +306.570007,300.929993,306.48999,39.56,33.59,51.49 +308.579987,304.649994,305.549988,37.82,36.7,40.05 +307.459991,303.26001,303.429993,47.67,41.68,59.64 +309.380005,305.23999,309.059998,65.7,50.4,96.32 +309.040009,305.619995,308.899994,83.02,65.46,118.14 +312.390015,307.380005,309.910004,92.47,80.4,116.62 +316.890015,311.25,314.549988,89.28,88.26,91.33 +314.230011,310,312.899994,83.67,88.48,74.05 +320.160004,313.380005,318.690002,86.49,86.48,86.51 +320.5,314.75,315.529999,80.93,83.7,75.41 +316.799988,313.339996,316.350006,79.82,82.41,74.63 +320.570007,316.600006,320.369995,81.93,80.89,84.01 +321.320007,317.720001,318.929993,86.47,82.74,93.92 +318.420013,315.790009,317.640015,85.69,84.7,87.68 +318.519989,314.25,314.859985,67.1,79.75,41.8 +315.540009,307.75,308.299988,40.2,64.33,-8.07 +307.23999,303.859985,305.230011,18.28,41.86,-28.89 +310.01001,304.359985,309.869995,15.44,24.64,-2.95 +312.730011,306.850006,310.420013,26.61,20.11,39.62 +312.829987,307.5,311.299988,38.2,26.75,61.1 +312.549988,307.709991,311.899994,42.08,35.63,54.97 +313.679993,309.579987,310.950012,45.67,41.98,53.05 +311.730011,308.339996,309.170013,43.54,43.77,43.1 +309.51001,306.809998,307.329987,38.1,42.44,29.42 +311.859985,305.790009,311.519989,47.98,43.21,57.52 +312.670013,306.380005,310.570007,58.11,48.06,78.22 +312.600006,308.299988,311.859985,73.86,59.98,101.6 +311.549988,305.920013,308.51001,59.35,63.77,50.49 +308.799988,305.600006,308.429993,48.81,60.67,25.09 +314.149994,306.630005,312.970001,51.9,53.35,48.99 +313.410004,308.01001,308.480011,51.64,50.78,53.34 +311.420013,306.98999,307.209991,46.24,49.92,38.86 +309.980011,305.279999,309.890015,34.83,44.23,16.02 +313.73999,309.619995,313.73999,55.39,45.49,75.21 +314.100006,309.040009,310.790009,69.82,53.35,102.77 +310.369995,308.279999,309.630005,68.85,64.69,77.16 +310.200012,306.869995,308.179993,47.95,62.21,19.44 +308.410004,305.480011,308.23999,38.37,51.72,11.66 +307.299988,300.5,302.720001,27.46,37.93,6.53 +305.269989,301.769989,303.160004,23.08,29.64,9.98 +305.559998,300.25,303.070007,18.75,23.1,10.05 +305.619995,300.01001,304.019989,22.79,21.54,25.3 +305.779999,302.01001,304.660004,27.27,22.94,35.95 +306.149994,303.410004,305.179993,37.12,29.06,53.24 +305.619995,302.079987,304.619995,42.72,35.7,56.74 +308.100006,301.450012,307.75,62.43,47.42,92.44 +312.660004,308.5,312.450012,78.57,61.24,113.24 +317.290009,312.429993,316.970001,96.21,79.07,130.49 +316.5,310.230011,311.119995,86.93,87.24,86.31 +312.679993,309.25,311.369995,76.06,86.4,55.38 +313.179993,303.940002,304.820007,50.44,71.14,9.03 +306.720001,301.920013,303.630005,33.59,53.36,-5.95 +306.589996,300.76001,302.880005,15.95,33.33,-18.79 +307.549988,301.679993,305.329987,18.08,22.54,9.15 +300.549988,294.899994,297.880005,17.93,17.32,19.14 +304.429993,295.359985,302.01001,24.24,20.08,32.55 +301.299988,292.420013,293.51001,16.53,19.56,10.46 +301.51001,295.059998,301.059998,25.97,22.24,33.41 +305.630005,302.25,303.850006,33.73,25.41,50.38 +307.049988,299.649994,299.730011,48.33,36.01,72.97 +302.079987,296.299988,298.369995,47.57,43.21,56.28 +299.5,293.390015,298.920013,43.53,46.48,37.65 +303.209991,298.970001,302.140015,49.58,46.89,54.94 +302.720001,300.589996,302.320007,59.02,50.71,75.65 +305.380005,303.359985,305.299988,74.05,60.88,100.38 +307.470001,302.579987,305.079987,79.58,70.88,96.97 +308.809998,304.98999,308.769989,90.27,81.3,108.21 +311.5,308.23999,310.309998,92.07,87.3,101.59 +311,307.070007,309.070007,93.25,91.86,96.03 +311.070007,307.850006,310.390015,91.29,92.2,89.48 +313.220001,309.049988,312.51001,91.82,92.12,91.23 +313.700012,310.329987,312.619995,93.55,92.22,96.21 +315.940002,311.769989,313.700012,90,91.79,86.43 +316.920013,313.720001,314.549988,86.16,89.9,78.66 +318.809998,313.26001,318.049988,87.07,87.74,85.72 +321.880005,318.119995,319.73999,87.84,87.02,89.48 +323.980011,319,323.790009,92.98,89.3,100.34 +325.720001,322.5,324.630005,92.78,91.2,95.93 +324.549988,322.76001,323.089996,92.33,92.69,91.61 +324.369995,321.320007,323.820007,88.59,91.23,83.31 +324.850006,321.609985,324.329987,87.3,89.41,83.09 +326.399994,324.299988,326.049988,91.68,89.19,96.64 +327.100006,324.109985,324.339996,89.14,89.37,88.68 +323.73999,319,320.529999,68.08,82.97,38.3 +326.910004,322.109985,326.230011,65.38,74.2,47.75 +328.809998,325.190002,328.549988,71.15,68.2,77.04 +331.839996,328.570007,330.170013,91.2,75.91,121.78 +330.25,322.76001,325.859985,79.26,80.54,76.7 +328.070007,323.059998,323.220001,57.76,76.07,21.14 +325.98999,317.410004,320,34.75,57.26,-10.27 +325.160004,322.619995,323.880005,31.88,41.46,12.72 +330.690002,325.790009,326.140015,41.09,35.91,51.47 +326.880005,323.480011,324.869995,52.34,41.77,73.48 +326.160004,320.149994,322.98999,50.29,47.91,55.05 +322.959991,319.809998,322.640015,42.2,48.28,30.05 +324.23999,320.540009,322.48999,37.72,43.4,26.36 +323.829987,320.130005,323.529999,40.19,40.04,40.5 +324.690002,322.359985,323.75,44.03,40.65,50.78 +328.26001,324.820007,327.390015,54.5,46.24,71.02 +329.980011,325.850006,329.76001,69.62,56.05,96.77 +333.940002,329.119995,330.390015,78.67,67.59,100.81 +331.48999,328.350006,329.130005,77.43,75.24,81.81 +329.269989,322.970001,323.109985,54.73,70.27,23.64 +323,319.559998,320.200012,31.25,54.47,-15.18 +320.559998,317.709991,319.019989,11.96,32.65,-29.42 +322.630005,319.670013,320.600006,10.11,17.77,-5.22 +322.470001,319,322.190002,17.83,13.3,26.88 +322.410004,319.390015,321.079987,22.06,16.66,32.84 +323.220001,319.529999,323.119995,27.23,22.37,36.95 +330.670013,324.420013,329.480011,46.5,31.93,75.65 +330.890015,327.570007,328.579987,67.07,46.94,107.35 +334.160004,328.679993,333.410004,87.78,67.12,129.09 +335.820007,331.429993,335.420013,91.9,82.25,111.2 +336.320007,334.100006,335.950012,97.03,92.24,106.62 +337.589996,334.920013,335.290009,94.43,94.45,94.38 +335.350006,332.220001,333.600006,87.86,93.11,77.36 +336.619995,332.200012,336.390015,86.35,89.55,79.97 +340.380005,334.089996,335.899994,81.12,85.11,73.14 +341.679993,335.540009,339.820007,84.03,83.84,84.43 +341.299988,337.660004,338.309998,77.61,80.92,70.98 +339.279999,336.619995,338.670013,77.18,79.61,72.32 +341.350006,336.369995,338.609985,70.78,75.19,61.95 +338.850006,335.660004,336.959991,62.82,70.26,47.95 +337.470001,334.190002,335.25,50,61.2,27.6 +335.829987,331.839996,334.119995,35.18,49.34,6.88 +336.730011,334.369995,335.339996,30.3,38.5,13.92 +336.399994,332.609985,334.149994,27.41,30.96,20.29 +337.01001,334.140015,336.910004,37.45,31.72,48.92 +342.5,338.399994,341,54.24,39.7,83.32 +342.079987,338.410004,342,78.18,56.62,121.3 +341.890015,338.700012,341.559998,90.81,74.41,123.6 +341.799988,338.910004,341.459991,92.25,87.08,102.58 +344.070007,340.390015,340.899994,85.17,89.41,76.69 +343.480011,339.869995,341.130005,79.56,85.66,67.36 +343.839996,340.929993,343.369995,80.77,81.83,78.65 +346.440002,344.309998,345.350006,86.46,82.26,94.85 +346.209991,343.450012,343.540009,82.99,83.41,82.15 +345,340.51001,341.089996,62.81,77.42,33.6 +345.720001,341.089996,344.25,56.34,67.38,34.25 +347.25,343.540009,345.339996,60.73,59.96,62.26 +345.380005,341.98999,342.429993,61.16,59.41,64.67 +346.790009,342.850006,346.609985,67.7,63.2,76.72 +347.619995,345.100006,345.76001,66.62,65.16,69.53 +351.190002,346.279999,349.630005,83.52,72.61,105.33 +349.660004,345.540009,347.579987,75.14,75.09,75.24 +351.089996,347.519989,349.799988,79.53,79.4,79.78 +351.269989,348.600006,349.309998,77.98,77.55,78.83 +351,348.320007,349.809998,84,80.5,91 +352.329987,350.209991,351.959991,87.15,83.04,95.35 +353.420013,351.25,352.26001,89.9,87.02,95.68 +352.890015,349.690002,351.190002,86.21,87.75,83.13 +354.470001,349.420013,353.809998,84.94,87.02,80.79 +355.109985,349.390015,349.98999,70.77,80.64,51.02 +364.630005,355.149994,362.579987,75.71,77.14,72.85 +364.25,358.850006,363.730011,76.33,74.27,80.46 +364.429993,356.059998,358.019989,80.66,77.57,86.84 +362.350006,355.920013,356.980011,67.92,74.97,53.82 +359.25,353.200012,358.350006,56.02,68.2,31.67 +358.950012,356.809998,358.480011,56.08,60.01,48.23 +357.920013,353.670013,354.5,50.66,54.25,43.46 +358.720001,353.380005,354.109985,41.38,49.37,25.4 +356.299988,351.880005,353.190002,24.93,38.99,-3.2 +354.299988,351.25,352.559998,17.06,27.79,-4.39 +354.179993,349.609985,352.089996,12.32,18.1,0.75 +353.5,349.660004,350.570007,11.4,13.59,7.02 +354.320007,351.540009,354.26001,24.17,15.96,40.58 +357.230011,354.130005,354.299988,35.33,23.63,58.72 +357.350006,352.920013,355.929993,55.94,38.48,90.87 +358.410004,354.529999,355.549988,61.6,50.96,82.88 +358.589996,354.01001,358.290009,77.08,64.87,101.49 +362.679993,358.600006,361.059998,83.16,73.94,101.58 +362.470001,359.25,360.200012,88.43,82.89,99.51 +363.390015,360.600006,362.459991,87.29,86.29,89.28 +366.470001,360,360.470001,78.02,84.58,64.91 +362.799988,359.26001,361.670013,72.54,79.28,59.05 +363.299988,360.869995,361.799988,63.31,71.29,47.34 +364.829987,361.769989,363.149994,67.82,67.89,67.69 +366.609985,364.51001,365.519989,76.75,69.29,91.65 +370.429993,365.470001,367.779999,80.77,75.11,92.08 +370.839996,365.970001,367.820007,80.96,79.49,83.91 +370.220001,368.26001,369.5,79.99,80.57,78.82 +370.200012,367.519989,367.859985,78.88,79.94,76.75 +371.329987,367.790009,370.429993,85.08,81.32,92.61 +373.339996,368.459991,370.480011,81.29,81.75,80.37 +371.339996,366.730011,366.820007,71.09,79.15,54.95 +367.200012,362.940002,363.279999,41.33,64.57,-5.15 +363.420013,359.76001,360.160004,16.62,43.01,-36.16 +361.890015,357.269989,361.709991,11.28,23.08,-12.31 +360.790009,357.950012,359.420013,14.65,14.18,15.58 +360.519989,354.269989,357.779999,19.8,15.25,28.92 +359.470001,356.670013,357.059998,15.47,16.64,13.13 +357.5,348.549988,350.299988,13.37,16.21,7.67 +350,345.410004,348.079987,10.66,13.17,5.65 +348.23999,342.130005,343.040009,7,10.34,0.3 +344.01001,339.51001,343.690002,10.47,9.38,12.66 +345.940002,342.369995,345.059998,15.3,10.92,24.07 +348.76001,341.859985,346.339996,24.79,16.86,40.67 +345.899994,342.829987,345.450012,28.39,22.83,39.51 +349.51001,345.5,348.559998,35.24,29.47,46.76 +349.600006,344.920013,348.429993,41.07,34.9,53.4 +348.660004,343.019989,345.660004,51.18,42.5,68.56 +348.440002,343.880005,345.089996,54.5,48.92,65.68 +349.940002,345.829987,346.230011,59.45,55.05,68.27 +348.410004,344.149994,345.390015,54.47,56.14,51.13 +344.829987,339.959991,340.890015,39.15,51.02,15.39 +342.690002,338.450012,338.660004,18.28,37.3,-19.76 +340,334.350006,335.859985,6.94,21.46,-22.08 +338.880005,333.48999,336.839996,10.63,11.95,7.98 +339.850006,337.769989,338.630005,20.43,12.67,35.96 +339.619995,336.549988,336.899994,24.11,18.39,35.56 +338.320007,335.459991,336.160004,22.74,22.43,23.35 +336.190002,330.579987,331.709991,14.43,20.43,2.44 +338.359985,332.179993,337.410004,23.5,20.22,30.05 +341.48999,337.5,341.329987,47.68,28.54,85.96 +345.329987,340.579987,343.75,75.33,48.84,128.32 +349.390015,344.5,349.019989,92.03,71.68,132.73 +354.350006,349.790009,351.809998,92.21,86.52,103.59 +354.029999,344.059998,346.630005,84.96,89.73,75.4 +346.950012,344.299988,346.170013,74.14,83.77,54.88 +348,344.690002,346.299988,66.41,75.17,48.9 +350.109985,346.880005,348.179993,67.96,69.51,64.88 +351.200012,348.600006,350.559998,71.94,68.77,78.27 +350.649994,348.809998,350.01001,72.72,70.87,76.41 +355.950012,351.25,354.25,77.23,73.96,83.77 +357.309998,354.480011,356.790009,83.42,77.79,94.68 +360,357.230011,359.859985,93.63,84.76,111.38 +360.559998,358.070007,358.929993,95.06,90.7,103.77 +362.609985,358.179993,361.329987,93.98,94.23,93.5 +363.029999,360.25,361,90.09,93.04,84.18 +362.459991,360.049988,361.799988,90.59,91.55,88.66 +363.190002,361.23999,362.679993,91.79,90.82,93.72 +362.640015,359.579987,361.339996,90.81,91.06,90.31 +362.119995,359.209991,360.049988,81.64,88.08,68.75 +361.519989,358.299988,358.690002,57.65,76.7,19.55