ib-api 972.5 → 972.5.2

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.
@@ -514,11 +514,34 @@ Format of serialisation
514
514
  (account ? "/#{account}" : '') +
515
515
  (commission ? " fee #{commission}" : '') + ">"
516
516
  end
517
+
518
+
519
+ def table_header
520
+ [ 'account','status' ,'', 'Type', 'tif', 'action', 'amount','price' , 'id/fee' ]
521
+ end
522
+
523
+ def table_row
524
+ [ account, order_ref.present? ? order_ref.to_s : status,
525
+ contract.to_human[1..-2],
526
+ self[:order_type] ,
527
+ self[:tif],
528
+ action,
529
+ total_quantity,
530
+ (limit_price ? "#{limit_price} " : '') + ((aux_price && aux_price != 0) ? "/#{aux_price}" : '') ,
531
+ commission ? " fee #{commission}" : local_id ]
532
+ end
533
+
517
534
  def serialize_rabbit
518
535
  { 'Contract' => contract.present? ? contract.serialize( :option, :trading_class ): '' ,
519
536
  'Order' => self,
520
537
  'OrderState' => order_state}
521
538
  end
522
539
 
540
+ # expell uncommon attributes
541
+ def invariant_attributes
542
+ attributes.reject{ |x| [ :designated_location, :display_size, :etrade_only, :exempt_code, :ext_operator, :random_size, :random_price, :firm_quote_only, :scale_auto_reset, :scale_random_percent, :scale_table, :short_sale_slot, :solicided, :created_at, :modified_at ].include? x }
543
+
544
+ end
545
+
523
546
  end # class Order
524
547
  end # module IB
@@ -47,18 +47,40 @@ class PortfolioValue < IB::Model
47
47
  end
48
48
  alias to_s to_human
49
49
 
50
+ def table_header
51
+ if block_given?
52
+ [ '' , yield , 'pos', 'entry', 'market', 'value', 'unrealized', 'realized' ]
53
+ else
54
+ [ '' , '', 'pos', 'entry', 'market', 'value', 'unrealized', 'realized' ]
55
+ end
56
+ end
57
+
58
+ def table_row
59
+ outprice= ->( item ) { { value: item.nil? ? "--" : item , alignment: :right } }
60
+
61
+ the_account = if account.present?
62
+ if account.is_a?(String)
63
+ account + " "
64
+ else
65
+ account.account+" "
66
+ end
67
+ else
68
+ ""
69
+ end
70
+
71
+ entry = average_cost.to_f / (contract.multiplier.to_i.zero? ? 1 : contract.multiplier.to_i)
72
+
73
+ [ the_account,
74
+ contract.to_human[1..-2],
75
+ outprice[position.to_i],
76
+ outprice[entry.to_f.round(3)],
77
+ outprice[market_price.to_f.round(3)],
78
+ outprice[market_value.to_f.round(2)],
79
+ unrealized_pnl.to_i.zero? ? "": outprice[unrealized_pnl],
80
+ realized_pnl.to_i.zero? ? "" : outprice[realized_pnl]
81
+ ]
82
+ end
83
+
50
84
 
51
- # def to_invest
52
- # a=attributes
53
- # a.delete "created_at"
54
- # a.delete "updated_at"
55
- # a.delete "id"
56
- # a.delete "account_id"
57
- # a.delete "currency_id"
58
- # a[:currency] = currency.symbol.presence || currency.name.presence || nil unless currency.nil?
59
- # a #return_value
60
- #
61
- #
62
- # end
63
85
  end # class
64
86
  end # module
@@ -1,4 +1,3 @@
1
- # require 'ib/verify'
2
1
  module IB
3
2
  if defined?(Spread)
4
3
  puts "Bag already a #{defined?(Spread)}"
@@ -21,7 +20,7 @@ Adds (or substracts) relative (back) measures to the front month, just passes ab
21
20
  front: 20180908 back: 1w (-1w) --> 20180918 (20180902)
22
21
  =end
23
22
 
24
- def transform_distance front, back
23
+ def self.transform_distance front, back
25
24
  # Check Format of back: 201809 --> > 200.000
26
25
  # 20180989 ---> 20.000.000
27
26
  start_date = front.to_i < 20000000 ? Date.strptime(front.to_s,"%Y%m") : Date.strptime(front.to_s,"%Y%m%d")
@@ -80,17 +79,14 @@ Adds (or substracts) relative (back) measures to the front month, just passes ab
80
79
  # Default: action: :buy, weight: 1
81
80
 
82
81
  def add_leg contract, **leg_params
83
- evaluated_contracts = []
84
- nc = contract.verify.first.essential
82
+ error "need a IB::Contract as first argument" unless contract.is_a? IB::Contract
83
+ self.legs << contract
84
+ error "cannot add leg if no con_id is provided" if contract.con_id.blank?
85
85
  # weigth = 1 --> sets Combo.side to buy and overwrites the action statement
86
86
  # leg_params[:weight] = 1 unless leg_params.key?(:weight) || leg_params.key?(:ratio)
