alpaca-trade-api 0.3.0 → 0.4.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/CHANGELOG.md +5 -0
- data/Gemfile.lock +1 -1
- data/README.md +38 -7
- data/lib/alpaca/trade/api/client.rb +15 -1
- data/lib/alpaca/trade/api/order.rb +25 -18
- 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: 4226e3207279468a4ccafa2fd3bb303bf1d3695446a9e245f42437c6a5209614
|
4
|
+
data.tar.gz: a54c2fbe8f5cd7b1f8c0a2a161122b7ef9d4088be73309649c9898a421c75095
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc02ec91bf7d1f41adf99142665f0c2d690379afb2e064832453eb49e4afc3ca0fbc5714ce746a011fbac878c2d9d8b95a1235a2c0b9d8a88d68c9137f47d934
|
7
|
+
data.tar.gz: 02b4c968b277f98a6d2a017d4917326b96744790611641cbb02066abc0c0f90b23b1c927232a4ca92f3a0dd21c01b33a345fa39fc5bf34cec6078a48897fc16e
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,11 @@ 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.4.0] - 2020-02-16
|
8
|
+
### Added
|
9
|
+
- Supporting [Bracket Orders](https://docs.alpaca.markets/trading-on-alpaca/orders/#bracket-orders)
|
10
|
+
- Validating time frame in Client#bars
|
11
|
+
|
7
12
|
## [0.3.0] - 2019-09-19
|
8
13
|
### Added
|
9
14
|
- Implemented new endpoints:
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -26,23 +26,54 @@ By default, the library is configured to use the Paper Trading host - `https://p
|
|
26
26
|
|
27
27
|
```ruby
|
28
28
|
Alpaca::Trade::Api.configure do |config|
|
29
|
-
config.endpoint = 'https://api.
|
29
|
+
config.endpoint = 'https://api.alpaca.markets'
|
30
30
|
config.key_id = 'A_KEY_ID'
|
31
31
|
config.key_secret = 'A_S3CRET'
|
32
32
|
end
|
33
33
|
```
|
34
34
|
|
35
|
-
### Account
|
36
35
|
|
37
|
-
|
36
|
+
### Example
|
38
37
|
|
39
|
-
|
38
|
+
Here's an example on how to use the library to read details of an account's orders in paper trading.
|
40
39
|
|
41
|
-
|
40
|
+
```ruby
|
41
|
+
require 'alpaca/trade/api'
|
42
42
|
|
43
|
-
|
43
|
+
Alpaca::Trade::Api.configure do |config|
|
44
|
+
config.endpoint = 'https://paper-api.alpaca.markets'
|
45
|
+
config.key_id = 'xxxxxxxx'
|
46
|
+
config.key_secret = 'xxxxx'
|
47
|
+
end
|
48
|
+
|
49
|
+
client = Alpaca::Trade::Api::Client.new
|
50
|
+
puts client.orders.last.inspect
|
51
|
+
```
|
44
52
|
|
45
|
-
|
53
|
+
### Supported endpoints
|
54
|
+
|
55
|
+
Here's a table with all currently supported endpoints in this library:
|
56
|
+
|
57
|
+
| Object | Action | Method |
|
58
|
+
|------------------------------------------------------------------------------|---------------------------------------|--------------------------------|
|
59
|
+
| [Account](https://docs.alpaca.markets/api-documentation/api-v2/account/) | [GET] Get the account | Client#account |
|
60
|
+
| [Orders](https://docs.alpaca.markets/api-documentation/api-v2/orders/) | [GET] Get a list of orders | Client#order |
|
61
|
+
| | [POST] Request a new order | Client#new_order |
|
62
|
+
| | [GET] Get an order | Client#order(id:) |
|
63
|
+
| | [GET] Get an order by client order id | Client#order(id:) |
|
64
|
+
| | [PATCH] Replace an order | Client#replace_order |
|
65
|
+
| | [DELETE] Cancel all orders | Client#cancel_orders |
|
66
|
+
| | [DELETE] Cancel an order | Client#cancel_order(id:) |
|
67
|
+
| [Positions](https://docs.alpaca.markets/api-documentation/api-v2/positions/) | [GET] Get open positions | Client#positions |
|
68
|
+
| | [GET] Get an open position | Client#position(symbol:) |
|
69
|
+
| | [DELETE] Close all positions | Client#close_positions |
|
70
|
+
| | [DELETE] Close a position | Client#close_position(symbol:) |
|
71
|
+
| [Assets](https://docs.alpaca.markets/api-documentation/api-v2/assets/) | [GET] Get assets | Client#assets |
|
72
|
+
| | [GET] Get assets/:id | Client#asset(symbol:) |
|
73
|
+
| | [GET] Get an asset | Client#asset(symbol:) |
|
74
|
+
| [Calendar](https://docs.alpaca.markets/api-documentation/api-v2/calendar/) | [GET] Get the calendar | Client#calendar(start_date:, end_date:) |
|
75
|
+
| [Clock](https://docs.alpaca.markets/api-documentation/api-v2/clock/) | [GET] Get the clock | Client#clock |
|
76
|
+
| [Bars](https://docs.alpaca.markets/api-documentation/api-v2/market-data/bars/) | [GET] Get a list of bars | Client#bars(timeframe, symbols, limit:) |
|
46
77
|
|
47
78
|
## Development
|
48
79
|
|
@@ -9,6 +9,8 @@ module Alpaca
|
|
9
9
|
class Client
|
10
10
|
attr_reader :data_endpoint, :endpoint, :key_id, :key_secret
|
11
11
|
|
12
|
+
TIMEFRAMES = ['minute', '1Min', '5Min', '15Min', 'day', '1D']
|
13
|
+
|
12
14
|
def initialize(endpoint: Alpaca::Trade::Api.configuration.endpoint,
|
13
15
|
key_id: Alpaca::Trade::Api.configuration.key_id,
|
14
16
|
key_secret: Alpaca::Trade::Api.configuration.key_secret)
|
@@ -35,6 +37,7 @@ module Alpaca
|
|
35
37
|
end
|
36
38
|
|
37
39
|
def bars(timeframe, symbols, limit: 100)
|
40
|
+
validate_timeframe(timeframe)
|
38
41
|
response = get_request(data_endpoint, "v1/bars/#{timeframe}", symbols: symbols.join(','), limit: limit)
|
39
42
|
json = JSON.parse(response.body)
|
40
43
|
json.keys.each_with_object({}) do |symbol, hash|
|
@@ -43,6 +46,7 @@ module Alpaca
|
|
43
46
|
end
|
44
47
|
|
45
48
|
def calendar(start_date: Date.today, end_date: (Date.today + 30))
|
49
|
+
# FIX, use start_date.strftime('%F')
|
46
50
|
params = { "start" => start_date.iso8601, "end" => end_date.iso8601 }
|
47
51
|
response = get_request(endpoint, "v2/calendar", params)
|
48
52
|
json = JSON.parse(response.body)
|
@@ -94,7 +98,8 @@ module Alpaca
|
|
94
98
|
end
|
95
99
|
|
96
100
|
def new_order(symbol:, qty:, side:, type:, time_in_force:, limit_price: nil,
|
97
|
-
stop_price: nil, extended_hours: false, client_order_id: nil
|
101
|
+
stop_price: nil, extended_hours: false, client_order_id: nil, order_class: nil,
|
102
|
+
take_profit: nil, stop_loss: nil)
|
98
103
|
|
99
104
|
params = {
|
100
105
|
symbol: symbol,
|
@@ -103,7 +108,10 @@ module Alpaca
|
|
103
108
|
type: type,
|
104
109
|
time_in_force: time_in_force,
|
105
110
|
limit_price: limit_price,
|
111
|
+
order_class: order_class,
|
106
112
|
stop_price: stop_price,
|
113
|
+
take_profit: take_profit,
|
114
|
+
stop_loss: stop_loss,
|
107
115
|
extended_hours: extended_hours,
|
108
116
|
client_order_id: client_order_id
|
109
117
|
}
|
@@ -219,6 +227,12 @@ module Alpaca
|
|
219
227
|
raise InternalServerError, JSON.parse(response.body)['message']
|
220
228
|
end
|
221
229
|
end
|
230
|
+
|
231
|
+
def validate_timeframe(timeframe)
|
232
|
+
unless TIMEFRAMES.include?(timeframe)
|
233
|
+
raise ArgumentError, "Invalid timeframe: #{timeframe}. Valid arguments are: #{TIMEFRAMES}"
|
234
|
+
end
|
235
|
+
end
|
222
236
|
end
|
223
237
|
end
|
224
238
|
end
|
@@ -4,34 +4,41 @@ module Alpaca
|
|
4
4
|
module Trade
|
5
5
|
module Api
|
6
6
|
class Order
|
7
|
-
attr_reader :id, :
|
8
|
-
:
|
9
|
-
:
|
10
|
-
:
|
7
|
+
attr_reader :id, :asset_class, :asset_id, :canceled_at, :client_order_id,
|
8
|
+
:created_at, :expired_at, :extended_hours, :failed_at, :filled_at, :filled_avg_price,
|
9
|
+
:filled_qty, :legs, :limit_price, :order_class, :qty, :replaced_at, :replaced_by,
|
10
|
+
:replaces, :side, :status, :stop_price, :submitted_at, :symbol, :time_in_force,
|
11
|
+
:type, :updated_at
|
11
12
|
|
12
13
|
def initialize(json)
|
13
14
|
@id = json['id']
|
15
|
+
|
16
|
+
@asset_class = json['asset_class']
|
17
|
+
@asset_id = json['asset_id']
|
18
|
+
@canceled_at = json['canceled_at']
|
14
19
|
@client_order_id = json['client_order_id']
|
15
20
|
@created_at = json['created_at']
|
16
|
-
@updated_at = json['updated_at']
|
17
|
-
@submitted_at = json['submitted_at']
|
18
|
-
@filled_at = json['filled_at']
|
19
21
|
@expired_at = json['expired_at']
|
20
|
-
@
|
22
|
+
@extended_hours = json['extended_hours']
|
21
23
|
@failed_at = json['failed_at']
|
22
|
-
@
|
23
|
-
@
|
24
|
-
@asset_class = json['asset_class']
|
25
|
-
@qty = json['qty']
|
24
|
+
@filled_at = json['filled_at']
|
25
|
+
@filled_avg_price = json['filled_avg_price']
|
26
26
|
@filled_qty = json['filled_qty']
|
27
|
-
@
|
28
|
-
@side = json['side']
|
29
|
-
@time_in_force = json['time_in_force']
|
27
|
+
@legs = (json['legs'] || []).map {|leg| Order.new(leg)}
|
30
28
|
@limit_price = json['limit_price']
|
31
|
-
@
|
32
|
-
@
|
29
|
+
@order_class = json['order_class']
|
30
|
+
@qty = json['qty']
|
31
|
+
@replaced_at = json['replaced_at']
|
32
|
+
@replaced_by = json['replaced_by']
|
33
|
+
@replaces = json['replaces']
|
34
|
+
@side = json['side']
|
33
35
|
@status = json['status']
|
34
|
-
@
|
36
|
+
@stop_price = json['stop_price']
|
37
|
+
@submitted_at = json['submitted_at']
|
38
|
+
@symbol = json['symbol']
|
39
|
+
@time_in_force = json['time_in_force']
|
40
|
+
@type = json['type']
|
41
|
+
@updated_at = json['updated_at']
|
35
42
|
end
|
36
43
|
end
|
37
44
|
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.4.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:
|
11
|
+
date: 2020-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|