ig_markets 0.22 → 0.23
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/ig_markets/activity.rb +3 -3
- data/lib/ig_markets/application.rb +5 -5
- data/lib/ig_markets/deal_confirmation.rb +2 -2
- data/lib/ig_markets/dealing_platform/position_methods.rb +12 -13
- data/lib/ig_markets/dealing_platform/working_order_methods.rb +4 -4
- data/lib/ig_markets/format.rb +2 -2
- data/lib/ig_markets/historical_price_result.rb +7 -7
- data/lib/ig_markets/market.rb +4 -4
- data/lib/ig_markets/model.rb +4 -8
- data/lib/ig_markets/model/typecasters.rb +3 -3
- data/lib/ig_markets/position.rb +8 -8
- data/lib/ig_markets/session.rb +12 -24
- data/lib/ig_markets/sprint_market_position.rb +1 -1
- data/lib/ig_markets/streaming/account_state.rb +6 -11
- data/lib/ig_markets/streaming/consolidated_chart_data_update.rb +1 -1
- data/lib/ig_markets/streaming/subscription.rb +13 -7
- data/lib/ig_markets/streaming/working_order_update.rb +2 -2
- data/lib/ig_markets/version.rb +1 -1
- data/lib/ig_markets/working_order.rb +6 -6
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 207f951a5be987c96debc33292afecc695435241
|
4
|
+
data.tar.gz: ebd1837c2f2f99c7c65b9a3199d7a247cbe768d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 775d3e912b35c17cc57deed6dd6827beb52491e5ac204c4ae68c0e4a8602db9e1175e701936285951200c9edf4beb180f2823f646f1e3364d2f1d151561bfab1
|
7
|
+
data.tar.gz: 1e82cb866071f438b19fb75a60557eaefedf2eb35c64a3a72fc35c18251adc9e8ebc348f97712146a24bcf19f6399f7f14c46a30720b90e233a4cf6c01b81654
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# IG Markets Changelog
|
2
2
|
|
3
|
+
### 0.23 — October 19, 2016
|
4
|
+
|
5
|
+
- Use `Integer` instead of `Fixnum` in preparation for Ruby 2.4
|
6
|
+
- Fixed documentation warnings found by Inch CI
|
7
|
+
|
3
8
|
### 0.22 — October 3, 2016
|
4
9
|
|
5
10
|
- The `curses` gem is no longer a dependency because it can be difficult to install on Windows, it now has to be
|
data/lib/ig_markets/activity.rb
CHANGED
@@ -23,14 +23,14 @@ module IGMarkets
|
|
23
23
|
attribute :good_till_date
|
24
24
|
attribute :guaranteed_stop, Boolean
|
25
25
|
attribute :level, Float
|
26
|
-
attribute :limit_distance,
|
26
|
+
attribute :limit_distance, Integer
|
27
27
|
attribute :limit_level, Float
|
28
28
|
attribute :market_name
|
29
29
|
attribute :size
|
30
|
-
attribute :stop_distance,
|
30
|
+
attribute :stop_distance, Integer
|
31
31
|
attribute :stop_level, Float
|
32
32
|
attribute :trailing_step, Float
|
33
|
-
attribute :trailing_stop_distance,
|
33
|
+
attribute :trailing_stop_distance, Integer
|
34
34
|
end
|
35
35
|
|
36
36
|
attribute :channel, Symbol, allowed_values: [:dealer, :mobile, :public_fix_api, :public_web_api, :system, :web]
|
@@ -3,13 +3,13 @@ module IGMarkets
|
|
3
3
|
class Application < Model
|
4
4
|
attribute :allow_equities, Boolean
|
5
5
|
attribute :allow_quote_orders, Boolean
|
6
|
-
attribute :allowance_account_historical_data,
|
7
|
-
attribute :allowance_account_overall,
|
8
|
-
attribute :allowance_account_trading,
|
9
|
-
attribute :allowance_application_overall,
|
6
|
+
attribute :allowance_account_historical_data, Integer
|
7
|
+
attribute :allowance_account_overall, Integer
|
8
|
+
attribute :allowance_account_trading, Integer
|
9
|
+
attribute :allowance_application_overall, Integer
|
10
10
|
attribute :api_key
|
11
11
|
attribute :client_id
|
12
|
-
attribute :concurrent_subscriptions_limit,
|
12
|
+
attribute :concurrent_subscriptions_limit, Integer
|
13
13
|
attribute :created_date, Time, format: '%Q'
|
14
14
|
attribute :fast_markets_settlement_price_enabled, Boolean
|
15
15
|
attribute :id
|
@@ -18,7 +18,7 @@ module IGMarkets
|
|
18
18
|
attribute :expiry, Date, nil_if: %w(- DFB), format: ['%d-%b-%y', '%b-%y']
|
19
19
|
attribute :guaranteed_stop, Boolean
|
20
20
|
attribute :level, Float
|
21
|
-
attribute :limit_distance,
|
21
|
+
attribute :limit_distance, Integer
|
22
22
|
attribute :limit_level, Float
|
23
23
|
attribute :profit, Float
|
24
24
|
attribute :profit_currency, String, regex: Regex::CURRENCY
|
@@ -44,7 +44,7 @@ module IGMarkets
|
|
44
44
|
:trailing_stop_not_allowed, :unknown, :wrong_side_of_market]
|
45
45
|
attribute :size, Float
|
46
46
|
attribute :status, Symbol, allowed_values: [:amended, :closed, :deleted, :open, :partially_closed]
|
47
|
-
attribute :stop_distance,
|
47
|
+
attribute :stop_distance, Integer
|
48
48
|
attribute :stop_level, Float
|
49
49
|
attribute :trailing_stop, Boolean
|
50
50
|
end
|
@@ -40,7 +40,7 @@ module IGMarkets
|
|
40
40
|
# @option attributes [Boolean] :force_open Whether a force open is required. Defaults to `false`.
|
41
41
|
# @option attributes [Boolean] :guaranteed_stop Whether a guaranteed stop is required. Defaults to `false`.
|
42
42
|
# @option attributes [Float] :level Required if and only if `:order_type` is `:limit` or `:quote`.
|
43
|
-
# @option attributes [
|
43
|
+
# @option attributes [Integer] :limit_distance The distance away in pips to place the limit. If this is set then
|
44
44
|
# `:limit_level` must be `nil`. Optional.
|
45
45
|
# @option attributes [Float] :limit_level The limit level. If this is set then `:limit_distance` must be `nil`.
|
46
46
|
# Optional.
|
@@ -50,7 +50,7 @@ module IGMarkets
|
|
50
50
|
# Defaults to `:market`.
|
51
51
|
# @option attributes [String] :quote_id The Lightstreamer quote ID. Required when `:order_type` is `:quote`.
|
52
52
|
# @option attributes [Float] :size The size of the position to create. Required.
|
53
|
-
# @option attributes [
|
53
|
+
# @option attributes [Integer] :stop_distance The distance away in pips to place the stop. If this is set then
|
54
54
|
# `:stop_level` must be `nil`. Optional.
|
55
55
|
# @option attributes [Float] :stop_level The stop level. If this is set then `:stop_distance` must be `nil`.
|
56
56
|
# Optional.
|
@@ -62,7 +62,7 @@ module IGMarkets
|
|
62
62
|
# `:market` (the default) then `:time_in_force` will be automatically set to
|
63
63
|
# `:execute_and_eliminate`.
|
64
64
|
# @option attributes [Boolean] :trailing_stop Whether to use a trailing stop. Defaults to false. Optional.
|
65
|
-
# @option attributes [
|
65
|
+
# @option attributes [Integer] :trailing_stop_increment The increment step in pips for the trailing stop. Required
|
66
66
|
# when `:trailing_stop` is `true`.
|
67
67
|
#
|
68
68
|
# @return [String] The resulting deal reference, use {DealingPlatform#deal_confirmation} to check the result of
|
@@ -86,16 +86,16 @@ module IGMarkets
|
|
86
86
|
attribute :force_open, Boolean
|
87
87
|
attribute :guaranteed_stop, Boolean
|
88
88
|
attribute :level, Float
|
89
|
-
attribute :limit_distance,
|
89
|
+
attribute :limit_distance, Integer
|
90
90
|
attribute :limit_level, Float
|
91
91
|
attribute :order_type, Symbol, allowed_values: [:limit, :market, :quote]
|
92
92
|
attribute :quote_id
|
93
93
|
attribute :size, Float
|
94
|
-
attribute :stop_distance,
|
94
|
+
attribute :stop_distance, Integer
|
95
95
|
attribute :stop_level, Float
|
96
96
|
attribute :time_in_force, Symbol, allowed_values: [:execute_and_eliminate, :fill_or_kill]
|
97
97
|
attribute :trailing_stop, Boolean
|
98
|
-
attribute :trailing_stop_increment,
|
98
|
+
attribute :trailing_stop_increment, Integer
|
99
99
|
|
100
100
|
def initialize(attributes = {})
|
101
101
|
super
|
@@ -137,10 +137,9 @@ module IGMarkets
|
|
137
137
|
if trailing_stop
|
138
138
|
raise ArgumentError, 'do not set stop_level when trailing_stop is true' if stop_level
|
139
139
|
raise ArgumentError, 'set stop_distance when trailing_stop is true' unless stop_distance
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
raise ArgumentError, 'set trailing_stop_increment if and only if trailing_stop is true'
|
140
|
+
raise ArgumentError, 'set trailing_stop_increment when trailing_stop is true' unless trailing_stop_increment
|
141
|
+
elsif trailing_stop_increment
|
142
|
+
raise ArgumentError, 'do not set trailing_stop_increment when trailing_stop is false'
|
144
143
|
end
|
145
144
|
end
|
146
145
|
|
@@ -152,9 +151,9 @@ module IGMarkets
|
|
152
151
|
|
153
152
|
# Checks that attributes associated with the guaranteed stop are valid.
|
154
153
|
def validate_guaranteed_stop_constraints
|
155
|
-
if guaranteed_stop
|
156
|
-
|
157
|
-
|
154
|
+
return if !guaranteed_stop || (stop_level.nil? ^ stop_distance.nil?)
|
155
|
+
|
156
|
+
raise ArgumentError, 'set exactly one of stop_level or stop_distance when guaranteed_stop is true'
|
158
157
|
end
|
159
158
|
end
|
160
159
|
|
@@ -44,12 +44,12 @@ module IGMarkets
|
|
44
44
|
# the working order will remain until it is cancelled.
|
45
45
|
# @option attributes [Boolean] :guaranteed_stop Whether a guaranteed stop is required. Defaults to `false`.
|
46
46
|
# @option attributes [Float] :level The level at which the order will be triggered. Required.
|
47
|
-
# @option attributes [
|
47
|
+
# @option attributes [Integer] :limit_distance The distance away in pips to place the limit. If this is set then
|
48
48
|
# the `:limit_level` option must be omitted. Optional.
|
49
49
|
# @option attributes [Float] :limit_level The level at which to place the limit. If this is set then the
|
50
50
|
# `:limit_distance` option must be omitted. Optional.
|
51
51
|
# @option attributes [Float] :size The size of the working order. Required.
|
52
|
-
# @option attributes [
|
52
|
+
# @option attributes [Integer] :stop_distance The distance away in pips to place the stop. If this is set then the
|
53
53
|
# `:stop_level` option must be omitted. Optional.
|
54
54
|
# @option attributes [Float] :stop_level The level at which to place the stop. If this is set then the
|
55
55
|
# `:stop_distance` option must be omitted. Optional.
|
@@ -79,10 +79,10 @@ module IGMarkets
|
|
79
79
|
attribute :good_till_date, Time, format: '%Y/%m/%d %R:%S'
|
80
80
|
attribute :guaranteed_stop, Boolean
|
81
81
|
attribute :level, Float
|
82
|
-
attribute :limit_distance,
|
82
|
+
attribute :limit_distance, Integer
|
83
83
|
attribute :limit_level, Float
|
84
84
|
attribute :size, Float
|
85
|
-
attribute :stop_distance,
|
85
|
+
attribute :stop_distance, Integer
|
86
86
|
attribute :stop_level, Float
|
87
87
|
attribute :time_in_force, Symbol, allowed_values: [:good_till_cancelled, :good_till_date]
|
88
88
|
attribute :type, Symbol, allowed_values: [:limit, :stop]
|
data/lib/ig_markets/format.rb
CHANGED
@@ -19,7 +19,7 @@ module IGMarkets
|
|
19
19
|
# Returns a formatted string for the specified currency amount and currency. Two decimal places are used for all
|
20
20
|
# currencies except the Japanese Yen.
|
21
21
|
#
|
22
|
-
# @param [Float,
|
22
|
+
# @param [Float, Integer] amount The currency amount to format.
|
23
23
|
# @param [String] currency The currency.
|
24
24
|
#
|
25
25
|
# @return [String] The formatted currency amount, e.g. `"USD -130.40"`, `"AUD 539.10"`, `"JPY 3560"`.
|
@@ -35,7 +35,7 @@ module IGMarkets
|
|
35
35
|
|
36
36
|
# Returns a formatted string for the specified number of seconds in the format `[<hours>:]<minutes>:<seconds>`.
|
37
37
|
#
|
38
|
-
# @param [
|
38
|
+
# @param [Integer] value The number of seconds to format.
|
39
39
|
#
|
40
40
|
# @return [String]
|
41
41
|
def seconds(value)
|
@@ -5,21 +5,21 @@ module IGMarkets
|
|
5
5
|
class Metadata < Model
|
6
6
|
# Contains details on the remaining allowance for looking up historical prices. Used by {#allowance}.
|
7
7
|
class Allowance < Model
|
8
|
-
attribute :allowance_expiry,
|
9
|
-
attribute :remaining_allowance,
|
10
|
-
attribute :total_allowance,
|
8
|
+
attribute :allowance_expiry, Integer
|
9
|
+
attribute :remaining_allowance, Integer
|
10
|
+
attribute :total_allowance, Integer
|
11
11
|
end
|
12
12
|
|
13
13
|
# Contains details on paging status for a historical price lookup. Used by {#page_data}.
|
14
14
|
class PageData < Model
|
15
|
-
attribute :page_number,
|
16
|
-
attribute :page_size,
|
17
|
-
attribute :total_pages,
|
15
|
+
attribute :page_number, Integer
|
16
|
+
attribute :page_size, Integer
|
17
|
+
attribute :total_pages, Integer
|
18
18
|
end
|
19
19
|
|
20
20
|
attribute :allowance, Allowance
|
21
21
|
attribute :page_data, PageData
|
22
|
-
attribute :size,
|
22
|
+
attribute :size, Integer
|
23
23
|
end
|
24
24
|
|
25
25
|
# Contains details on a single historical price snapshot. Used by {#prices}.
|
data/lib/ig_markets/market.rb
CHANGED
@@ -55,7 +55,7 @@ module IGMarkets
|
|
55
55
|
# @option options [:minute, :minute_2, :minute_3, :minute_5, :minute_10, :minute_15, :minute_30, :hour, :hour_2,
|
56
56
|
# :hour_3, :hour_4, :day, :week, :month] :resolution The resolution of the prices to return.
|
57
57
|
# Required.
|
58
|
-
# @option options [
|
58
|
+
# @option options [Integer] :number The number of historical prices to return. If this is specified then the `:from`
|
59
59
|
# and `:to` options must not be specified.
|
60
60
|
# @option options [Time] :from The start of the period to return prices for.
|
61
61
|
# @option options [Time] :to The end of the period to return prices for.
|
@@ -80,9 +80,9 @@ module IGMarkets
|
|
80
80
|
|
81
81
|
raise ArgumentError, 'resolution is invalid' unless resolutions.include? options[:resolution]
|
82
82
|
|
83
|
-
if options.keys
|
84
|
-
|
85
|
-
|
83
|
+
return if options.keys == [:resolution, :from, :to] || options.keys == [:resolution, :number]
|
84
|
+
|
85
|
+
raise ArgumentError, 'options must specify either :number or :from and :to'
|
86
86
|
end
|
87
87
|
|
88
88
|
# Returns the API response to a request for historical prices.
|
data/lib/ig_markets/model.rb
CHANGED
@@ -76,14 +76,10 @@ module IGMarkets
|
|
76
76
|
end
|
77
77
|
|
78
78
|
class << self
|
79
|
-
#
|
80
|
-
#
|
81
|
-
# @return [Hash]
|
79
|
+
# @return [Hash] a hash containing details of all attributes that have been defined on this model.
|
82
80
|
attr_accessor :defined_attributes
|
83
81
|
|
84
|
-
#
|
85
|
-
#
|
86
|
-
# @return [Array]
|
82
|
+
# @return [Array] the names of the deprecated attributes on this model.
|
87
83
|
attr_accessor :deprecated_attributes
|
88
84
|
|
89
85
|
# Returns the names of all currently defined attributes for this model.
|
@@ -145,7 +141,7 @@ module IGMarkets
|
|
145
141
|
# Defines setter and getter instance methods and a sanitizer class method for a new attribute on this class.
|
146
142
|
#
|
147
143
|
# @param [Symbol] name The name of the new attribute.
|
148
|
-
# @param [Boolean, String, Date, Time,
|
144
|
+
# @param [Boolean, String, Date, Time, Integer, Float, Symbol, Model] type The attribute's type.
|
149
145
|
# @param [Hash] options The configuration options for the new attribute.
|
150
146
|
# @option options [Array] :allowed_values The set of values that this attribute is allowed to be set to. An
|
151
147
|
# attempt to set this attribute to a value not in this list will raise `ArgumentError`. Optional.
|
@@ -153,7 +149,7 @@ module IGMarkets
|
|
153
149
|
# @option options [Regexp] :regex When `type` is `String` only values matching this regex will be allowed.
|
154
150
|
# Optional.
|
155
151
|
# @option options [String] :format When `type` is `Date` or `Time` this specifies the format or formats for
|
156
|
-
# parsing String and `
|
152
|
+
# parsing String and `Integer` instances assigned to this attribute.
|
157
153
|
#
|
158
154
|
# @macro [attach] attribute
|
159
155
|
# The $1 attribute.
|
@@ -5,7 +5,7 @@ module IGMarkets
|
|
5
5
|
private
|
6
6
|
|
7
7
|
def typecaster_for(type)
|
8
|
-
if [Boolean, String,
|
8
|
+
if [Boolean, String, Integer, Float, Symbol, Date, Time].include? type
|
9
9
|
method "typecaster_#{type.to_s.gsub(/\AIGMarkets::/, '').downcase}"
|
10
10
|
elsif type
|
11
11
|
lambda do |value, _options, name|
|
@@ -35,7 +35,7 @@ module IGMarkets
|
|
35
35
|
value.to_s
|
36
36
|
end
|
37
37
|
|
38
|
-
def
|
38
|
+
def typecaster_integer(value, _options, _name)
|
39
39
|
return nil if value.nil?
|
40
40
|
|
41
41
|
value.to_s.to_i
|
@@ -74,7 +74,7 @@ module IGMarkets
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def typecaster_time(value, options, name)
|
77
|
-
if value.is_a?(String) || value.is_a?(
|
77
|
+
if value.is_a?(String) || value.is_a?(Integer)
|
78
78
|
parse_formatted_time_value value.to_s, options, name
|
79
79
|
else
|
80
80
|
value
|
data/lib/ig_markets/position.rb
CHANGED
@@ -14,7 +14,7 @@ module IGMarkets
|
|
14
14
|
attribute :size, Float
|
15
15
|
attribute :stop_level, Float
|
16
16
|
attribute :trailing_step, Float
|
17
|
-
attribute :trailing_stop_distance,
|
17
|
+
attribute :trailing_stop_distance, Integer
|
18
18
|
|
19
19
|
attribute :market, MarketOverview
|
20
20
|
|
@@ -106,8 +106,8 @@ module IGMarkets
|
|
106
106
|
# @option new_attributes [Float] :limit_level The new limit level for this position.
|
107
107
|
# @option new_attributes [Float] :stop_level The new stop level for this position.
|
108
108
|
# @option new_attributes [Boolean] :trailing_stop Whether to use a trailing stop for this position.
|
109
|
-
# @option new_attributes [
|
110
|
-
# @option new_attributes [
|
109
|
+
# @option new_attributes [Integer] :trailing_stop_distance The distance away in pips to place the trailing stop.
|
110
|
+
# @option new_attributes [Integer] :trailing_stop_increment The step increment to use for the trailing stop.
|
111
111
|
#
|
112
112
|
# @return [String] The deal reference of the update operation. Use {DealingPlatform#deal_confirmation} to check
|
113
113
|
# the result of the position update.
|
@@ -133,9 +133,9 @@ module IGMarkets
|
|
133
133
|
raise ArgumentError, 'set quote_id if and only if order_type is :quote'
|
134
134
|
end
|
135
135
|
|
136
|
-
|
137
|
-
|
138
|
-
|
136
|
+
return unless [:limit, :quote].include?(attributes[:order_type]) == attributes[:level].nil?
|
137
|
+
|
138
|
+
raise ArgumentError, 'set level if and only if order_type is :limit or :quote'
|
139
139
|
end
|
140
140
|
|
141
141
|
# Internal model used by {#close}.
|
@@ -176,8 +176,8 @@ module IGMarkets
|
|
176
176
|
attribute :limit_level, Float
|
177
177
|
attribute :stop_level, Float
|
178
178
|
attribute :trailing_stop, Boolean
|
179
|
-
attribute :trailing_stop_distance,
|
180
|
-
attribute :trailing_stop_increment,
|
179
|
+
attribute :trailing_stop_distance, Integer
|
180
|
+
attribute :trailing_stop_increment, Integer
|
181
181
|
end
|
182
182
|
|
183
183
|
private_constant :PositionCloseAttributes, :PositionUpdateAttributes
|
data/lib/ig_markets/session.rb
CHANGED
@@ -3,36 +3,24 @@ module IGMarkets
|
|
3
3
|
# In order to sign in, {#username}, {#password}, {#api_key} and {#platform} must be set. {#platform} must be
|
4
4
|
# either `:demo` or `:live` depending on which platform is being targeted.
|
5
5
|
class Session
|
6
|
-
#
|
7
|
-
#
|
8
|
-
# @return [String]
|
6
|
+
# @return [String] the username to use to authenticate this session.
|
9
7
|
attr_accessor :username
|
10
8
|
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# @return [String]
|
9
|
+
# @return [String] the password to use to authenticate this session.
|
14
10
|
attr_accessor :password
|
15
11
|
|
16
|
-
#
|
17
|
-
#
|
18
|
-
# @return [String]
|
12
|
+
# @return [String] the API key to use to authenticate this session.
|
19
13
|
attr_accessor :api_key
|
20
14
|
|
21
|
-
# The platform variant to log into for this session.
|
22
|
-
#
|
23
|
-
# @return [:demo, :live]
|
15
|
+
# @return [:demo, :live] The platform variant to log into for this session.
|
24
16
|
attr_accessor :platform
|
25
17
|
|
26
|
-
#
|
27
|
-
# session.
|
28
|
-
#
|
29
|
-
# @return [String]
|
18
|
+
# @return [String] the client session security access token for the currently logged in session, or `nil` if there
|
19
|
+
# is no active session.
|
30
20
|
attr_reader :client_security_token
|
31
21
|
|
32
|
-
#
|
33
|
-
# session.
|
34
|
-
#
|
35
|
-
# @return [String]
|
22
|
+
# @return [String] the account session security access token for the currently logged in session, or `nil` if there
|
23
|
+
# is no active session.
|
36
24
|
attr_reader :x_security_token
|
37
25
|
|
38
26
|
# Signs in to IG Markets using the values of {#username}, {#password}, {#api_key} and {#platform}. If an error
|
@@ -72,7 +60,7 @@ module IGMarkets
|
|
72
60
|
#
|
73
61
|
# @param [String] url The URL to send the POST request to.
|
74
62
|
# @param [Hash, nil] body The body to include with the POST request, this will be encoded as JSON.
|
75
|
-
# @param [
|
63
|
+
# @param [Integer] api_version The API version to target.
|
76
64
|
#
|
77
65
|
# @return [Hash] The response from the IG Markets API.
|
78
66
|
def post(url, body, api_version = API_V1)
|
@@ -82,7 +70,7 @@ module IGMarkets
|
|
82
70
|
# Sends a GET request to the IG Markets API. If an error occurs then an {IGMarketsError} will be raised.
|
83
71
|
#
|
84
72
|
# @param [String] url The URL to send the GET request to.
|
85
|
-
# @param [
|
73
|
+
# @param [Integer] api_version The API version to target.
|
86
74
|
#
|
87
75
|
# @return [Hash] The response from the IG Markets API.
|
88
76
|
def get(url, api_version = API_V1)
|
@@ -93,7 +81,7 @@ module IGMarkets
|
|
93
81
|
#
|
94
82
|
# @param [String] url The URL to send the PUT request to.
|
95
83
|
# @param [Hash, nil] body The body to include with the PUT request, this will be encoded as JSON.
|
96
|
-
# @param [
|
84
|
+
# @param [Integer] api_version The API version to target.
|
97
85
|
#
|
98
86
|
# @return [Hash] The response from the IG Markets API.
|
99
87
|
def put(url, body = nil, api_version = API_V1)
|
@@ -104,7 +92,7 @@ module IGMarkets
|
|
104
92
|
#
|
105
93
|
# @param [String] url The URL to send the DELETE request to.
|
106
94
|
# @param [Hash, nil] body The body to include with the DELETE request, this will be encoded as JSON.
|
107
|
-
# @param [
|
95
|
+
# @param [Integer] api_version The API version to target.
|
108
96
|
#
|
109
97
|
# @return [Hash] The response from the IG Markets API.
|
110
98
|
def delete(url, body = nil, api_version = API_V1)
|
@@ -17,7 +17,7 @@ module IGMarkets
|
|
17
17
|
# Returns the number of seconds till when this sprint market position expires. This will be a negative number if
|
18
18
|
# this sprint market position has expired.
|
19
19
|
#
|
20
|
-
# @return [
|
20
|
+
# @return [Integer]
|
21
21
|
def seconds_till_expiry
|
22
22
|
(expiry_time - Time.now).to_i
|
23
23
|
end
|
@@ -5,21 +5,16 @@ module IGMarkets
|
|
5
5
|
# making repeated calls to the REST API to get current account, position or working order details, and also avoids
|
6
6
|
# running into API traffic allowance limits.
|
7
7
|
class AccountState
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# @return [Array<Account>]
|
8
|
+
# @return [Array<Account>] the current state of the accounts. The balances will be updated automatically as new
|
9
|
+
# streaming data arrives.
|
11
10
|
attr_accessor :accounts
|
12
11
|
|
13
|
-
#
|
14
|
-
# data arrives.
|
15
|
-
#
|
16
|
-
# @return [Array<Position>]
|
12
|
+
# @return [Array<Position>] the current positions for this account. This set of positions will be updated
|
13
|
+
# automatically as new streaming data arrives.
|
17
14
|
attr_accessor :positions
|
18
15
|
|
19
|
-
#
|
20
|
-
# streaming data arrives.
|
21
|
-
#
|
22
|
-
# @return [Array<WorkingOrder>]
|
16
|
+
# @return [Array<WorkingOrder>] the current working orders for this account. This set of working orders will be
|
17
|
+
# updated automatically as new streaming data arrives.
|
23
18
|
attr_accessor :working_orders
|
24
19
|
|
25
20
|
# Initializes this account state with the specified dealing platform.
|
@@ -8,7 +8,7 @@ module IGMarkets
|
|
8
8
|
attribute :bid_low, Float
|
9
9
|
attribute :bid_open, Float
|
10
10
|
attribute :cons_end, Boolean
|
11
|
-
attribute :cons_tick_count,
|
11
|
+
attribute :cons_tick_count, Integer
|
12
12
|
attribute :day_high, Float
|
13
13
|
attribute :day_low, Float
|
14
14
|
attribute :day_net_chg_mid, Float
|
@@ -51,16 +51,18 @@ module IGMarkets
|
|
51
51
|
CONSOLIDATED_CHART_DATA_REGEX = /^CHART:(.*):(SECOND|1MINUTE|5MINUTE|HOUR)$/
|
52
52
|
|
53
53
|
def on_raw_data(subscription, item_name, item_data, new_data)
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
54
|
+
{
|
55
|
+
ACCOUNT_DATA_REGEX => :on_account_data,
|
56
|
+
MARKET_DATA_REGEX => :on_market_data,
|
57
|
+
TRADE_DATA_REGEX => :on_trade_data,
|
58
|
+
CHART_TICK_DATA_REGEX => :on_chart_tick_data,
|
59
|
+
CONSOLIDATED_CHART_DATA_REGEX => :on_consolidated_chart_data
|
60
|
+
}.each do |regex, handler|
|
61
|
+
send handler, subscription, item_name, item_data, new_data if item_name =~ regex
|
61
62
|
end
|
62
63
|
end
|
63
64
|
|
65
|
+
# Handles streaming account data.
|
64
66
|
def on_account_data(_subscription, item_name, item_data, new_data)
|
65
67
|
item_data = @dealing_platform.instantiate_models AccountUpdate, item_data
|
66
68
|
new_data = @dealing_platform.instantiate_models AccountUpdate, new_data
|
@@ -71,6 +73,7 @@ module IGMarkets
|
|
71
73
|
run_callbacks new_data, item_data
|
72
74
|
end
|
73
75
|
|
76
|
+
# Handles streaming market data.
|
74
77
|
def on_market_data(_subscription, item_name, item_data, new_data)
|
75
78
|
item_data = @dealing_platform.instantiate_models MarketUpdate, item_data
|
76
79
|
new_data = @dealing_platform.instantiate_models MarketUpdate, new_data
|
@@ -81,6 +84,7 @@ module IGMarkets
|
|
81
84
|
run_callbacks new_data, item_data
|
82
85
|
end
|
83
86
|
|
87
|
+
# Handles streaming trade data.
|
84
88
|
def on_trade_data(_subscription, item_name, _item_data, new_data)
|
85
89
|
account_id = item_name.match(TRADE_DATA_REGEX).captures.first
|
86
90
|
|
@@ -94,6 +98,7 @@ module IGMarkets
|
|
94
98
|
end
|
95
99
|
end
|
96
100
|
|
101
|
+
# Handles streaming chart tick data.
|
97
102
|
def on_chart_tick_data(_subscription, item_name, _item_data, new_data)
|
98
103
|
new_data = @dealing_platform.instantiate_models ChartTickUpdate, new_data
|
99
104
|
|
@@ -102,6 +107,7 @@ module IGMarkets
|
|
102
107
|
run_callbacks new_data
|
103
108
|
end
|
104
109
|
|
110
|
+
# Handles streaming consolidated chart data.
|
105
111
|
def on_consolidated_chart_data(_subscription, item_name, item_data, new_data)
|
106
112
|
item_data = @dealing_platform.instantiate_models ConsolidatedChartDataUpdate, item_data
|
107
113
|
new_data = @dealing_platform.instantiate_models ConsolidatedChartDataUpdate, new_data
|
@@ -13,10 +13,10 @@ module IGMarkets
|
|
13
13
|
attribute :expiry, Date, nil_if: %w(- DFB), format: ['%d-%b-%y', '%b-%y']
|
14
14
|
attribute :guaranteed_stop, Boolean
|
15
15
|
attribute :level, Float
|
16
|
-
attribute :limit_distance,
|
16
|
+
attribute :limit_distance, Integer
|
17
17
|
attribute :size, Float
|
18
18
|
attribute :status, Symbol, allowed_values: [:deleted, :open, :updated]
|
19
|
-
attribute :stop_distance,
|
19
|
+
attribute :stop_distance, Integer
|
20
20
|
attribute :timestamp, Time, format: '%FT%T.%L'
|
21
21
|
end
|
22
22
|
end
|
data/lib/ig_markets/version.rb
CHANGED
@@ -10,11 +10,11 @@ module IGMarkets
|
|
10
10
|
attribute :epic, String, regex: Regex::EPIC
|
11
11
|
attribute :good_till_date, Time, format: '%Y/%m/%d %R'
|
12
12
|
attribute :guaranteed_stop, Boolean
|
13
|
-
attribute :limit_distance,
|
13
|
+
attribute :limit_distance, Integer
|
14
14
|
attribute :order_level, Float
|
15
15
|
attribute :order_size, Float
|
16
16
|
attribute :order_type, Symbol, allowed_values: [:limit, :stop]
|
17
|
-
attribute :stop_distance,
|
17
|
+
attribute :stop_distance, Integer
|
18
18
|
attribute :time_in_force, Symbol, allowed_values: [:good_till_cancelled, :good_till_date]
|
19
19
|
|
20
20
|
attribute :market, MarketOverview
|
@@ -41,9 +41,9 @@ module IGMarkets
|
|
41
41
|
# {DealingPlatform::WorkingOrderMethods#create} for a description of the attributes.
|
42
42
|
# @option new_attributes [Time] :good_till_date
|
43
43
|
# @option new_attributes [Float] :level
|
44
|
-
# @option new_attributes [
|
44
|
+
# @option new_attributes [Integer] :limit_distance
|
45
45
|
# @option new_attributes [Float] :limit_level
|
46
|
-
# @option new_attributes [
|
46
|
+
# @option new_attributes [Integer] :stop_distance
|
47
47
|
# @option new_attributes [Float] :stop_level
|
48
48
|
# @option new_attributes [:limit, :stop] :type
|
49
49
|
#
|
@@ -65,9 +65,9 @@ module IGMarkets
|
|
65
65
|
class WorkingOrderUpdateAttributes < Model
|
66
66
|
attribute :good_till_date, Time, format: '%Y/%m/%d %R:%S'
|
67
67
|
attribute :level, Float
|
68
|
-
attribute :limit_distance,
|
68
|
+
attribute :limit_distance, Integer
|
69
69
|
attribute :limit_level, Float
|
70
|
-
attribute :stop_distance,
|
70
|
+
attribute :stop_distance, Integer
|
71
71
|
attribute :stop_level, Float
|
72
72
|
attribute :time_in_force, Symbol, allowed_values: [:good_till_cancelled, :good_till_date]
|
73
73
|
attribute :type, Symbol, allowed_values: [:limit, :stop]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ig_markets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.23'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Viney
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -42,14 +42,14 @@ dependencies:
|
|
42
42
|
name: lightstreamer
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0.12'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0.12'
|
55
55
|
- !ruby/object:Gem::Dependency
|
@@ -198,14 +198,14 @@ dependencies:
|
|
198
198
|
requirements:
|
199
199
|
- - "~>"
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version: '0.
|
201
|
+
version: '0.44'
|
202
202
|
type: :development
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
206
|
- - "~>"
|
207
207
|
- !ruby/object:Gem::Version
|
208
|
-
version: '0.
|
208
|
+
version: '0.44'
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
210
|
name: yard
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|