alpaca-trade-api 0.2.0 → 0.3.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/.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
|