ig_markets 0.9 → 0.10

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
  SHA1:
3
- metadata.gz: 8dd48141e03cc58042b6b5c14ae2f7d4a1a0b55c
4
- data.tar.gz: 4c3467cc309a493209f646665b27b48eef0daa45
3
+ metadata.gz: 443589ca4b1af7f2e0de04ba1ca8be7f9b1450ec
4
+ data.tar.gz: 875b689e9ed88ec0b594b4dac26b43ff669366b4
5
5
  SHA512:
6
- metadata.gz: 80af908f64fe291975ad4364a4cbc6b713f3f8f37df7dc0f15e2697cc5b4f4f2ee4ebf48c09ec41064f50b687930b45680645b51ec1299f8c3b56213783c8c95
7
- data.tar.gz: 46e5518f0bcd7371ef63799da17e1b7d189b81a6a7a477ecd0e580b87e6ce48760a6a19d4d3eedea61517e227c359a413ac105212038dbcdcf5afeaf7d231fd6
6
+ metadata.gz: 0402b33e23f7fd885d74382b50057242e9cd17fe53322e065180e09784f5a530a046a29bdecb88376e1ef7022eb9e21c26eac2db23752676795ba0783a6d29d4
7
+ data.tar.gz: f26909d155efbb51262d8fddabc0f6c1a72a2de743da7f6aa6ce09518e8c8834e500f087d285e8357980ab72a7319b69c38fd10609226aa9688eacffb05c0b65
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # IG Markets Changelog
2
2
 
3
+ ### 0.10 — May 9, 2016
4
+
5
+ - Added `--epic` option to the `ig_markets activities` command
6
+ - Added `--sort-by` option to the `ig_markets activities` and `ig_markets transactions` commands
7
+ - The `--instrument` option for `ig_markets transactions` is no longer case-sensitive
8
+ - Added `ig_markets positions close-all` to close all open positions at once
9
+ - Added `IGMarkets::DealingPlatform#disable_api_key`
10
+
3
11
  ### 0.9 — May 2, 2016
4
12
 
5
13
  - `IGMarkets::DealingPlatform#sign_in` now returns an `IGMarkets::ClientAccountSummary` instance
data/README.md CHANGED
@@ -67,7 +67,7 @@ Use `ig_markets help` to get details on the options accepted by the commands and
67
67
  commands and their subcommands is:
68
68
 
69
69
  - `ig_markets account`
70
- - `ig_markets activities --days N [--from YYYY-MM-DD]`
70
+ - `ig_markets activities --days N [...]`
71
71
  - `ig_markets confirmation DEAL-REFERENCE`
72
72
  - `ig_markets console`
73
73
  - `ig_markets help [COMMAND]`
@@ -75,20 +75,21 @@ commands and their subcommands is:
75
75
  - `ig_markets orders create ...`
76
76
  - `ig_markets orders update DEAL-ID ...`
77
77
  - `ig_markets orders delete DEAL-ID`
78
- - `ig_markets positions [list] [--aggregate]`
78
+ - `ig_markets positions [list] [...]`
79
79
  - `ig_markets positions create ...`
80
80
  - `ig_markets positions update DEAL-ID ...`
81
81
  - `ig_markets positions close DEAL-ID [...]`
82
- - `ig_markets prices --epic EPIC --resolution RESOLUTION [...]`
82
+ - `ig_markets positions close-all [...]`
83
+ - `ig_markets prices --epic EPIC --resolution RESOLUTION ...`
83
84
  - `ig_markets search QUERY [--type TYPE]`
84
85
  - `ig_markets sentiment MARKET`
85
86
  - `ig_markets sprints [list]`
86
87
  - `ig_markets sprints create ...`
87
- - `ig_markets transactions --days N [--from YYYY-MM-DD] [--instrument INSTRUMENT] [--no-interest]`
88
+ - `ig_markets transactions --days N [...]`
88
89
  - `ig_markets watchlists [list]`
