alpaca-trade-api 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/CHANGELOG.md +10 -0
- data/Gemfile.lock +2 -2
- data/lib/alpaca/trade/api/bar.rb +4 -4
- data/lib/alpaca/trade/api/client.rb +66 -3
- data/lib/alpaca/trade/api/clock.rb +2 -2
- data/lib/alpaca/trade/api/errors.rb +1 -0
- data/lib/alpaca/trade/api/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b11b95c51e70df9f8dede233caff85b1f6ba320ef48223f352fb9aad667a7be
|
4
|
+
data.tar.gz: 34ec4d4d1d1a7e30cdae40bfcff47a672f604776b3165ec5b58ec837d5b37eed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c6e449816b441014290897abb54fec95c555f8a2d505ae7ca2e61bd11b234660fd72ea1705bd3b6c16d2aff2b55de6d2a349269dcf08bd39c5b7a0e39f251ad
|
7
|
+
data.tar.gz: 6237db054e3a43eb502be7676d6d13addc1f8d20dd52977297ee454081791360b7e987be4b6bfca5c5b86b4c0cc1e0edaf0acc7922350fbbca283a24ab14787d
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.6.
|
1
|
+
2.6.4
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [0.3.0] - 2019-09-19
|
8
|
+
### Added
|
9
|
+
- Implemented new endpoints:
|
10
|
+
* Client#cancel_orders
|
11
|
+
* Client#close_position
|
12
|
+
* Client#close_positions
|
13
|
+
* Client#replace_order
|
14
|
+
- Added limit as a parameter to Client#bars
|
15
|
+
- Renamed Clock#open to Clock#is_open and fixed assignment.
|
16
|
+
|
7
17
|
## [0.2.0] - 2019-07-10
|
8
18
|
### Added
|
9
19
|
- Implemented Client#calendar.
|
data/Gemfile.lock
CHANGED
data/lib/alpaca/trade/api/bar.rb
CHANGED
@@ -8,10 +8,10 @@ module Alpaca
|
|
8
8
|
|
9
9
|
def initialize(json)
|
10
10
|
@time = Time.at(json['t'])
|
11
|
-
@open = BigDecimal(json['o']
|
12
|
-
@high = BigDecimal(json['h']
|
13
|
-
@low = BigDecimal(json['l']
|
14
|
-
@close = BigDecimal(json['c']
|
11
|
+
@open = BigDecimal(json['o'].to_s)
|
12
|
+
@high = BigDecimal(json['h'].to_s)
|
13
|
+
@low = BigDecimal(json['l'].to_s)
|
14
|
+
@close = BigDecimal(json['c'].to_s)
|
15
15
|
@volume = json['v']
|
16
16
|
end
|
17
17
|
end
|
@@ -34,8 +34,8 @@ module Alpaca
|
|
34
34
|
json.map { |item| Asset.new(item) }
|
35
35
|
end
|
36
36
|
|
37
|
-
def bars(timeframe, symbols)
|
38
|
-
response = get_request(data_endpoint, "v1/bars/#{timeframe}", symbols: symbols.join(','))
|
37
|
+
def bars(timeframe, symbols, limit: 100)
|
38
|
+
response = get_request(data_endpoint, "v1/bars/#{timeframe}", symbols: symbols.join(','), limit: limit)
|
39
39
|
json = JSON.parse(response.body)
|
40
40
|
json.keys.each_with_object({}) do |symbol, hash|
|
41
41
|
hash[symbol] = json[symbol].map { |bar| Bar.new(bar) }
|
@@ -55,13 +55,46 @@ module Alpaca
|
|
55
55
|
raise OrderNotCancelable if response.status == 422
|
56
56
|
end
|
57
57
|
|
58
|
+
def cancel_orders
|
59
|
+
response = delete_request(endpoint, 'v2/orders')
|
60
|
+
|
61
|
+
json = JSON.parse(response.body)
|
62
|
+
json.map do |item|
|
63
|
+
{
|
64
|
+
'id' => item['id'],
|
65
|
+
'status' => item['status'],
|
66
|
+
'body' => Order.new(item['body']),
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
58
71
|
def clock
|
59
72
|
response = get_request(endpoint, 'v2/clock')
|
60
73
|
Clock.new(JSON.parse(response.body))
|
61
74
|
end
|
62
75
|
|
76
|
+
def close_position(symbol:)
|
77
|
+
response = delete_request(endpoint, "v2/positions/#{symbol}")
|
78
|
+
raise NoPositionForSymbol, JSON.parse(response.body)['message'] if response.status == 404
|
79
|
+
|
80
|
+
Position.new(JSON.parse(response.body))
|
81
|
+
end
|
82
|
+
|
83
|
+
def close_positions
|
84
|
+
response = delete_request(endpoint, 'v2/positions')
|
85
|
+
|
86
|
+
json = JSON.parse(response.body)
|
87
|
+
json.map do |item|
|
88
|
+
{
|
89
|
+
'symbol' => item['symbol'],
|
90
|
+
'status' => item['status'],
|
91
|
+
'body' => Position.new(item['body']),
|
92
|
+
}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
63
96
|
def new_order(symbol:, qty:, side:, type:, time_in_force:, limit_price: nil,
|
64
|
-
stop_price: nil, extended_hours
|
97
|
+
stop_price: nil, extended_hours: false, client_order_id: nil)
|
65
98
|
|
66
99
|
params = {
|
67
100
|
symbol: symbol,
|
@@ -108,6 +141,24 @@ module Alpaca
|
|
108
141
|
json.map { |item| Position.new(item) }
|
109
142
|
end
|
110
143
|
|
144
|
+
def replace_order(id:, qty: nil, time_in_force: nil, limit_price: nil,
|
145
|
+
stop_price: nil, client_order_id: nil)
|
146
|
+
|
147
|
+
params = {
|
148
|
+
qty: qty,
|
149
|
+
time_in_force: time_in_force,
|
150
|
+
limit_price: limit_price,
|
151
|
+
stop_price: stop_price,
|
152
|
+
client_order_id: client_order_id
|
153
|
+
}
|
154
|
+
response = patch_request(endpoint, "v2/orders/#{id}", params.compact)
|
155
|
+
raise InsufficientFunds, JSON.parse(response.body)['message'] if response.status == 403
|
156
|
+
raise InvalidOrderId, JSON.parse(response.body)['message'] if response.status == 404
|
157
|
+
raise InvalidRequest, JSON.parse(response.body)['message'] if response.status == 422
|
158
|
+
|
159
|
+
Order.new(JSON.parse(response.body))
|
160
|
+
end
|
161
|
+
|
111
162
|
private
|
112
163
|
|
113
164
|
def delete_request(endpoint, uri)
|
@@ -133,6 +184,18 @@ module Alpaca
|
|
133
184
|
response
|
134
185
|
end
|
135
186
|
|
187
|
+
def patch_request(endpoint, uri, params = {})
|
188
|
+
conn = Faraday.new(url: endpoint)
|
189
|
+
response = conn.patch(uri) do |req|
|
190
|
+
req.body = params.to_json
|
191
|
+
req.headers['APCA-API-KEY-ID'] = key_id
|
192
|
+
req.headers['APCA-API-SECRET-KEY'] = key_secret
|
193
|
+
end
|
194
|
+
|
195
|
+
possibly_raise_exception(response)
|
196
|
+
response
|
197
|
+
end
|
198
|
+
|
136
199
|
def post_request(endpoint, uri, params = {})
|
137
200
|
conn = Faraday.new(url: endpoint)
|
138
201
|
response = conn.post(uri) do |req|
|
@@ -4,11 +4,11 @@ module Alpaca
|
|
4
4
|
module Trade
|
5
5
|
module Api
|
6
6
|
class Clock
|
7
|
-
attr_reader :timestamp, :
|
7
|
+
attr_reader :timestamp, :is_open, :next_open, :next_close
|
8
8
|
|
9
9
|
def initialize(json)
|
10
10
|
@timestamp = json['timestamp']
|
11
|
-
@
|
11
|
+
@is_open = json['is_open']
|
12
12
|
@next_open = json['next_open']
|
13
13
|
@next_close = json['next_close']
|
14
14
|
end
|
@@ -7,6 +7,7 @@ module Alpaca
|
|
7
7
|
class InsufficientFunds < Error; end
|
8
8
|
class InternalServerError < Error; end
|
9
9
|
class InvalidOrderId < Error; end
|
10
|
+
class InvalidRequest < Error; end
|
10
11
|
class MissingParameters < Error; end
|
11
12
|
class NoPositionForSymbol < Error; end
|
12
13
|
class OrderNotCancelable < Error; end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alpaca-trade-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cloves Carneiro Jr
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|