alphavantage 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/Gemfile.lock +1 -1
- data/README.md +1 -0
- data/lib/alphavantage.rb +2 -1
- data/lib/alphavantage/indicator.rb +241 -0
- data/lib/alphavantage/normalize_key.rb +1 -1
- data/lib/alphavantage/validations.rb +27 -1
- data/lib/alphavantage/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: acaace4e62bf29e6aba9bd5998b4cefba6b05f51fcb7e249926d4ec595c7fae7
|
4
|
+
data.tar.gz: 6af34132223a9bff241714c23906351bcd5cc5aad91435ce8a04e04467b20ece
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 989affa5607d4e8ded7df6dcd67d6087557950a3bcc17239b8a2484ddb82b495dadf9bdf3ffb1a0c9e7412178d58108c1e1108810f068fe7c7571f65b83443b6
|
7
|
+
data.tar.gz: cdf9b3bbb6247501d7c319569927fda4aa7691ea6adfcf38d0d7e62c09081fb6195fad871549aac665e72b3d6f18192ba19f555809596ca3ce58130f42149fbd
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
[](https://badge.fury.io/rb/alphavantage)
|
1
2
|
# Alpha Vantage Ruby Library
|
2
3
|
|
3
4
|
The Alpha Vantage Ruby library provides convenient access to the [Alpha Vantage API](https://www.alphavantage.co/documentation/) from applications written in the Ruby language.
|
data/lib/alphavantage.rb
CHANGED
@@ -0,0 +1,241 @@
|
|
1
|
+
module Alphavantage
|
2
|
+
class Indicator
|
3
|
+
include Validations
|
4
|
+
|
5
|
+
def initialize(symbol:,interval:)
|
6
|
+
@symbol = symbol
|
7
|
+
@interval = interval
|
8
|
+
end
|
9
|
+
|
10
|
+
def sma(time_period:,series_type:)
|
11
|
+
Client.get(params: {
|
12
|
+
function: __callee__.upcase,
|
13
|
+
symbol: @symbol,
|
14
|
+
interval: validate_indicator_interval(@interval),
|
15
|
+
time_period: validate_integer(label: 'time period', value: time_period),
|
16
|
+
series_type: validate_series_type(series_type)
|
17
|
+
})
|
18
|
+
end
|
19
|
+
alias :ema :sma
|
20
|
+
alias :wma :sma
|
21
|
+
alias :dema :sma
|
22
|
+
alias :tema :sma
|
23
|
+
alias :trima :sma
|
24
|
+
alias :kama :sma
|
25
|
+
alias :mama :sma
|
26
|
+
alias :t3 :sma
|
27
|
+
alias :rsi :sma
|
28
|
+
alias :mom :sma
|
29
|
+
alias :cmo :sma
|
30
|
+
alias :roc :sma
|
31
|
+
alias :rocr :sma
|
32
|
+
alias :trix :sma
|
33
|
+
alias :midpoint :sma
|
34
|
+
|
35
|
+
def macd(series_type:, fastperiod: 12, slowperiod: 26, signalperiod: 9)
|
36
|
+
Client.get(params: {
|
37
|
+
function: __callee__.upcase,
|
38
|
+
symbol: @symbol,
|
39
|
+
interval: validate_indicator_interval(@interval),
|
40
|
+
series_type: validate_series_type(series_type),
|
41
|
+
fastperiod: validate_integer(label: 'fastperiod', value: fastperiod),
|
42
|
+
slowperiod: validate_integer(label: 'slowperiod', value: slowperiod),
|
43
|
+
signalperiod: validate_integer(label: 'signalperiod', value: signalperiod)
|
44
|
+
})
|
45
|
+
end
|
46
|
+
|
47
|
+
MOVING_AVERAGE_TYPES = {
|
48
|
+
sma: 0,
|
49
|
+
ema: 1,
|
50
|
+
wma: 2,
|
51
|
+
dema: 3,
|
52
|
+
tema: 4,
|
53
|
+
trima: 5,
|
54
|
+
t3: 6,
|
55
|
+
kama: 7,
|
56
|
+
mama: 8
|
57
|
+
}
|
58
|
+
|
59
|
+
def macdext(
|
60
|
+
series_type:,
|
61
|
+
fastperiod: 12,
|
62
|
+
slowperiod: 26,
|
63
|
+
signalperiod: 9,
|
64
|
+
fastmatype: 'sma',
|
65
|
+
slowmatype: 'sma',
|
66
|
+
signalmatype: 'sma'
|
67
|
+
)
|
68
|
+
Client.get(params: {
|
69
|
+
function: __callee__.upcase,
|
70
|
+
symbol: @symbol,
|
71
|
+
interval: validate_indicator_interval(@interval),
|
72
|
+
series_type: validate_series_type(series_type),
|
73
|
+
fastperiod: validate_integer(label: 'fastperiod', value: fastperiod),
|
74
|
+
slowperiod: validate_integer(label: 'slowperiod', value: slowperiod),
|
75
|
+
signalperiod: validate_integer(label: 'signalperiod', value: signalperiod),
|
76
|
+
fastmatype: validate_mat(MOVING_AVERAGE_TYPES[fastmatype.to_sym]),
|
77
|
+
slowmatype: validate_mat(MOVING_AVERAGE_TYPES[slowmatype.to_sym]),
|
78
|
+
signalmatype: validate_mat(MOVING_AVERAGE_TYPES[signalmatype.to_sym])
|
79
|
+
})
|
80
|
+
end
|
81
|
+
|
82
|
+
def stoch(
|
83
|
+
fastkperiod: 5,
|
84
|
+
slowkperiod: 3,
|
85
|
+
slowdperiod: 3,
|
86
|
+
slowkmatype: 'sma',
|
87
|
+
slowdmatype: 'sma'
|
88
|
+
)
|
89
|
+
Client.get(params: {
|
90
|
+
function: __callee__.upcase,
|
91
|
+
symbol: @symbol,
|
92
|
+
interval: validate_indicator_interval(@interval),
|
93
|
+
fastkperiod: validate_integer(label: 'fastkperiod', value: fastkperiod),
|
94
|
+
slowkperiod: validate_integer(label: 'slowkperiod', value: slowkperiod),
|
95
|
+
slowdperiod: validate_integer(label: 'slowdperiod', value: slowdperiod),
|
96
|
+
slowkmatype: validate_mat(MOVING_AVERAGE_TYPES[slowkmatype.to_sym]),
|
97
|
+
slowdmatype: validate_mat(MOVING_AVERAGE_TYPES[slowdmatype.to_sym])
|
98
|
+
})
|
99
|
+
end
|
100
|
+
|
101
|
+
def stochf(
|
102
|
+
fastkperiod: 5,
|
103
|
+
fastdperiod: 3,
|
104
|
+
fastdmatype: 'sma'
|
105
|
+
)
|
106
|
+
Client.get(params: {
|
107
|
+
function: __callee__.upcase,
|
108
|
+
symbol: @symbol,
|
109
|
+
interval: validate_indicator_interval(@interval),
|
110
|
+
fastkperiod: validate_integer(label: 'fastkperiod', value: fastkperiod),
|
111
|
+
fastdperiod: validate_integer(label: 'fastdperiod', value: fastdperiod),
|
112
|
+
fastdmatype: validate_mat(MOVING_AVERAGE_TYPES[fastdmatype.to_sym])
|
113
|
+
})
|
114
|
+
end
|
115
|
+
|
116
|
+
def stochrsi(
|
117
|
+
time_period:,
|
118
|
+
series_type:,
|
119
|
+
fastkperiod: 5,
|
120
|
+
fastdperiod: 3,
|
121
|
+
fastdmatype: 'sma'
|
122
|
+
)
|
123
|
+
Client.get(params: {
|
124
|
+
function: __callee__.upcase,
|
125
|
+
symbol: @symbol,
|
126
|
+
interval: validate_indicator_interval(@interval),
|
127
|
+
time_period: validate_integer(label: 'time period', value: time_period),
|
128
|
+
series_type: validate_series_type(series_type),
|
129
|
+
fastkperiod: validate_integer(label: 'fastkperiod', value: fastkperiod),
|
130
|
+
fastdperiod: validate_integer(label: 'fastdperiod', value: fastdperiod),
|
131
|
+
fastdmatype: validate_mat(MOVING_AVERAGE_TYPES[fastdmatype.to_sym])
|
132
|
+
})
|
133
|
+
end
|
134
|
+
|
135
|
+
def willr(time_period:)
|
136
|
+
Client.get(params: {
|
137
|
+
function: __callee__.upcase,
|
138
|
+
symbol: @symbol,
|
139
|
+
interval: validate_indicator_interval(@interval),
|
140
|
+
time_period: validate_integer(label: 'time period', value: time_period)
|
141
|
+
})
|
142
|
+
end
|
143
|
+
alias :adx :willr
|
144
|
+
alias :adxr :willr
|
145
|
+
alias :aroon :willr
|
146
|
+
alias :aroonosc :willr
|
147
|
+
alias :mfi :willr
|
148
|
+
alias :dx :willr
|
149
|
+
alias :minus_di :willr
|
150
|
+
alias :plus_di :willr
|
151
|
+
alias :minus_dm :willr
|
152
|
+
alias :plus_dm :willr
|
153
|
+
alias :midprice :willr
|
154
|
+
alias :atr :willr
|
155
|
+
alias :natr :willr
|
156
|
+
|
157
|
+
def vwap
|
158
|
+
Client.get(params: {
|
159
|
+
function: __callee__.upcase,
|
160
|
+
symbol: @symbol,
|
161
|
+
interval: [:bop,:trange,:ad,:obv].include?(__callee__) ? validate_indicator_interval(@interval) : validate_interval(@interval)
|
162
|
+
})
|
163
|
+
end
|
164
|
+
alias :bop :vwap
|
165
|
+
alias :trange :vwap
|
166
|
+
alias :ad :vwap
|
167
|
+
alias :obv :vwap
|
168
|
+
|
169
|
+
def adosc(fastperiod: 3, slowperiod: 10)
|
170
|
+
Client.get(params: {
|
171
|
+
function: __callee__.upcase,
|
172
|
+
symbol: @symbol,
|
173
|
+
interval: validate_indicator_interval(@interval),
|
174
|
+
fastperiod: validate_integer(label: 'fastperiod', value: fastperiod),
|
175
|
+
slowperiod: validate_integer(label: 'slowperiod', value: slowperiod)
|
176
|
+
})
|
177
|
+
end
|
178
|
+
|
179
|
+
def ht_trendline(series_type:)
|
180
|
+
Client.get(params: {
|
181
|
+
function: __callee__.upcase,
|
182
|
+
symbol: @symbol,
|
183
|
+
interval: validate_indicator_interval(@interval),
|
184
|
+
series_type: validate_series_type(series_type)
|
185
|
+
})
|
186
|
+
end
|
187
|
+
alias :ht_sine :ht_trendline
|
188
|
+
alias :ht_trendmode :ht_trendline
|
189
|
+
alias :ht_dcperiod :ht_trendline
|
190
|
+
alias :ht_dcphase :ht_trendline
|
191
|
+
alias :ht_phasor :ht_trendline
|
192
|
+
|
193
|
+
def apo(series_type:, fastperiod: 12, slowperiod: 26, matype: 'sma')
|
194
|
+
Client.get(params: {
|
195
|
+
function: __callee__.upcase,
|
196
|
+
symbol: @symbol,
|
197
|
+
interval: validate_indicator_interval(@interval),
|
198
|
+
series_type: validate_series_type(series_type),
|
199
|
+
fastperiod: validate_integer(label: 'fastperiod', value: fastperiod),
|
200
|
+
slowperiod: validate_integer(label: 'slowperiod', value: slowperiod),
|
201
|
+
matype: validate_mat(MOVING_AVERAGE_TYPES[matype.to_sym])
|
202
|
+
})
|
203
|
+
end
|
204
|
+
alias :ppo :apo
|
205
|
+
|
206
|
+
def bbands(time_period:, series_type:, nbdevup: 2, nbdevdn: 2, matype: 'sma')
|
207
|
+
Client.get(params: {
|
208
|
+
function: __callee__.upcase,
|
209
|
+
symbol: @symbol,
|
210
|
+
interval: validate_indicator_interval(@interval),
|
211
|
+
time_period: validate_integer(label: 'time period', value: time_period),
|
212
|
+
series_type: validate_series_type(series_type),
|
213
|
+
nbdevup: validate_integer(label: 'nbdevup', value: nbdevup),
|
214
|
+
nbdevdn: validate_integer(label: 'nbdevdn', value: nbdevdn),
|
215
|
+
matype: validate_mat(MOVING_AVERAGE_TYPES[matype.to_sym])
|
216
|
+
})
|
217
|
+
end
|
218
|
+
|
219
|
+
def sar(acceleration: 0.01, maximum: 0.20)
|
220
|
+
Client.get(params: {
|
221
|
+
function: __callee__.upcase,
|
222
|
+
symbol: @symbol,
|
223
|
+
interval: validate_indicator_interval(@interval),
|
224
|
+
acceleration: validate_integer(label: 'acceleration', value: acceleration),
|
225
|
+
maximum: validate_integer(label: 'maximum', value: maximum)
|
226
|
+
})
|
227
|
+
end
|
228
|
+
|
229
|
+
def ultosc(timeperiod1: 7, timeperiod2: 14, timeperiod3: 28)
|
230
|
+
Client.get(params: {
|
231
|
+
function: __callee__.upcase,
|
232
|
+
symbol: @symbol,
|
233
|
+
interval: validate_indicator_interval(@interval),
|
234
|
+
timeperiod1: validate_integer(label: 'timeperiod1', value: timeperiod1),
|
235
|
+
timeperiod2: validate_integer(label: 'timeperiod2', value: timeperiod2),
|
236
|
+
timeperiod3: validate_integer(label: 'timeperiod3', value: timeperiod3)
|
237
|
+
})
|
238
|
+
end
|
239
|
+
|
240
|
+
end
|
241
|
+
end
|
@@ -7,7 +7,9 @@ module Alphavantage
|
|
7
7
|
end.flatten
|
8
8
|
|
9
9
|
VALID_INTERVALS = %w{ 1min 5min 15min 30min 60min }
|
10
|
-
|
10
|
+
VALID_INDICATOR_INTERVALS = VALID_INTERVALS + %w{ daily weekly monthly }
|
11
|
+
VALID_OUTPUTSIZES = %w{ compact full }
|
12
|
+
VALID_SERIES_TYPE = %w{ close open high low }
|
11
13
|
|
12
14
|
private
|
13
15
|
|
@@ -25,5 +27,29 @@ module Alphavantage
|
|
25
27
|
raise Alphavantage::Error, "Invalid outputsize given." unless VALID_OUTPUTSIZES.include?(outputsize)
|
26
28
|
outputsize
|
27
29
|
end
|
30
|
+
|
31
|
+
def validate_indicator_interval(interval)
|
32
|
+
raise Alphavantage::Error, "Invalid interval given." unless VALID_INDICATOR_INTERVALS.include?(interval)
|
33
|
+
interval
|
34
|
+
end
|
35
|
+
|
36
|
+
def validate_series_type(series_type)
|
37
|
+
raise Alphavantage::Error, "Invalid series type given." unless VALID_SERIES_TYPE.include?(series_type)
|
38
|
+
series_type
|
39
|
+
end
|
40
|
+
|
41
|
+
def validate_integer(label:,value:)
|
42
|
+
raise Alphavantage::Error, "Invalid #{label} given. Must be integer." unless is_integer?(value)
|
43
|
+
value
|
44
|
+
end
|
45
|
+
|
46
|
+
def validate_mat(moving_average_type)
|
47
|
+
raise Alphavantage::Error, "Invalid moving average type given." if !(0..8).include?(moving_average_type)
|
48
|
+
moving_average_type
|
49
|
+
end
|
50
|
+
|
51
|
+
def is_integer?(str)
|
52
|
+
Integer(str) rescue false
|
53
|
+
end
|
28
54
|
end
|
29
55
|
end
|
data/lib/alphavantage/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alphavantage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrian Teh
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -135,6 +135,7 @@ files:
|
|
135
135
|
- lib/alphavantage/error.rb
|
136
136
|
- lib/alphavantage/forex.rb
|
137
137
|
- lib/alphavantage/fundamental.rb
|
138
|
+
- lib/alphavantage/indicator.rb
|
138
139
|
- lib/alphavantage/normalize_key.rb
|
139
140
|
- lib/alphavantage/time_series.rb
|
140
141
|
- lib/alphavantage/validations.rb
|