89
- - `ig_markets watchlists create NAME [EPIC EPIC ...]`
90
- - `ig_markets watchlists add-markets WATCHLIST-ID [EPIC EPIC ...]`
91
- - `ig_markets watchlists remove-markets WATCHLIST-ID [EPIC EPIC ...]`
90
+ - `ig_markets watchlists create NAME [EPIC ...]`
91
+ - `ig_markets watchlists add-markets WATCHLIST-ID [EPIC ...]`
92
+ - `ig_markets watchlists remove-markets WATCHLIST-ID [EPIC ...]`
92
93
  - `ig_markets watchlists delete WATCHLIST-ID`
93
94
 
94
95
  #### Examples
@@ -127,7 +128,7 @@ ig_markets orders create --direction buy --epic CS.D.EURUSD.CFD.IP --level 1.1 -
127
128
  # Print daily prices for EURUSD from the last two weeks
128
129
  ig_markets prices --epic CS.D.EURUSD.CFD.IP --resolution day --number 14
129
130
 
130
- # Log in and then open a Ruby console which can be used to query the IG API, all REST requests will be printed in full
131
+ # Log in and then open a Ruby console which can be used to query the IG API, all REST requests will be shown
131
132
  ig_markets console --print-requests
132
133
  ```
133
134
 
@@ -6,10 +6,12 @@ module IGMarkets
6
6
 
7
7
  option :days, type: :numeric, required: true, desc: 'The number of days to print account activities for'
8
8
  option :from, desc: 'The start date to print account activities from, format: yyyy-mm-dd'
9
+ option :epic, desc: 'Regex for filtering activities based on their EPIC'
10
+ option :sort_by, enum: %w(channel date epic type), default: 'date', desc: 'The attribute to sort activities by'
9
11
 
10
12
  def activities
11
13
  self.class.begin_session(options) do |dealing_platform|
12
- activities = gather_account_history(:activities, dealing_platform).sort_by(&:date)
14
+ activities = gather_activities dealing_platform
13
15
 
14
16
  table = ActivitiesTable.new activities
15
17
 
@@ -19,6 +21,31 @@ module IGMarkets
19
21
 
20
22
  private
21
23
 
24
+ def gather_activities(dealing_platform)
25
+ @epic_regex = Regexp.new options.fetch('epic', ''), Regexp::IGNORECASE
26
+
27
+ result = gather_account_history(:activities, dealing_platform).select do |activity|
28
+ activity_filter activity
29
+ end
30
+
31
+ result.sort_by do |activity|
32
+ [activity.send(activity_sort_attribute), activity.date]
33
+ end
34
+ end
35
+
36
+ def activity_filter(activity)
37
+ @epic_regex.match activity.epic
38
+ end
39
+
40
+ def activity_sort_attribute
41
+ {
42
+ 'channel' => :channel,
43
+ 'date' => :date,
44
+ 'epic' => :epic,
45
+ 'type' => :transaction_type
46
+ }.fetch options[:sort_by]
47
+ end
48
+
22
49
  def gather_account_history(method_name, dealing_platform)
23
50
  history_options = if options[:from]
24
51
  from = Date.strptime options[:from], '%F'
@@ -83,6 +83,21 @@ module IGMarkets
83
83
  end
84
84
  end
85
85
 
86
+ desc 'close-all', 'Closes all open positions'
87
+
88
+ option :order_type, enum: %w(limit market quote), default: 'market', desc: 'The order type'
89
+ option :time_in_force, enum: %w(execute-and-eliminate fill-or-kill), desc: 'The order fill strategy'
90
+
91
+ def close_all
92
+ Main.begin_session(options) do |dealing_platform|
93
+ dealing_platform.positions.all.each do |position|
94
+ deal_reference = position.close position_attributes
95
+
96
+ Main.report_deal_confirmation deal_reference
97
+ end
98
+ end
99
+ end
100
+
86
101
  private
87
102
 
88
103
  ATTRIBUTES = [:currency_code, :direction, :epic, :expiry, :force_open, :guaranteed_stop, :level, :limit_distance,
@@ -8,6 +8,8 @@ module IGMarkets
8
8
  option :from, desc: 'The start date to print account transactions from, format: yyyy-mm-dd'
9
9
  option :instrument, desc: 'Regex for filtering transactions based on their instrument'
10
10
  option :interest, type: :boolean, default: true, desc: 'Whether to show interest deposits and withdrawals'
11
+ option :sort_by, enum: %w(date instrument profit-loss type), default: 'date', desc: 'The attribute to sort ' \
12
+ 'transactions by'
11
13
 
12
14
  def transactions
13
15
  self.class.begin_session(options) do |dealing_platform|
@@ -27,11 +29,30 @@ module IGMarkets
27
29
  private
28
30
 
29
31
  def gather_transactions(dealing_platform)
30
- regex = Regexp.new options.fetch('instrument', '')
32
+ @instrument_regex = Regexp.new options.fetch('instrument', ''), Regexp::IGNORECASE
31
33
 
32
- gather_account_history(:transactions, dealing_platform).sort_by(&:date_utc).select do |transaction|
33
- regex.match(transaction.instrument_name) && (options[:interest] || !transaction.interest?)
34
+ result = gather_account_history(:transactions, dealing_platform).select do |transaction|
35
+ transaction_filter transaction
34
36
  end
37
+
38
+ result.sort_by do |transaction|
39
+ [transaction.send(transaction_sort_attribute), transaction.date_utc]
40
+ end
41
+ end
42
+
43
+ def transaction_filter(transaction)
44
+ return false if !options[:interest] && transaction.interest?
45
+
46
+ @instrument_regex.match transaction.instrument_name
47
+ end
48
+
49
+ def transaction_sort_attribute
50
+ {
51
+ 'date' => :date_utc,
52
+ 'instrument' => :instrument_name,
53
+ 'profit-loss' => :profit_and_loss_amount,
54
+ 'type' => :transaction_type
55
+ }.fetch options[:sort_by]
35
56
  end
36
57
 
37
58
  def transaction_totals(transactions)
@@ -22,8 +22,6 @@ module IGMarkets
22
22
  # Inserts the arguments from this config file into the passed arguments array.
23
23
  #
24
24
  # @param [Array<String>] argv The array of command-line arguments to alter.
25
- #
26
- # @return [void]
27
25
  def prepend_arguments_to_argv(argv)
28
26
  insert_index = argv.index do |argument|
29
27
  argument[0] == '-'
@@ -26,8 +26,6 @@ module IGMarkets
26
26
  # any config files, implementing the --version/-v options, and then invoking the main application.
27
27
  #
28
28
  # @param [Array<String>] argv The array of command-line arguments.
29
- #
30
- # @return [void]
31
29
  def bootstrap(argv)
32
30
  config_file.prepend_arguments_to_argv argv
33
31
 
@@ -43,8 +41,6 @@ module IGMarkets
43
41
  # occur. This method is used by all of the commands in order to authenticate.
44
42
  #
45
43
  # @param [Thor::CoreExt::HashWithIndifferentAccess] options The Thor options hash.
46
- #
47
- # @return [void]
48
44
  def begin_session(options)
49
45
  platform = options[:demo] ? :demo : :production
50
46
 
@@ -65,8 +61,6 @@ module IGMarkets
65
61
  # This is done because sometimes there is a delay in the processing of the deal by IG Markets.
66
62
  #
67
63
  # @param [String] deal_reference The deal reference.
68
- #
69
- # @return [void]
70
64
  def report_deal_confirmation(deal_reference)
71
65
  puts "Deal reference: #{deal_reference}"
72
66
 
@@ -89,8 +83,6 @@ module IGMarkets
89
83
  # @param [String] format The `strptime` format string for the attribute.
90
84
  # @param [String] display_format The human-readable version of `format` to put into the raised exception if
91
85
  # there is a problem parsing the attribute.
92
- #
93
- # @return [void]
94
86
  def parse_date_time(attributes, attribute, klass, format, display_format)
95
87
  return unless attributes.key? attribute
96
88
 
@@ -141,8 +133,6 @@ module IGMarkets
141
133
  # Prints out details of the passed deal confirmation.
142
134
  #
143
135
  # @param [DealConfirmation] deal_confirmation The deal confirmation to print out.
144
- #
145
- # @return [void]
146
136
  def print_deal_confirmation(deal_confirmation)
147
137
  puts <<-END
148
138
  Deal ID: #{deal_confirmation.deal_id}
@@ -8,7 +8,7 @@ module IGMarkets
8
8
  # @param [Hash] options The options hash.
9
9
  # @option options [String] :title The title for this table.
10
10
  def initialize(models, options = {})
11
- @models = models
11
+ @models = Array(models).flatten
12
12
  @title = options[:title] || default_title
13
13
  end
14
14
 
@@ -43,7 +43,7 @@ module IGMarkets
43
43
  end
44
44
 
45
45
  def rows
46
- @models.flatten.each_with_index.map do |model, row_index|
46
+ @models.each_with_index.map do |model, row_index|
47
47
  if model == :separator
48
48
  :separator
49
49
  else
@@ -88,6 +88,15 @@ module IGMarkets
88
88
  instantiate_models Application, session.get('operations/application')
89
89
  end
90
90
 
91
+ # Disables the API key currently in use by the logged in session. This means that any further requests to the IG
92
+ # Markets API with this key will fail with the error `error.security.api-key-disabled`. Disabled API keys can only
93
+ # be re-enabled through the web platform.
94
+ #
95
+ # @return [Application]
96
+ def disable_api_key
97
+ instantiate_models Application, session.put('operations/application/disable')
98
+ end
99
+
91
100
  # This method is used to instantiate the various `Model` subclasses from data returned by the IG Markets API. It
92
101
  # recurses through arrays and sub-hashes present in `source`, instantiating the required models based on the types
93
102
  # of each attribute as defined on the models. All model instances returned by this method will have their
@@ -126,8 +126,6 @@ module IGMarkets
126
126
  # attributes to be set on the model but not have them be part of the model's structure.
127
127
  #
128
128
  # @param [Array<Symbol>] names The names of the deprecated attributes.
129
- #
130
- # @return [void]
131
129
  def deprecated_attribute(*names)
132
130
  names.each do |name|
133
131
  define_method "#{name}=" do |_value|
@@ -9,8 +9,6 @@ module IGMarkets
9
9
  # Prints out an options hash that is ready to be passed to `RestClient::Request.execute`.
10
10
  #
11
11
  # @param [Hash] options The options hash.
12
- #
13
- # @return [void]
14
12
  def print_options(options)
15
13
  return unless enabled
16
14
 
@@ -27,8 +25,6 @@ module IGMarkets
27
25
  # Formats and prints a JSON response body.
28
26
  #
29
27
  # @param [String] body The response body.
30
- #
31
- # @return [void]
32
28
  def print_response_body(body)
33
29
  return unless enabled
34
30
 
@@ -84,7 +84,7 @@ module IGMarkets
84
84
  # @param [Fixnum] api_version The API version to target.
85
85
  #
86
86
  # @return [Hash] The response from the IG Markets API.
87
- def put(url, payload, api_version = API_V1)
87
+ def put(url, payload = nil, api_version = API_V1)
88
88
  request(method: :put, url: url, payload: payload, api_version: api_version).fetch :result
89
89
  end
90
90
 
@@ -99,16 +99,12 @@ module IGMarkets
99
99
  request(method: :delete, url: url, payload: payload, api_version: api_version).fetch :result
100
100
  end
101
101
 
102
- # Returns a human-readable string containing this session's details.
103
- #
104
- # @return [String]
105
- def inspect
106
- "#<#{self.class.name} #{client_security_token}, #{x_security_token}>"
107
- end
108
-
109
102
  private
110
103
 
111
- HOST_URLS = { demo: 'https://demo-api.ig.com/gateway/deal/', production: 'https://api.ig.com/gateway/deal/' }.freeze
104
+ HOST_URLS = {
105
+ demo: 'https://demo-api.ig.com/gateway/deal/',
106
+ production: 'https://api.ig.com/gateway/deal/'
107
+ }.freeze
112
108
 
113
109
  def validate_authentication
114
110
  %i(username password api_key).each do |attribute|
@@ -1,4 +1,4 @@
1
1
  module IGMarkets
2
2
  # The version of this gem.
3
- VERSION = '0.9'.freeze
3
+ VERSION = '0.10'.freeze
4
4
  end
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.9'
4
+ version: '0.10'
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-05-02 00:00:00.000000000 Z
11
+ date: 2016-05-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize