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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: eb5dd189cbc0f77a733ae7a00b6a3448f8071b89bc47f90b749d64c1a34d2709
4
- data.tar.gz: f5a81f245c4bd2de6b2670cb07d3dfa80988cb1e7eeec8e794969a35493a890e
3
+ metadata.gz: 7b11b95c51e70df9f8dede233caff85b1f6ba320ef48223f352fb9aad667a7be
4
+ data.tar.gz: 34ec4d4d1d1a7e30cdae40bfcff47a672f604776b3165ec5b58ec837d5b37eed
5
5
  SHA512:
6
- metadata.gz: 9e7090ca6b7ab5dbcb57903d3a90538f76abe585c147294ecc00a366c94e07cce9ac4107bcc537396553ddf5ab9dff8d4138da27d0404635ff9651cdee54755e
7
- data.tar.gz: fc7b23fa07cb3dad7b9f705ac812a9370c78f92434bdca44beb30e3c891eecd5424aea72fa0173d898e5bb2c16759387fa594763132e60cad9d9c44130540a99
6
+ metadata.gz: 6c6e449816b441014290897abb54fec95c555f8a2d505ae7ca2e61bd11b234660fd72ea1705bd3b6c16d2aff2b55de6d2a349269dcf08bd39c5b7a0e39f251ad
7
+ data.tar.gz: 6237db054e3a43eb502be7676d6d13addc1f8d20dd52977297ee454081791360b7e987be4b6bfca5c5b86b4c0cc1e0edaf0acc7922350fbbca283a24ab14787d
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.2
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- alpaca-trade-api (0.1.0)
4
+ alpaca-trade-api (0.3.0)
5
5
  faraday (~> 0.15)
6
6
 
7
7
  GEM
@@ -62,4 +62,4 @@ DEPENDENCIES
62
62
  webmock (~> 3.0)
63
63
 
64
64
  BUNDLED WITH
65
- 2.0.1
65
+ 2.0.2
@@ -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'], 2)
12
- @high = BigDecimal(json['h'], 2)
13
- @low = BigDecimal(json['l'], 2)
14
- @close = BigDecimal(json['c'], 2)
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:, client_order_id: nil)
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, :open, :next_open, :next_close
7
+ attr_reader :timestamp, :is_open, :next_open, :next_close
8
8
 
9
9
  def initialize(json)
10
10
  @timestamp = json['timestamp']
11
- @open = json['open']
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
@@ -3,7 +3,7 @@
3
3
  module Alpaca
4
4
  module Trade
5
5
  module Api
6
- VERSION = '0.2.0'
6
+ VERSION = '0.3.0'
7
7
  end
8
8
  end
9
9
  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.2.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-07-11 00:00:00.000000000 Z
11
+ date: 2019-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler