oanda_api_v20 0.0.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 +7 -0
- data/.gitignore +2 -0
- data/lib/oanda_api_v20/accounts.rb +35 -0
- data/lib/oanda_api_v20/api.rb +18 -0
- data/lib/oanda_api_v20/client.rb +98 -0
- data/lib/oanda_api_v20/oanda_api_v20.rb +7 -0
- data/lib/oanda_api_v20/orders.rb +39 -0
- data/lib/oanda_api_v20/positions.rb +33 -0
- data/lib/oanda_api_v20/pricing.rb +9 -0
- data/lib/oanda_api_v20/trades.rb +38 -0
- data/lib/oanda_api_v20/transactions.rb +24 -0
- data/lib/oanda_api_v20/version.rb +3 -0
- data/lib/oanda_api_v20.rb +13 -0
- data/oanda_api_v20.gemspec +23 -0
- metadata +84 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3c9ce33c83a1acdd9dc8bde4d5a20f6114d5504d
|
4
|
+
data.tar.gz: 4a16b74d5edf031d265b7290ac3767e06051fc2f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a7ded07fe6f08a1973aab921ee162274b8a320d55d8610d3dcccfd664f4f015d037f371f8dac13d0d4b291e578f182d45e102964c6d94cd34118e8000e4f6a15
|
7
|
+
data.tar.gz: 226e9282b316e6479c0a0ba91bd635471b5d1dd63cc5b49ec880902156cf42adaad47ffb605f43370242058ea1e0170badf4caf5abe46e25505e779d51edaccd
|
data/.gitignore
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# @see http://developer.oanda.com/rest-live-v20/account-ep/
|
2
|
+
module OandaApiV20
|
3
|
+
module Accounts
|
4
|
+
# GET /v3/accounts/:account_id
|
5
|
+
def account(id)
|
6
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{id}", headers: headers)
|
7
|
+
end
|
8
|
+
|
9
|
+
# GET /v3/accounts
|
10
|
+
def accounts
|
11
|
+
Client.send(http_verb, "#{base_uri}/accounts", headers: headers)
|
12
|
+
end
|
13
|
+
|
14
|
+
# GET /v3/accounts/:account_id/summary
|
15
|
+
def summary
|
16
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/summary", headers: headers)
|
17
|
+
end
|
18
|
+
|
19
|
+
# GET /v3/accounts/:account_id/instruments
|
20
|
+
def instruments
|
21
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/instruments", headers: headers)
|
22
|
+
end
|
23
|
+
|
24
|
+
# GET /v3/accounts/:account_id/changes
|
25
|
+
def changes
|
26
|
+
options = { 'sinceTransactionID' => last_transaction_id }
|
27
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/changes", headers: headers, query: options)
|
28
|
+
end
|
29
|
+
|
30
|
+
# PATCH /v3/accounts/:account_id/configuration
|
31
|
+
def configuration(options = {})
|
32
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/configuration", headers: headers, body: options.to_json)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module OandaApiV20
|
2
|
+
class Api
|
3
|
+
include Accounts
|
4
|
+
include Orders
|
5
|
+
include Trades
|
6
|
+
include Positions
|
7
|
+
include Transactions
|
8
|
+
include Pricing
|
9
|
+
|
10
|
+
attr_accessor :http_verb, :base_uri, :headers, :account_id, :last_transaction_id
|
11
|
+
|
12
|
+
def initialize(options = {})
|
13
|
+
options.each do |key, value|
|
14
|
+
self.send("#{key}=", value) if self.respond_to?("#{key}=")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module OandaApiV20
|
2
|
+
class Client
|
3
|
+
include HTTParty
|
4
|
+
|
5
|
+
BASE_URI = {
|
6
|
+
live: 'https://api-fxtrade.oanda.com/v3',
|
7
|
+
practice: 'https://api-fxpractice.oanda.com/v3'
|
8
|
+
}
|
9
|
+
|
10
|
+
attr_accessor :access_token
|
11
|
+
attr_reader :base_uri, :headers
|
12
|
+
|
13
|
+
def initialize(options = {})
|
14
|
+
options.each do |key, value|
|
15
|
+
self.send("#{key}=", value) if self.respond_to?("#{key}=")
|
16
|
+
end
|
17
|
+
|
18
|
+
@base_uri = options[:practice] == true ? BASE_URI[:practice] : BASE_URI[:live]
|
19
|
+
|
20
|
+
@headers = {}
|
21
|
+
@headers['Authorization'] = "Bearer #{access_token}"
|
22
|
+
@headers['X-Accept-Datetime-Format'] = 'RFC3339'
|
23
|
+
@headers['Content-Type'] = 'application/json'
|
24
|
+
end
|
25
|
+
|
26
|
+
def method_missing(name, *args, &block)
|
27
|
+
case name
|
28
|
+
when :show, :create, :update, :cancel, :close
|
29
|
+
set_http_verb(name, last_action)
|
30
|
+
api = Api.new(api_attributes)
|
31
|
+
|
32
|
+
if api.respond_to?(last_action)
|
33
|
+
response = last_arguments.nil? || last_arguments.empty? ? api.send(last_action, &block) : api.send(last_action, *last_arguments, &block)
|
34
|
+
api_result = JSON.parse(response.body)
|
35
|
+
set_last_transaction_id(api_result)
|
36
|
+
end
|
37
|
+
|
38
|
+
api_result
|
39
|
+
when *api_methods
|
40
|
+
set_last_action_and_arguments(name, args)
|
41
|
+
set_account_id(args.first) if name == :account
|
42
|
+
self
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
attr_accessor :http_verb, :account_id, :last_transaction_id, :last_action, :last_arguments
|
49
|
+
|
50
|
+
def api_methods
|
51
|
+
Accounts.instance_methods + Orders.instance_methods + Trades.instance_methods + Positions.instance_methods + Transactions.instance_methods + Pricing.instance_methods
|
52
|
+
end
|
53
|
+
|
54
|
+
def set_last_action_and_arguments(action, args)
|
55
|
+
set_last_action(action)
|
56
|
+
set_last_arguments(args)
|
57
|
+
end
|
58
|
+
|
59
|
+
def set_last_action(action)
|
60
|
+
self.last_action = action
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_last_arguments(args)
|
64
|
+
self.last_arguments = args.nil? || args.empty? ? nil : args.flatten
|
65
|
+
end
|
66
|
+
|
67
|
+
def set_account_id(id)
|
68
|
+
self.account_id = id
|
69
|
+
end
|
70
|
+
|
71
|
+
def set_last_transaction_id(api_result)
|
72
|
+
self.last_transaction_id = api_result['lastTransactionID'] if api_result['lastTransactionID']
|
73
|
+
end
|
74
|
+
|
75
|
+
def set_http_verb(action, last_action)
|
76
|
+
case action
|
77
|
+
when :show
|
78
|
+
self.http_verb = :get
|
79
|
+
when :update, :cancel, :close
|
80
|
+
[:configuration].include?(last_action) ? self.http_verb = :patch : self.http_verb = :put
|
81
|
+
when :create
|
82
|
+
self.http_verb = :post
|
83
|
+
else
|
84
|
+
self.http_verb = nil
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def api_attributes
|
89
|
+
{
|
90
|
+
http_verb: http_verb,
|
91
|
+
base_uri: base_uri,
|
92
|
+
headers: headers,
|
93
|
+
account_id: account_id,
|
94
|
+
last_transaction_id: last_transaction_id
|
95
|
+
}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# @see http://developer.oanda.com/rest-live-v20/orders-ep/
|
2
|
+
module OandaApiV20
|
3
|
+
module Orders
|
4
|
+
# POST /v3/accounts/:account_id/orders
|
5
|
+
# GET /v3/accounts/:account_id/orders/:order_id
|
6
|
+
# PUT /v3/accounts/:account_id/orders/:order_id
|
7
|
+
# PUT /v3/accounts/:account_id/orders/:order_id/clientExtensions
|
8
|
+
# PUT /v3/accounts/:account_id/orders/:order_id/cancel
|
9
|
+
def order(*args)
|
10
|
+
id_or_options = args.shift
|
11
|
+
id_or_options.is_a?(Hash) ? options = id_or_options : id = id_or_options
|
12
|
+
options = args.shift unless args.nil? || args.empty?
|
13
|
+
|
14
|
+
url = id ? "#{base_uri}/accounts/#{account_id}/orders/#{id}" : "#{base_uri}/accounts/#{account_id}/orders"
|
15
|
+
url = order_url_for_put(url, options) if http_verb == :put
|
16
|
+
|
17
|
+
options ? Client.send(http_verb, url, headers: headers, body: options.to_json) : Client.send(http_verb, url, headers: headers)
|
18
|
+
end
|
19
|
+
|
20
|
+
# GET /v3/accounts/:account_id/orders
|
21
|
+
def orders
|
22
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/orders", headers: headers)
|
23
|
+
end
|
24
|
+
|
25
|
+
# GET /v3/accounts/:account_id/pendingOrders
|
26
|
+
def pending_orders
|
27
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/pendingOrders", headers: headers)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def order_url_for_put(url, options = nil)
|
33
|
+
return "#{url}/cancel" unless options
|
34
|
+
return "#{url}/clientExtensions" if options['clientExtensions'] || options['tradeClientExtensions']
|
35
|
+
return url if options['order']
|
36
|
+
return url
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# @see http://developer.oanda.com/rest-live-v20/positions-ep/
|
2
|
+
module OandaApiV20
|
3
|
+
module Positions
|
4
|
+
# GET /v3/accounts/:account_id/positions/:instrument
|
5
|
+
def position(*args)
|
6
|
+
instrument = args.shift
|
7
|
+
options = args.shift unless args.nil? || args.empty?
|
8
|
+
|
9
|
+
url = "#{base_uri}/accounts/#{account_id}/positions/#{instrument}"
|
10
|
+
url = position_url_for_put(url, options) if http_verb == :put
|
11
|
+
|
12
|
+
options ? Client.send(http_verb, url, headers: headers, body: options.to_json) : Client.send(http_verb, url, headers: headers)
|
13
|
+
end
|
14
|
+
|
15
|
+
# GET /v3/accounts/:account_id/positions
|
16
|
+
def positions
|
17
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/positions", headers: headers)
|
18
|
+
end
|
19
|
+
|
20
|
+
# GET /v3/accounts/:account_id/openPositions
|
21
|
+
def open_positions
|
22
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/openPositions", headers: headers)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def position_url_for_put(url, options = nil)
|
28
|
+
return "#{url}/close" unless options
|
29
|
+
return "#{url}/close" if options['longUnits'] || options['longClientExtensions'] || options['shortUnits'] || options['shortClientExtensions']
|
30
|
+
return url
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
# @see http://developer.oanda.com/rest-live-v20/pricing-ep/
|
2
|
+
module OandaApiV20
|
3
|
+
module Pricing
|
4
|
+
# GET /v3/accounts/:account_id/pricing
|
5
|
+
def pricing(options)
|
6
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/pricing", headers: headers, query: options)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# @see http://developer.oanda.com/rest-live-v20/trades-ep/
|
2
|
+
module OandaApiV20
|
3
|
+
module Trades
|
4
|
+
# GET /v3/accounts/:account_id/trades/:trade_id
|
5
|
+
# PUT /v3/accounts/:account_id/trades/:trade_id/orders
|
6
|
+
# PUT /v3/accounts/:account_id/trades/:trade_id/clientExtensions
|
7
|
+
# PUT /v3/accounts/:account_id/trades/:trade_id/close
|
8
|
+
def trade(*args)
|
9
|
+
id = args.shift
|
10
|
+
options = args.shift unless args.nil? || args.empty?
|
11
|
+
|
12
|
+
url = "#{base_uri}/accounts/#{account_id}/trades/#{id}"
|
13
|
+
url = trade_url_for_put(url, options) if http_verb == :put
|
14
|
+
|
15
|
+
options ? Client.send(http_verb, url, headers: headers, body: options.to_json) : Client.send(http_verb, url, headers: headers)
|
16
|
+
end
|
17
|
+
|
18
|
+
# GET /v3/accounts/:account_id/trades
|
19
|
+
def trades(options)
|
20
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/trades", headers: headers, query: options)
|
21
|
+
end
|
22
|
+
|
23
|
+
# GET /v3/accounts/:account_id/openTrades
|
24
|
+
def open_trades
|
25
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/openTrades", headers: headers)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def trade_url_for_put(url, options = nil)
|
31
|
+
return "#{url}/close" unless options
|
32
|
+
return "#{url}/clientExtensions" if options['clientExtensions']
|
33
|
+
return "#{url}/orders" if options['takeProfit'] || options['stopLoss'] || options['trailingStopLoss']
|
34
|
+
return "#{url}/close" if options['units']
|
35
|
+
return url
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# @see http://developer.oanda.com/rest-live-v20/transactions-ep/
|
2
|
+
module OandaApiV20
|
3
|
+
module Transactions
|
4
|
+
# GET /v3/accounts/:account_id/transactions/:transaction_id
|
5
|
+
def transaction(id)
|
6
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/transactions/#{id}", headers: headers)
|
7
|
+
end
|
8
|
+
|
9
|
+
# GET /v3/accounts/:account_id/transactions
|
10
|
+
def transactions(options = {})
|
11
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/transactions", headers: headers, query: options)
|
12
|
+
end
|
13
|
+
|
14
|
+
# GET /v3/accounts/:account_id/transactions/idrange
|
15
|
+
def transactions_id_range(options)
|
16
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/transactions/idrange", headers: headers, query: options)
|
17
|
+
end
|
18
|
+
|
19
|
+
# GET /v3/accounts/:account_id/transactions/sinceid
|
20
|
+
def transactions_since_id(options)
|
21
|
+
Client.send(http_verb, "#{base_uri}/accounts/#{account_id}/transactions/sinceid", headers: headers, query: options)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'persistent_httparty'
|
3
|
+
|
4
|
+
require 'oanda_api_v20/version'
|
5
|
+
require 'oanda_api_v20/accounts'
|
6
|
+
require 'oanda_api_v20/orders'
|
7
|
+
require 'oanda_api_v20/trades'
|
8
|
+
require 'oanda_api_v20/positions'
|
9
|
+
require 'oanda_api_v20/transactions'
|
10
|
+
require 'oanda_api_v20/pricing'
|
11
|
+
require 'oanda_api_v20/client'
|
12
|
+
require 'oanda_api_v20/api'
|
13
|
+
require 'oanda_api_v20/oanda_api_v20'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
2
|
+
|
3
|
+
require 'oanda_api_v20/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'oanda_api_v20'
|
7
|
+
s.version = OandaApiV20::VERSION
|
8
|
+
s.date = '2016-06-16'
|
9
|
+
s.summary = %q{Ruby Oanda REST API V20}
|
10
|
+
s.description = %q{Ruby client that supports the Oanda REST API V20 methods.}
|
11
|
+
s.authors = ['Kobus Joubert']
|
12
|
+
s.email = 'kobus@translate3d.com'
|
13
|
+
s.homepage = 'http://rubygems.org/gems/oanda_api_v20'
|
14
|
+
s.license = 'MIT'
|
15
|
+
|
16
|
+
s.required_ruby_version = '>= 2.3.0'
|
17
|
+
|
18
|
+
s.add_dependency 'httparty', '~> 0.13'
|
19
|
+
s.add_dependency 'persistent_httparty', '~> 0.1'
|
20
|
+
|
21
|
+
s.files = `git ls-files`.split("\n")
|
22
|
+
s.require_paths = ['lib']
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: oanda_api_v20
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kobus Joubert
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-06-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httparty
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.13'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.13'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: persistent_httparty
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.1'
|
41
|
+
description: Ruby client that supports the Oanda REST API V20 methods.
|
42
|
+
email: kobus@translate3d.com
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- ".gitignore"
|
48
|
+
- lib/oanda_api_v20.rb
|
49
|
+
- lib/oanda_api_v20/accounts.rb
|
50
|
+
- lib/oanda_api_v20/api.rb
|
51
|
+
- lib/oanda_api_v20/client.rb
|
52
|
+
- lib/oanda_api_v20/oanda_api_v20.rb
|
53
|
+
- lib/oanda_api_v20/orders.rb
|
54
|
+
- lib/oanda_api_v20/positions.rb
|
55
|
+
- lib/oanda_api_v20/pricing.rb
|
56
|
+
- lib/oanda_api_v20/trades.rb
|
57
|
+
- lib/oanda_api_v20/transactions.rb
|
58
|
+
- lib/oanda_api_v20/version.rb
|
59
|
+
- oanda_api_v20.gemspec
|
60
|
+
homepage: http://rubygems.org/gems/oanda_api_v20
|
61
|
+
licenses:
|
62
|
+
- MIT
|
63
|
+
metadata: {}
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 2.3.0
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 2.5.1
|
81
|
+
signing_key:
|
82
|
+
specification_version: 4
|
83
|
+
summary: Ruby Oanda REST API V20
|
84
|
+
test_files: []
|