ig_markets 0.9 → 0.10

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