87
- if nc.is_a?( IB::Contract) && nc.con_id.present?
88
- the_leg= ComboLeg.new( nc.attributes.slice( :con_id, :exchange )
89
- .merge( leg_params ))
90
- self.combo_legs << the_leg
91
- self.description = "#{description.nil? ? "": description} added #{nc.to_human}" rescue "Spread: #{nc.to_human}"
92
- self.legs << nc
93
- end
87
+ self.combo_legs << ComboLeg.new( contract.attributes.slice( :con_id, :exchange ).merge( leg_params ))
88
+ self.description = "#{description.nil? ? "": description} added #{contract.to_human}" rescue "Spread: #{contract.to_human}"
89
+
94
90
  self # return value to enable chaining
95
91
 
96
92
 
@@ -98,13 +94,20 @@ Adds (or substracts) relative (back) measures to the front month, just passes ab
98
94
 
99
95
  # removes the contract from the spread definition
100
96
  #
101
- def remove_leg contract
102
- contract.verify do |c|
103
- legs.delete_if { |x| x.con_id == c.con_id }
104
- combo_legs.delete_if { |x| x.con_id == c.con_id }
105
- self.description = description + " removed #{c.to_human}"
106
- end
107
- self
97
+ def remove_leg contract_or_position = nil
98
+ contract = if contract_or_position.is_a? (IB::Contract)
99
+ contract_or_position
100
+ elsif contract_or_position.is_a? Numeric
101
+ legs.at contract_or_position
102
+ else
103
+ error "Specify a contract to be removed or the position in the legs-array as parameter to remove a leg"
104
+ end
105
+ the_con_id = contract.verify.first &.con_id
106
+ error "Invalid Contract specified" unless the_con_id.is_a? Numeric
107
+ legs.delete_if { |x| x.con_id == the_con_id }
108
+ combo_legs.delete_if { |x| x.con_id == the_con_id }
109
+ self.description = description + " removed #{contract.to_human}"
110
+ self # make method chainable
108
111
  end
109
112
 
110
113
  # essentail
@@ -146,6 +149,18 @@ Adds (or substracts) relative (back) measures to the front month, just passes ab
146
149
  # end
147
150
 
148
151
 
152
+ def as_table
153
+ t= Terminal::Table.new title: description[1..-2] ,
154
+ headings: table_header,
155
+
156
+ style: { border: :unicode }
157
+
158
+ t.add_row table_row
159
+ legs.each{ |y| t.add_row y.table_row }
160
+ t.render
161
+
162
+ end
163
+
149
164
  def self.build_from_json container
150
165
  read_leg = ->(a) do
151
166
  IB::ComboLeg.new :con_id => a.read_int,
data/lib/requires.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'active_support/core_ext/module/attribute_accessors.rb'
2
- require 'extensions/class-extensions'
2
+ require_relative 'extensions/class-extensions'
3
3
 
4
+ require 'terminal-table'
4
5
 
5
6
  require 'ib/version'
6
7
  require 'ib/errors'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ib-api
3
3
  version: !ruby/object:Gem::Version
4
- version: '972.5'
4
+ version: 972.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hartmut Bischoff
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-01 00:00:00.000000000 Z
11
+ date: 2023-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,34 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: ox
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: terminal-table
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  description: Ruby Implementation of the Interactive Brokers TWS API
84
112
  email:
85
113
  - topofocus@gmail.com
@@ -110,7 +138,6 @@ files:
110
138
  - lib/ib/connection.rb
111
139
  - lib/ib/constants.rb
112
140
  - lib/ib/errors.rb
113
- - lib/ib/logger.rb
114
141
  - lib/ib/messages.rb
115
142
  - lib/ib/messages/abstract_message.rb
116
143
  - lib/ib/messages/incoming.rb
@@ -138,6 +165,7 @@ files:
138
165
  - lib/ib/messages/outgoing/request_tick_data.rb
139
166
  - lib/ib/model.rb
140
167
  - lib/ib/models.rb
168
+ - lib/ib/raw_message.rb
141
169
  - lib/ib/server_versions.rb
142
170
  - lib/ib/socket.rb
143
171
  - lib/ib/support.rb
@@ -185,7 +213,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
213
  - !ruby/object:Gem::Version
186
214
  version: '0'
187
215
  requirements: []
188
- rubygems_version: 3.2.3
216
+ rubygems_version: 3.3.7
189
217
  signing_key:
190
218
  specification_version: 4
191
219
  summary: Ruby Implementation of the Interactive Brokers TWS API
data/lib/ib/logger.rb DELETED
@@ -1,26 +0,0 @@
1
- require "logger"
2
- module LogDev
3
- # define default_logger
4
- def default_logger
5
- @default_logger ||= Logger.new(STDOUT).tap do |l|
6
- l.formatter = proc do |severity, datetime, progname, msg|
7
- # "#{datetime.strftime("%d.%m.(%X)")}#{"%5s" % severity}->#{progname}##{msg}\n"
8
- ## the default logger displays the message only
9
- msg.to_s + "\n"
10
- end
11
- l.level = Logger::INFO
12
- end
13
- end
14
-
15
-
16
- def default_logger= logger
17
- @default_logger = logger
18
- end
19
-
20
- # Add universally accessible log method/accessor into Object
21
- def logger *args
22
- default_logger.tap do |logger|
23
- logger.fatal *args unless args.empty?
24
- end
25
- end
26
- end # module