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 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