ig_markets 0.28 → 0.29
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -2
- data/README.md +9 -6
- data/lib/ig_markets.rb +1 -0
- data/lib/ig_markets/cli/commands/account_command.rb +1 -1
- data/lib/ig_markets/cli/commands/activities_command.rb +2 -2
- data/lib/ig_markets/cli/commands/markets_command.rb +1 -1
- data/lib/ig_markets/cli/commands/orders_command.rb +1 -1
- data/lib/ig_markets/cli/commands/performance_command.rb +2 -2
- data/lib/ig_markets/cli/commands/positions_command.rb +1 -1
- data/lib/ig_markets/cli/commands/prices_command.rb +1 -1
- data/lib/ig_markets/cli/commands/search_command.rb +1 -1
- data/lib/ig_markets/cli/commands/sentiment_command.rb +1 -1
- data/lib/ig_markets/cli/commands/sprints_command.rb +1 -1
- data/lib/ig_markets/cli/commands/stream_command.rb +6 -3
- data/lib/ig_markets/cli/commands/transactions_command.rb +2 -2
- data/lib/ig_markets/cli/commands/watchlists_command.rb +1 -1
- data/lib/ig_markets/cli/main.rb +5 -3
- data/lib/ig_markets/cli/tables/accounts_table.rb +29 -26
- data/lib/ig_markets/cli/tables/activities_table.rb +23 -21
- data/lib/ig_markets/cli/tables/client_sentiments_table.rb +21 -19
- data/lib/ig_markets/cli/tables/historical_price_result_snapshots_table.rb +17 -15
- data/lib/ig_markets/cli/tables/market_overviews_table.rb +29 -26
- data/lib/ig_markets/cli/tables/markets_table.rb +8 -6
- data/lib/ig_markets/cli/tables/performances_table.rb +25 -23
- data/lib/ig_markets/cli/tables/positions_table.rb +71 -69
- data/lib/ig_markets/cli/tables/sprint_market_positions_table.rb +39 -37
- data/lib/ig_markets/cli/tables/table.rb +70 -68
- data/lib/ig_markets/cli/tables/transactions_table.rb +30 -27
- data/lib/ig_markets/cli/tables/working_orders_table.rb +20 -17
- data/lib/ig_markets/dealing_platform/account_methods.rb +11 -11
- data/lib/ig_markets/instrument.rb +0 -6
- data/lib/ig_markets/limited_risk_premium.rb +8 -0
- data/lib/ig_markets/position.rb +1 -0
- data/lib/ig_markets/transaction.rb +1 -1
- data/lib/ig_markets/version.rb +1 -1
- data/lib/ig_markets/working_order.rb +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 187077cf0cdb9a078657a52a828e246bf7dcfe66
|
4
|
+
data.tar.gz: 1ce4e0be008ef0d432257ecc126ff0637b76bb89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e50a5d55b0b8215a2c03e00f57424c61b0bddb04a8dc46558dd1fdc36a08b1335f0b8d37219bea25fdc8e0a5ca17822135ba3119718461ad0e0b84116c482d8
|
7
|
+
data.tar.gz: e509ac730be8ba25036a347649ebf059148f451405c77125a728de390acdbf30393c3d7ab0dc341f84837bff2adf8185568eb22d50623e74b75ba19e6abbf7e4
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,20 @@
|
|
1
1
|
# IG Markets Changelog
|
2
2
|
|
3
|
+
### 0.29 — March 8, 2017
|
4
|
+
|
5
|
+
- The `IGMarkets::AccountMethods#activities` and `IGMarkets::AccountMethods#transactions` now take `Time`
|
6
|
+
values for `:from` and `:to` instead of `Date` values
|
7
|
+
- The `ig_markets activities`, `ig_markets performance` and `ig_markets transactions` commands now expect
|
8
|
+
their optional `--from` option to be formatted as `yyyy-mm-ddThh:mm:ss`
|
9
|
+
- Fixed `IGMarkets::AccountMethods#activities` and `IGMarkets::AccountMethods#transactions` never returning
|
10
|
+
if there were more than 500 activities or transactions in a single day during the specified period
|
11
|
+
- Added `IGMarkets::Position#limited_risk_premium` and `IGMarkets::WorkingOrder#limited_risk_premium`
|
12
|
+
- Supprt the `chart` transaction type
|
13
|
+
|
3
14
|
### 0.28 — February 24, 2017
|
4
15
|
|
5
|
-
- Added IGMarkets::Instrument#limited_risk_premium
|
6
|
-
- Added IGMarkets::Transaction#open_date_utc
|
16
|
+
- Added `IGMarkets::Instrument#limited_risk_premium`
|
17
|
+
- Added `IGMarkets::Transaction#open_date_utc`
|
7
18
|
- Added `#currency`, `#good_till_date`, `#order_type` and `#time_in_force` attributes to
|
8
19
|
`IGMarkets::Streaming::WorkingOrderUpdate`
|
9
20
|
- Fixed `IGMarkets::AccountState` not updating its working orders when a level update is received
|
data/README.md
CHANGED
@@ -119,7 +119,7 @@ ig_markets account
|
|
119
119
|
# Print EUR/USD transactions from the last week, excluding interest transactions
|
120
120
|
ig_markets transactions --days 7 --instrument EUR/USD --no-interest
|
121
121
|
|
122
|
-
# Search for EURUSD markets
|
122
|
+
# Search for EURUSD currency markets
|
123
123
|
ig_markets search EURUSD --type currencies
|
124
124
|
|
125
125
|
# Print details for the EURUSD pair and the Dow Jones Industrial Average
|
@@ -181,13 +181,16 @@ ig = IGMarkets::DealingPlatform.new
|
|
181
181
|
ig.sign_in 'username', 'password', 'api_key', :demo
|
182
182
|
ig.sign_out
|
183
183
|
|
184
|
+
one_week = 7 * 24 * 60 * 60
|
185
|
+
two_weeks = 14 * 24 * 60 * 60
|
186
|
+
|
184
187
|
# Account
|
185
188
|
ig.account.all
|
186
|
-
ig.account.activities from:
|
187
|
-
ig.account.activities from:
|
188
|
-
ig.account.transactions from:
|
189
|
-
ig.account.transactions from:
|
190
|
-
ig.account.transactions from:
|
189
|
+
ig.account.activities from: Time.now - one_week
|
190
|
+
ig.account.activities from: Time.now - one_week, to: Time.now - one_week
|
191
|
+
ig.account.transactions from: Time.now - one_week
|
192
|
+
ig.account.transactions from: Time.now - two_weeks, to: Time.now - one_week
|
193
|
+
ig.account.transactions from: Time.now - two_weeks, to: Time.now - one_week, type: :withdrawal
|
191
194
|
|
192
195
|
# Dealing
|
193
196
|
ig.deal_confirmation 'deal_reference'
|
data/lib/ig_markets.rb
CHANGED
@@ -35,6 +35,7 @@ require 'ig_markets/dealing_platform/watchlist_methods'
|
|
35
35
|
require 'ig_markets/dealing_platform/working_order_methods'
|
36
36
|
require 'ig_markets/errors'
|
37
37
|
require 'ig_markets/format'
|
38
|
+
require 'ig_markets/limited_risk_premium'
|
38
39
|
require 'ig_markets/instrument'
|
39
40
|
require 'ig_markets/historical_price_result'
|
40
41
|
require 'ig_markets/market'
|
@@ -5,7 +5,7 @@ module IGMarkets
|
|
5
5
|
desc 'activities', 'Prints account activities'
|
6
6
|
|
7
7
|
option :days, type: :numeric, required: true, desc: 'The number of days to print account activities for'
|
8
|
-
option :from, desc: 'The
|
8
|
+
option :from, desc: 'The date and time to print account activities from, format: yyyy-mm-ddThh:mm:ss'
|
9
9
|
option :epic, desc: 'Regex for filtering activities based on their EPIC'
|
10
10
|
option :sort_by, enum: %w(channel date epic type), default: 'date', desc: 'The attribute to sort activities by'
|
11
11
|
|
@@ -15,7 +15,7 @@ module IGMarkets
|
|
15
15
|
|
16
16
|
activities = gather_activities dealing_platform
|
17
17
|
|
18
|
-
table = ActivitiesTable.new activities
|
18
|
+
table = Tables::ActivitiesTable.new activities
|
19
19
|
|
20
20
|
puts table
|
21
21
|
end
|
@@ -5,14 +5,14 @@ module IGMarkets
|
|
5
5
|
desc 'performance', 'Prints a summary of trading performance over a period'
|
6
6
|
|
7
7
|
option :days, type: :numeric, required: true, desc: 'The number of days to print performance for'
|
8
|
-
option :from, desc: 'The
|
8
|
+
option :from, desc: 'The date and time to show performance from, format: yyyy-mm-ddThh:mm:ss'
|
9
9
|
|
10
10
|
def performance
|
11
11
|
self.class.begin_session(options) do |dealing_platform|
|
12
12
|
performances = gather_performances dealing_platform
|
13
13
|
lookup_instrument_names performances, dealing_platform
|
14
14
|
|
15
|
-
table = PerformancesTable.new performances
|
15
|
+
table = Tables::PerformancesTable.new performances
|
16
16
|
|
17
17
|
puts table
|
18
18
|
|
@@ -12,7 +12,7 @@ module IGMarkets
|
|
12
12
|
position.market.instrument_type == :binary
|
13
13
|
end
|
14
14
|
|
15
|
-
positions_table = PositionsTable.new positions, aggregate: options[:aggregate]
|
15
|
+
positions_table = Tables::PositionsTable.new positions, aggregate: options[:aggregate]
|
16
16
|
|
17
17
|
puts positions_table
|
18
18
|
|
@@ -19,7 +19,7 @@ module IGMarkets
|
|
19
19
|
result = historical_price_result dealing_platform
|
20
20
|
allowance = result.metadata.allowance
|
21
21
|
|
22
|
-
table = HistoricalPriceResultSnapshotsTable.new result.prices, title: "Prices for #{options[:epic]}"
|
22
|
+
table = Tables::HistoricalPriceResultSnapshotsTable.new result.prices, title: "Prices for #{options[:epic]}"
|
23
23
|
|
24
24
|
puts <<-END
|
25
25
|
#{table}
|
@@ -11,7 +11,7 @@ module IGMarkets
|
|
11
11
|
self.class.begin_session(options) do |dealing_platform|
|
12
12
|
market_overviews = gather_market_overviews dealing_platform, query
|
13
13
|
|
14
|
-
table = MarketOverviewsTable.new market_overviews
|
14
|
+
table = Tables::MarketOverviewsTable.new market_overviews
|
15
15
|
|
16
16
|
puts table
|
17
17
|
end
|
@@ -9,7 +9,7 @@ module IGMarkets
|
|
9
9
|
client_sentiment = dealing_platform.client_sentiment[market]
|
10
10
|
client_sentiments = [client_sentiment, :separator, client_sentiment.related_sentiments]
|
11
11
|
|
12
|
-
table = ClientSentimentsTable.new client_sentiments, title: "Client sentiment for '#{market}'"
|
12
|
+
table = Tables::ClientSentimentsTable.new client_sentiments, title: "Client sentiment for '#{market}'"
|
13
13
|
|
14
14
|
puts table
|
15
15
|
end
|
@@ -109,9 +109,12 @@ module IGMarkets
|
|
109
109
|
account_state.process_queued_data
|
110
110
|
|
111
111
|
window.clear
|
112
|
-
window.print_lines AccountsTable.new(account_state.accounts).lines,
|
113
|
-
|
114
|
-
|
112
|
+
window.print_lines Tables::AccountsTable.new(account_state.accounts).lines,
|
113
|
+
'',
|
114
|
+
Tables::PositionsTable.new(account_state.positions, aggregate: options[:aggregate]).lines,
|
115
|
+
'',
|
116
|
+
Tables::WorkingOrdersTable.new(account_state.working_orders).lines,
|
117
|
+
''
|
115
118
|
window.refresh
|
116
119
|
end
|
117
120
|
end
|
@@ -5,7 +5,7 @@ module IGMarkets
|
|
5
5
|
desc 'transactions', 'Prints account transactions'
|
6
6
|
|
7
7
|
option :days, type: :numeric, required: true, desc: 'The number of days to print account transactions for'
|
8
|
-
option :from, desc: 'The
|
8
|
+
option :from, desc: 'The date and time to print account transactions from, format: yyyy-mm-ddThh:mm:ss'
|
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
11
|
option :sort_by, enum: %w(date instrument profit-loss type), default: 'date', desc: 'The attribute to sort ' \
|
@@ -17,7 +17,7 @@ module IGMarkets
|
|
17
17
|
|
18
18
|
transactions = gather_transactions dealing_platform
|
19
19
|
|
20
|
-
table = TransactionsTable.new transactions
|
20
|
+
table = Tables::TransactionsTable.new transactions
|
21
21
|
|
22
22
|
puts table
|
23
23
|
|
@@ -7,7 +7,7 @@ module IGMarkets
|
|
7
7
|
def list
|
8
8
|
Main.begin_session(options) do |dealing_platform|
|
9
9
|
dealing_platform.watchlists.all.each_with_index do |watchlist, index|
|
10
|
-
table = MarketOverviewsTable.new watchlist.markets, title: table_title(watchlist)
|
10
|
+
table = Tables::MarketOverviewsTable.new watchlist.markets, title: table_title(watchlist)
|
11
11
|
|
12
12
|
puts '' if index > 0
|
13
13
|
puts table
|
data/lib/ig_markets/cli/main.rb
CHANGED
@@ -30,13 +30,15 @@ module IGMarkets
|
|
30
30
|
# Turns the `:days` and `:from` options into a hash with `:from` and `:to` keys that can be passed to
|
31
31
|
# {AccountMethods#activities} and {AccountMethods#transactions}.
|
32
32
|
def history_options
|
33
|
+
days_in_seconds = options[:days] * 24 * 60 * 60
|
34
|
+
|
33
35
|
if options[:from]
|
34
|
-
from =
|
35
|
-
to = from +
|
36
|
+
from = Time.strptime options[:from], '%FT%T'
|
37
|
+
to = from + days_in_seconds
|
36
38
|
|
37
39
|
{ from: from, to: to }
|
38
40
|
else
|
39
|
-
{ from:
|
41
|
+
{ from: Time.now - days_in_seconds }
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
@@ -1,38 +1,41 @@
|
|
1
1
|
module IGMarkets
|
2
2
|
module CLI
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module Tables
|
4
|
+
# Helper class that prints out an array of {IGMarkets::Account} instances in a table.
|
5
|
+
class AccountsTable < Table
|
6
|
+
private
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
def default_title
|
9
|
+
'Accounts'
|
10
|
+
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
def headings
|
13
|
+
['Name', 'ID', 'Type', 'Currency', 'Status', 'Preferred', 'Available', 'Balance', 'Margin', 'Profit/loss']
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
def right_aligned_columns
|
17
|
+
[6, 7, 8, 9]
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
def row(account)
|
21
|
+
type = { cfd: 'CFD', physical: 'Physical', spreadbet: 'Spreadbet' }.fetch account.account_type
|
22
|
+
status = { disabled: 'Disabled', enabled: 'Enabled',
|
23
|
+
suspended_from_dealing: 'Suspended' }.fetch account.status
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
[account.account_name, account.account_id, type, account.currency, status, account.preferred] +
|
26
|
+
[:available, :balance, :deposit, :profit_loss].map do |attribute|
|
27
|
+
Format.currency account.balance.send(attribute), account.currency
|
28
|
+
end
|
29
|
+
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
+
def cell_color(value, _model, _row_index, column_index)
|
32
|
+
return unless headings[column_index] == 'Profit/loss'
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
34
|
+
if value =~ /-/
|
35
|
+
:red
|
36
|
+
else
|
37
|
+
:green
|
38
|
+
end
|
36
39
|
end
|
37
40
|
end
|
38
41
|
end
|
@@ -1,33 +1,35 @@
|
|
1
1
|
module IGMarkets
|
2
2
|
module CLI
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module Tables
|
4
|
+
# Helper class that prints out an array of {IGMarkets::Activity} instances in a table.
|
5
|
+
class ActivitiesTable < Table
|
6
|
+
private
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
def default_title
|
9
|
+
'Activities'
|
10
|
+
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
def headings
|
13
|
+
%w(Date Channel Type Status EPIC Market Size Level Limit Stop Result)
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
def right_aligned_columns
|
17
|
+
[6, 7, 8, 9]
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
20
|
+
def row(activity)
|
21
|
+
details = activity.details
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
[activity.date, activity.channel, activity.type, activity.status, activity.epic, details.market_name,
|
24
|
+
details.size, details.level, details.limit_level, details.stop_level, action_types(details)]
|
25
|
+
end
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
def action_types(details)
|
28
|
+
types = details.actions.map(&:action_type).uniq
|
29
|
+
types.delete :unknown
|
29
30
|
|
30
|
-
|
31
|
+
types.map { |v| format_cell_value v }.join ', '
|
32
|
+
end
|
31
33
|
end
|
32
34
|
end
|
33
35
|
end
|
@@ -1,29 +1,31 @@
|
|
1
1
|
module IGMarkets
|
2
2
|
module CLI
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module Tables
|
4
|
+
# Helper class that prints out an array of {IGMarkets::ClientSentiment} instances in a table.
|
5
|
+
class ClientSentimentsTable < Table
|
6
|
+
private
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
def headings
|
9
|
+
['Market', 'Long %', 'Short %']
|
10
|
+
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
def right_aligned_columns
|
13
|
+
[1, 2]
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
def row(client_sentiment)
|
17
|
+
[client_sentiment.market_id, client_sentiment.long_position_percentage,
|
18
|
+
client_sentiment.short_position_percentage]
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
|
21
|
+
def cell_color(_value, client_sentiment, _row_index, _column_index)
|
22
|
+
distance_from_center = (client_sentiment.long_position_percentage - 50.0).abs
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
if distance_from_center > 35
|
25
|
+
:red
|
26
|
+
elsif distance_from_center > 20
|
27
|
+
:yellow
|
28
|
+
end
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
@@ -1,24 +1,26 @@
|
|
1
1
|
module IGMarkets
|
2
2
|
module CLI
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
module Tables
|
4
|
+
# Helper class that prints out an array of {IGMarkets::HistoricalPriceResult::Snapshot} instances in a table.
|
5
|
+
class HistoricalPriceResultSnapshotsTable < Table
|
6
|
+
private
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
def headings
|
9
|
+
%w(Date Open Close Low High)
|
10
|
+
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
def right_aligned_columns
|
13
|
+
[1, 2, 3, 4]
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
def row(snapshot)
|
17
|
+
[snapshot.snapshot_time_utc, format_price(snapshot.open_price), format_price(snapshot.close_price),
|
18
|
+
format_price(snapshot.low_price), format_price(snapshot.high_price)]
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
-
|
21
|
+
def format_price(price)
|
22
|
+
(price.ask + price.bid) / 2.0
|
23
|
+
end
|
22
24
|
end
|
23
25
|
end
|
24
26
|
end
|