ib-ruby 0.8.1 → 0.8.3

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.
Files changed (128) hide show
  1. data/.gitignore +0 -1
  2. data/HISTORY +5 -0
  3. data/README.md +47 -53
  4. data/Rakefile +2 -1
  5. data/VERSION +1 -1
  6. data/app/assets/javascripts/ib/application.js +15 -0
  7. data/app/assets/javascripts/ib/underlyings.js +2 -0
  8. data/app/assets/stylesheets/ib/application.css +13 -0
  9. data/app/assets/stylesheets/ib/underlyings.css +4 -0
  10. data/app/assets/stylesheets/scaffold.css +56 -0
  11. data/app/controllers/ib/application_controller.rb +5 -0
  12. data/app/controllers/ib/underlyings_controller.rb +87 -0
  13. data/app/helpers/ib/application_helper.rb +4 -0
  14. data/app/helpers/ib/underlyings_helper.rb +4 -0
  15. data/app/models/ib/underlying.rb +5 -0
  16. data/app/views/ib/underlyings/_form.html.erb +33 -0
  17. data/app/views/ib/underlyings/edit.html.erb +6 -0
  18. data/app/views/ib/underlyings/index.html.erb +29 -0
  19. data/app/views/ib/underlyings/new.html.erb +5 -0
  20. data/app/views/ib/underlyings/show.html.erb +25 -0
  21. data/app/views/layouts/ib/application.html.erb +14 -0
  22. data/config/routes.rb +6 -0
  23. data/db/config.yml +19 -0
  24. data/db/migrate/{101_add_executions.rb → 101_add_ib_executions.rb} +2 -2
  25. data/db/migrate/{111_add_bars.rb → 111_add_ib_bars.rb} +2 -2
  26. data/db/migrate/{121_add_order_states.rb → 121_add_ib_order_states.rb} +2 -2
  27. data/db/migrate/{131_add_orders.rb → 131_add_ib_orders.rb} +2 -2
  28. data/db/migrate/{141_add_combo_legs.rb → 141_add_ib_combo_legs.rb} +2 -2
  29. data/db/migrate/{151_add_underlyings.rb → 151_add_ib_underlyings.rb} +2 -2
  30. data/db/migrate/{161_add_contract_details.rb → 161_add_ib_contract_details.rb} +2 -2
  31. data/db/migrate/{171_add_contracts.rb → 171_add_ib_contracts.rb} +2 -2
  32. data/db/schema.rb +245 -0
  33. data/lib/ib/base.rb +97 -0
  34. data/lib/ib/base_properties.rb +140 -0
  35. data/lib/{ib-ruby → ib}/connection.rb +2 -2
  36. data/lib/{ib-ruby → ib}/constants.rb +0 -0
  37. data/lib/{ib-ruby → ib}/db.rb +9 -5
  38. data/lib/ib/engine.rb +35 -0
  39. data/lib/{ib-ruby → ib}/errors.rb +0 -0
  40. data/lib/{ib-ruby → ib}/extensions.rb +2 -2
  41. data/lib/{ib-ruby → ib}/logger.rb +0 -0
  42. data/lib/{ib-ruby → ib}/messages/abstract_message.rb +0 -0
  43. data/lib/{ib-ruby → ib}/messages/incoming/abstract_message.rb +1 -1
  44. data/lib/{ib-ruby → ib}/messages/incoming/alert.rb +0 -0
  45. data/lib/{ib-ruby → ib}/messages/incoming/contract_data.rb +0 -0
  46. data/lib/{ib-ruby → ib}/messages/incoming/delta_neutral_validation.rb +0 -0
  47. data/lib/{ib-ruby → ib}/messages/incoming/execution_data.rb +0 -0
  48. data/lib/{ib-ruby → ib}/messages/incoming/historical_data.rb +0 -0
  49. data/lib/{ib-ruby → ib}/messages/incoming/market_depths.rb +0 -0
  50. data/lib/{ib-ruby → ib}/messages/incoming/next_valid_id.rb +0 -0
  51. data/lib/{ib-ruby → ib}/messages/incoming/open_order.rb +0 -0
  52. data/lib/{ib-ruby → ib}/messages/incoming/order_status.rb +0 -0
  53. data/lib/{ib-ruby → ib}/messages/incoming/portfolio_value.rb +0 -0
  54. data/lib/{ib-ruby → ib}/messages/incoming/real_time_bar.rb +0 -0
  55. data/lib/{ib-ruby → ib}/messages/incoming/scanner_data.rb +0 -0
  56. data/lib/{ib-ruby → ib}/messages/incoming/ticks.rb +0 -0
  57. data/lib/{ib-ruby → ib}/messages/incoming.rb +14 -14
  58. data/lib/{ib-ruby → ib}/messages/outgoing/abstract_message.rb +1 -1
  59. data/lib/{ib-ruby → ib}/messages/outgoing/bar_requests.rb +0 -0
  60. data/lib/{ib-ruby → ib}/messages/outgoing/place_order.rb +0 -0
  61. data/lib/{ib-ruby → ib}/messages/outgoing.rb +5 -5
  62. data/lib/ib/messages.rb +8 -0
  63. data/lib/ib/model.rb +8 -0
  64. data/lib/ib/models.rb +10 -0
  65. data/lib/ib/requires.rb +9 -0
  66. data/lib/{ib-ruby → ib}/socket.rb +0 -0
  67. data/lib/{ib-ruby → ib}/symbols/forex.rb +1 -1
  68. data/lib/{ib-ruby → ib}/symbols/futures.rb +2 -2
  69. data/lib/{ib-ruby → ib}/symbols/options.rb +1 -1
  70. data/lib/{ib-ruby → ib}/symbols/stocks.rb +1 -1
  71. data/lib/ib/symbols.rb +9 -0
  72. data/lib/{ib-ruby → ib}/version.rb +0 -0
  73. data/lib/ib-ruby.rb +2 -24
  74. data/lib/ib.rb +23 -0
  75. data/lib/models/ib/bag.rb +51 -0
  76. data/lib/models/ib/bar.rb +41 -0
  77. data/lib/models/ib/combo_leg.rb +102 -0
  78. data/lib/models/ib/contract.rb +287 -0
  79. data/lib/models/ib/contract_detail.rb +68 -0
  80. data/lib/models/ib/execution.rb +62 -0
  81. data/lib/models/ib/option.rb +60 -0
  82. data/lib/models/ib/order.rb +389 -0
  83. data/lib/models/ib/order_state.rb +126 -0
  84. data/lib/models/ib/underlying.rb +35 -0
  85. data/spec/README.md +34 -2
  86. data/spec/TODO +5 -1
  87. data/spec/comb.rb +13 -0
  88. data/spec/db.rb +1 -1
  89. data/spec/db_helper.rb +3 -3
  90. data/spec/dummy.rb +13 -0
  91. data/spec/gw.rb +4 -0
  92. data/spec/{ib-ruby → ib}/connection_spec.rb +0 -0
  93. data/spec/{ib-ruby → ib}/messages/incoming/alert_spec.rb +0 -0
  94. data/spec/{ib-ruby → ib}/messages/incoming/open_order_spec.rb +0 -0
  95. data/spec/{ib-ruby → ib}/messages/incoming/order_status_spec.rb +16 -17
  96. data/spec/{ib-ruby → ib}/messages/outgoing/account_data_spec.rb +0 -0
  97. data/spec/{ib-ruby → ib}/messages/outgoing/market_data_type_spec.rb +0 -0
  98. data/spec/integration/historic_data_spec.rb +3 -3
  99. data/spec/integration/orders/trades_spec.rb +1 -1
  100. data/spec/{ib-ruby/models → models/ib}/bag_spec.rb +2 -7
  101. data/spec/{ib-ruby/models → models/ib}/bar_spec.rb +1 -6
  102. data/spec/{ib-ruby/models → models/ib}/combo_leg_spec.rb +2 -12
  103. data/spec/{ib-ruby/models → models/ib}/contract_detail_spec.rb +3 -8
  104. data/spec/{ib-ruby/models → models/ib}/contract_spec.rb +4 -12
  105. data/spec/{ib-ruby/models → models/ib}/execution_spec.rb +2 -7
  106. data/spec/{ib-ruby/models → models/ib}/option_spec.rb +1 -6
  107. data/spec/{ib-ruby/models → models/ib}/order_spec.rb +5 -10
  108. data/spec/{ib-ruby/models → models/ib}/order_state_spec.rb +2 -7
  109. data/spec/{ib-ruby/models → models/ib}/underlying_spec.rb +3 -7
  110. data/spec/my.rb +5 -0
  111. data/spec/spec_helper.rb +62 -36
  112. metadata +417 -544
  113. data/lib/ib-ruby/messages.rb +0 -8
  114. data/lib/ib-ruby/models/bag.rb +0 -54
  115. data/lib/ib-ruby/models/bar.rb +0 -43
  116. data/lib/ib-ruby/models/combo_leg.rb +0 -104
  117. data/lib/ib-ruby/models/contract.rb +0 -287
  118. data/lib/ib-ruby/models/contract_detail.rb +0 -70
  119. data/lib/ib-ruby/models/execution.rb +0 -64
  120. data/lib/ib-ruby/models/model.rb +0 -105
  121. data/lib/ib-ruby/models/model_properties.rb +0 -146
  122. data/lib/ib-ruby/models/option.rb +0 -62
  123. data/lib/ib-ruby/models/order.rb +0 -389
  124. data/lib/ib-ruby/models/order_state.rb +0 -128
  125. data/lib/ib-ruby/models/underlying.rb +0 -36
  126. data/lib/ib-ruby/models.rb +0 -15
  127. data/lib/ib-ruby/symbols.rb +0 -9
  128. data/spec/test.rb +0 -61
@@ -1,105 +0,0 @@
1
- module IB
2
- module Models
3
-
4
- # Base class for tableless IB data Models extends ActiveModel API
5
- class Model
6
- extend ActiveModel::Naming
7
- extend ActiveModel::Callbacks
8
- include ActiveModel::Validations
9
- include ActiveModel::Serialization
10
- include ActiveModel::Serializers::Xml
11
- include ActiveModel::Serializers::JSON
12
-
13
- # IB Models can be either database-backed, or not
14
- # require 'ib-ruby/db' # to make all IB models database-backed
15
- # If you plan to persist only specific Models, select those subclasses here:
16
- def self.for subclass
17
- if DB # && [:contract, :order, :order_state].include? subclass
18
- ActiveRecord::Base
19
- else
20
- Model
21
- end
22
- end
23
-
24
- #attr_accessor :attributes
25
-
26
- # If a opts hash is given, keys are taken as attribute names, values as data.
27
- # The model instance fields are then set automatically from the opts Hash.
28
- def initialize attributes={}, opts={}
29
- run_callbacks :initialize do
30
- error "Argument must be a Hash", :args unless attributes.is_a?(Hash)
31
-
32
- self.attributes = default_attributes.merge(attributes)
33
- end
34
- end
35
-
36
- # ActiveModel API (for serialization)
37
-
38
- def attributes
39
- @attributes ||= HashWithIndifferentAccess.new
40
- end
41
-
42
- def attributes= attrs
43
- attrs.keys.each { |key| self.send("#{key}=", attrs[key]) }
44
- end
45
-
46
- # ActiveModel-style read/write_attribute accessors
47
- def [] key
48
- attributes[key.to_sym]
49
- end
50
-
51
- def []= key, val
52
- # p key, val
53
- attributes[key.to_sym] = val
54
- end
55
-
56
- def to_model
57
- self
58
- end
59
-
60
- def new_record?
61
- true
62
- end
63
-
64
- def save
65
- valid?
66
- end
67
-
68
- alias save! save
69
-
70
- ### ActiveRecord::Base association API mocks
71
-
72
- def self.belongs_to model, *args
73
- attr_accessor model
74
- end
75
-
76
- def self.has_one model, *args
77
- attr_accessor model
78
- end
79
-
80
- def self.has_many models, *args
81
- attr_accessor models
82
-
83
- define_method(models) do
84
- self.instance_variable_get("@#{models}") ||
85
- self.instance_variable_set("@#{models}", [])
86
- end
87
- end
88
-
89
- def self.find *args
90
- []
91
- end
92
-
93
- ### ActiveRecord::Base callback API mocks
94
-
95
- define_model_callbacks :initialize, :only => :after
96
-
97
- ### ActiveRecord::Base misc
98
-
99
- def self.serialize *properties
100
- end
101
-
102
-
103
- end # Model
104
- end # module Models
105
- end # module IB
@@ -1,146 +0,0 @@
1
- require 'active_model'
2
- require 'active_support/concern'
3
- require 'active_support/hash_with_indifferent_access'
4
-
5
- module IB
6
- module Models
7
-
8
- # Module adds prop Macro and
9
- module ModelProperties
10
- extend ActiveSupport::Concern
11
-
12
- def default_attributes
13
- {:created_at => Time.now,
14
- :updated_at => Time.now,
15
- }
16
- end
17
-
18
- ### Instance methods
19
-
20
- # Default presentation
21
- def to_human
22
- "<#{self.class.to_s.demodulize}: " + attributes.map do |attr, value|
23
- "#{attr}: #{value}" unless value.nil?
24
- end.compact.sort.join(' ') + ">"
25
- end
26
-
27
- # Comparison support
28
- def content_attributes
29
- HashWithIndifferentAccess[attributes.reject do |(attr, _)|
30
- attr.to_s =~ /(_count)$/ ||
31
- [:created_at, :updated_at, :type,
32
- :id, :order_id, :contract_id].include?(attr.to_sym)
33
- end]
34
- end
35
-
36
- # Update nil attributes from given Hash or model
37
- def update_missing attrs
38
- attrs = attrs.content_attributes unless attrs.kind_of?(Hash)
39
-
40
- attrs.each { |attr, val| send "#{attr}=", val if send(attr).blank? }
41
- self # for chaining
42
- end
43
-
44
- # Default Model comparison
45
- def == other
46
- content_attributes.inject(true) { |res, (attr, value)| res && other.send(attr) == value } &&
47
- other.content_attributes.inject(true) { |res, (attr, value)| res && send(attr) == value }
48
- end
49
-
50
- included do
51
-
52
- ### Class macros
53
-
54
- def self.prop *properties
55
- prop_hash = properties.last.is_a?(Hash) ? properties.pop : {}
56
-
57
- properties.each { |names| define_property names, nil }
58
- prop_hash.each { |names, type| define_property names, type }
59
- end
60
-
61
- def self.define_property names, body
62
- aliases = [names].flatten
63
- name = aliases.shift
64
- instance_eval do
65
-
66
- define_property_methods name, body
67
-
68
- aliases.each do |ali|
69
- alias_method "#{ali}", name
70
- alias_method "#{ali}=", "#{name}="
71
- end
72
- end
73
- end
74
-
75
- def self.define_property_methods name, body={}
76
- #p name, body
77
- case body
78
- when '' # default getter and setter
79
- define_property_methods name
80
-
81
- when Array # [setter, getter, validators]
82
- define_property_methods name,
83
- :get => body[0],
84
- :set => body[1],
85
- :validate => body[2]
86
-
87
- when Hash # recursion base case
88
- getter = case # Define getter
89
- when body[:get].respond_to?(:call)
90
- body[:get]
91
- when body[:get]
92
- proc { self[name].send "to_#{body[:get]}" }
93
- when VALUES[name] # property is encoded
94
- proc { VALUES[name][self[name]] }
95
- #when respond_to?(:column_names) && column_names.include?(name.to_s)
96
- # # noop, ActiveRecord will take care of it...
97
- # p "#{name} => get noop"
98
- # p respond_to?(:column_names) && column_names
99
- else
100
- proc { self[name] }
101
- end
102
- define_method name, &getter if getter
103
-
104
- setter = case # Define setter
105
- when body[:set].respond_to?(:call)
106
- body[:set]
107
- when body[:set]
108
- proc { |value| self[name] = value.send "to_#{body[:set]}" }
109
- when CODES[name] # property is encoded
110
- proc { |value| self[name] = CODES[name][value] || value }
111
- else
112
- proc { |value| self[name] = value } # p name, value;
113
- end
114
- define_method "#{name}=", &setter if setter
115
-
116
- # Define validator(s)
117
- [body[:validate]].flatten.compact.each do |validator|
118
- case validator
119
- when Proc
120
- validates_each name, &validator
121
- when Hash
122
- validates name, validator.dup
123
- end
124
- end
125
-
126
- # TODO define self[:name] accessors for :virtual and :flag properties
127
-
128
- else # setter given
129
- define_property_methods name, :set => body, :get => body
130
- end
131
- end
132
-
133
- # Extending AR-backed Model class with attribute defaults
134
- if defined?(ActiveRecord::Base) && ancestors.include?(ActiveRecord::Base)
135
- def initialize attributes={}, opts={}
136
- super default_attributes.merge(attributes), opts
137
- end
138
- else
139
- # Timestamps
140
- prop :created_at, :updated_at
141
- end
142
-
143
- end # included
144
- end # module ModelProperties
145
- end # module Models
146
- end
@@ -1,62 +0,0 @@
1
- require 'ib-ruby/models/contract'
2
-
3
- module IB
4
- module Models
5
- class Option < Contract
6
-
7
- validates_numericality_of :strike, :greater_than => 0
8
- validates_format_of :sec_type, :with => /^option$/,
9
- :message => "should be an option"
10
- validates_format_of :local_symbol, :with => /^\w+\s*\d{6}[pcPC]\d{8}$|^$/,
11
- :message => "invalid OSI code"
12
- validates_format_of :right, :with => /^put$|^call$/,
13
- :message => "should be put or call"
14
-
15
- # For Options, this is contract's OSI (Option Symbology Initiative) name/code
16
- alias osi local_symbol
17
-
18
- def osi= value
19
- # Normalize to 21 char
20
- self.local_symbol = value.sub(/ /, ' '*(22-value.size))
21
- end
22
-
23
- # Make valid IB Contract definition from OSI (Option Symbology Initiative) code.
24
- # NB: Simply making a new Contract with *local_symbol* (osi) property set to a
25
- # valid OSI code works just as well, just do NOT set *expiry*, *right* or
26
- # *strike* properties in this case.
27
- # This class method provided as a backup and shows how to analyse OSI codes.
28
- def self.from_osi osi
29
-
30
- # Parse contract's OSI (OCC Option Symbology Initiative) code
31
- args = osi.match(/(\w+)\s?(\d\d)(\d\d)(\d\d)([pcPC])(\d+)/).to_a.drop(1)
32
- symbol = args.shift
33
- year = 2000 + args.shift.to_i
34
- month = args.shift.to_i
35
- day = args.shift.to_i
36
- right = args.shift.upcase
37
- strike = args.shift.to_i/1000.0
38
-
39
- # Set correct expiry date - IB expiry date differs from OSI if expiry date
40
- # falls on Saturday (see https://github.com/arvicco/option_mower/issues/4)
41
- expiry_date = Time.utc(year, month, day)
42
- expiry_date = Time.utc(year, month, day-1) if expiry_date.wday == 6
43
-
44
- new :symbol => symbol,
45
- :exchange => "SMART",
46
- :expiry => expiry_date.to_ib[2..7], # YYMMDD
47
- :right => right,
48
- :strike => strike
49
- end
50
-
51
- def default_attributes
52
- super.merge :sec_type => :option
53
- #self[:description] ||= osi ? osi : "#{symbol} #{strike} #{right} #{expiry}"
54
- end
55
-
56
- def to_human
57
- "<Option: " + [symbol, expiry, right, strike, exchange, currency].join(" ") + ">"
58
- end
59
-
60
- end # class Option
61
- end # module Models
62
- end # module IB