ib-symbols 1.0 → 1.1
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 +4 -4
- data/README.md +11 -4
- data/ib-symbols.gemspec +1 -1
- data/lib/ib/symbols/abstract.rb +91 -92
- data/lib/ib/symbols/futures.rb +12 -0
- data/lib/ib/symbols/version.rb +1 -1
- metadata +3 -28
- data/examples/contract_details +0 -71
- data/examples/contract_sample_details +0 -50
- data/examples/contract_samples.rb +0 -716
- data/examples/depth_of_market +0 -45
- data/examples/head_time_stamp +0 -35
- data/examples/historic_data +0 -102
- data/examples/market_data +0 -57
- data/examples/option_data +0 -63
- data/examples/real_time_data +0 -35
- data/examples/snapshot_market_data +0 -105
- data/examples/time_and_sales +0 -51
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 93d49cee4065b18e73400f1b50aa3e00916b6a45b7ab3f771527133c6f29f0cc
         | 
| 4 | 
            +
              data.tar.gz: 6eba3b4925ccdf65ab725099038a84163375ead601854a7cb42281f68fa7d555
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 72ea734bd5c525f6740b5062d300f584f7565c2ec817117a914fca465d0f4e094226d4da226016e8c2985918933e45f7218c650a02a3220246048bda8bc27aa7
         | 
| 7 | 
            +
              data.tar.gz: 0e191f18cf53cd6cb88fc728dabf97c3d395218ffecea485d104940b03f4e055e9fe0c250f42344d096d5ca44b073ad4cdd52ee6213588efc5280db416a4b606
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,11 +1,18 @@ | |
| 1 | 
            -
            #  | 
| 1 | 
            +
            # IB-Symbols
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 3 | 
            +
            ---
         | 
| 4 | 
            +
            __Documentation: [https://ib-ruby.github.io/ib-doc/](https://ib-ruby.github.io/ib-doc/)__  
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            __Questions, Contributions, Remarks: [Discussions are opened in ib-api](https://github.com/ib-ruby/ib-api/discussions)__
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            ---
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            __Predefined symbols and watchlists for contracts__
         | 
| 4 11 |  | 
| 5 | 
            -
             | 
| 12 | 
            +
            To activate use
         | 
| 6 13 |  | 
| 7 14 | 
             
            ```
         | 
| 8 | 
            -
            gem 'ib-symbols' | 
| 15 | 
            +
            gem 'ib-symbols'
         | 
| 9 16 | 
             
            ```
         | 
| 10 17 | 
             
            in the Gemfile and 
         | 
| 11 18 | 
             
            ```
         | 
    
        data/ib-symbols.gemspec
    CHANGED
    
    | @@ -27,7 +27,7 @@ Gem::Specification.new do |spec| | |
| 27 27 | 
             
              spec.require_paths = ["lib"]
         | 
| 28 28 |  | 
| 29 29 | 
             
              spec.add_dependency "ib-api"
         | 
| 30 | 
            -
              spec.add_dependency "ox"
         | 
| 30 | 
            +
            #  spec.add_dependency "ox"
         | 
| 31 31 | 
             
              spec.add_development_dependency "bundler", "~> 2.0"
         | 
| 32 32 | 
             
              spec.add_development_dependency "rspec", "~> 3.0"
         | 
| 33 33 | 
             
              spec.add_development_dependency 'rspec-collection_matchers'
         | 
    
        data/lib/ib/symbols/abstract.rb
    CHANGED
    
    | @@ -1,23 +1,22 @@ | |
| 1 1 | 
             
            module IB
         | 
| 2 2 |  | 
| 3 3 | 
             
            	# reopen the contract-class and add yml_file
         | 
| 4 | 
            -
             | 
| 4 | 
            +
               class Contract
         | 
| 5 5 |  | 
| 6 6 | 
             
            	# Reading Contract-Defaults
         | 
| 7 | 
            -
             | 
| 7 | 
            +
            	#
         | 
| 8 8 | 
             
            	# by default, the yml-file in the base-directory (ib-ruby) is used.
         | 
| 9 9 | 
             
            	# This method can be overloaded to include a file from a different location
         | 
| 10 | 
            -
             | 
| 10 | 
            +
            	#
         | 
| 11 11 | 
             
            	#  IB::Symbols::Stocks.wfc.yml_file
         | 
| 12 12 | 
             
            	#   => "/home/ubuntu/workspace/ib-ruby/contract_config.yml" 
         | 
| 13 13 | 
             
            	# 
         | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 14 | 
            +
            	def yml_file
         | 
| 15 | 
            +
                       File.expand_path('../../../../contract_config.yml',__FILE__ )
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
               end
         | 
| 19 18 |  | 
| 20 | 
            -
             | 
| 19 | 
            +
              module Symbols
         | 
| 21 20 |  | 
| 22 21 | 
             
            =begin
         | 
| 23 22 | 
             
            Creates a Class and associates it with a filename
         | 
| @@ -26,45 +25,45 @@ raises an IB::Error in case of a conflict with existing class-names | |
| 26 25 | 
             
            =end
         | 
| 27 26 |  | 
| 28 27 | 
             
            # set the Pathname to "ib-api/symbols" by default
         | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 28 | 
            +
            	@@dir= Pathname.new File.expand_path("../../../../symbols/", __FILE__ ) 
         | 
| 29 | 
            +
            	def self.set_origin directory
         | 
| 30 | 
            +
            		p = Pathname.new directory
         | 
| 31 | 
            +
            		@@dir = p if p.directory? 
         | 
| 32 | 
            +
            	rescue Errno::ENOENT
         | 
| 33 | 
            +
            		error "Setting up origin for symbol-files --> Directory (#{directory}) does not exist" 
         | 
| 34 | 
            +
            	end
         | 
| 36 35 |  | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
            				end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
            				def self.each &b
         | 
| 46 | 
            -
            					contracts.values.each &b
         | 
| 47 | 
            -
            				end
         | 
| 48 | 
            -
            			end   # module new
         | 
| 49 | 
            -
            			name =  name.to_s.camelize.to_sym
         | 
| 50 | 
            -
            			the_collection = if	Symbols.send  :const_defined?, name  
         | 
| 51 | 
            -
            												 Symbols.send :const_get, name
         | 
| 52 | 
            -
            											 else
         | 
| 53 | 
            -
            												 Symbols.const_set  name, symbol_table   	
         | 
| 54 | 
            -
            											 end
         | 
| 55 | 
            -
            			if the_collection.is_a? Symbols
         | 
| 56 | 
            -
            				the_collection.send :read_collection if the_collection.all.empty?
         | 
| 57 | 
            -
            				the_collection # return_value
         | 
| 58 | 
            -
            			else
         | 
| 59 | 
            -
            				error "#{the_collection} is already a Class" 
         | 
| 60 | 
            -
            				nil
         | 
| 36 | 
            +
            	def self.allocate_collection name  # name might be a string or a symbol
         | 
| 37 | 
            +
            		symbol_table = Module.new do
         | 
| 38 | 
            +
            			extend Symbols
         | 
| 39 | 
            +
            			extend Enumerable
         | 
| 40 | 
            +
            			def self.yml_file
         | 
| 41 | 
            +
            				@@dir + name.to_s.downcase.split("::").last.concat( ".yml" )
         | 
| 61 42 | 
             
            			end
         | 
| 62 | 
            -
            		end
         | 
| 63 43 |  | 
| 64 | 
            -
             | 
| 65 | 
            -
            				 | 
| 66 | 
            -
             | 
| 44 | 
            +
            			def self.each &b
         | 
| 45 | 
            +
            				contracts.values.each &b
         | 
| 46 | 
            +
            			end
         | 
| 47 | 
            +
            		end   # module new
         | 
| 48 | 
            +
            		name =  name.to_s.camelize.to_sym
         | 
| 49 | 
            +
            		the_collection = if Symbols.send  :const_defined?, name  
         | 
| 50 | 
            +
            				 Symbols.send :const_get, name
         | 
| 51 | 
            +
            				 else
         | 
| 52 | 
            +
            				 Symbols.const_set  name, symbol_table   	
         | 
| 53 | 
            +
            				 end
         | 
| 54 | 
            +
            		if the_collection.is_a? Symbols
         | 
| 55 | 
            +
            			the_collection.send :read_collection if the_collection.all.empty?
         | 
| 56 | 
            +
            			the_collection # return_value
         | 
| 57 | 
            +
            		else
         | 
| 58 | 
            +
            			error "#{the_collection} is already a Class" 
         | 
| 59 | 
            +
            			nil
         | 
| 67 60 | 
             
            		end
         | 
| 61 | 
            +
            	end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            	def purge_collection
         | 
| 64 | 
            +
            		yml_file.delete
         | 
| 65 | 
            +
            		@contracts =  nil
         | 
| 66 | 
            +
            	end
         | 
| 68 67 |  | 
| 69 68 | 
             
            =begin
         | 
| 70 69 | 
             
            cuts the Collection in `bunch_count` pieces. Each bunch is delivered to the block.
         | 
| @@ -73,65 +72,65 @@ Sleeps for `sleeping time` between processing bunches | |
| 73 72 |  | 
| 74 73 | 
             
            Returns count of created bunches
         | 
| 75 74 | 
             
            =end
         | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 75 | 
            +
            	def bunch( bunch_count = 50 , sleeping_time = 1)
         | 
| 76 | 
            +
            		en = self.each
         | 
| 77 | 
            +
            		the_size =  en.size
         | 
| 78 | 
            +
            		i =  0 
         | 
| 79 | 
            +
            		loop do
         | 
| 80 | 
            +
            			the_start = i * bunch_count
         | 
| 81 | 
            +
            			the_end =  the_start + bunch_count
         | 
| 82 | 
            +
            			the_end = the_size -1 if the_end >= the_size
         | 
| 83 | 
            +
            			it  = the_start .. the_end
         | 
| 84 | 
            +
            			yield it.map{|x| en.next rescue nil}.compact
         | 
| 85 | 
            +
            			break if  the_end == the_size -1 
         | 
| 86 | 
            +
            			i+=1
         | 
| 87 | 
            +
            			sleep sleeping_time
         | 
| 88 | 
            +
            		end 
         | 
| 89 | 
            +
            		 i -1  # return counts of bunches
         | 
| 90 | 
            +
            	end
         | 
| 92 91 |  | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 92 | 
            +
            	def read_collection
         | 
| 93 | 
            +
            		if  yml_file.exist?
         | 
| 94 | 
            +
            			contracts.merge! YAML.load_file yml_file rescue contracts
         | 
| 95 | 
            +
            		else
         | 
| 97 96 | 
             
            			 yml_file.open( "w"){}
         | 
| 98 | 
            -
            			end
         | 
| 99 97 | 
             
            		end
         | 
| 98 | 
            +
            	end
         | 
| 100 99 |  | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
             | 
| 100 | 
            +
            	def store_collection
         | 
| 101 | 
            +
            		 yml_file.open( 'w' ){|f| f.write @contracts.to_yaml}
         | 
| 102 | 
            +
            	end
         | 
| 104 103 |  | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 108 | 
            -
             | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
            			end
         | 
| 113 | 
            -
            			# ensure that evey Sybmol::xxx.yyy entry has a description
         | 
| 114 | 
            -
            			contract.description =  contract.to_human[1..-2] if contract.description.nil?
         | 
| 115 | 
            -
            			# overwrite contract if existing
         | 
| 116 | 
            -
            			contracts[ symbol ] = contract.essential
         | 
| 117 | 
            -
            			store_collection
         | 
| 104 | 
            +
            	def add_contract symbol, contract
         | 
| 105 | 
            +
            		if symbol.is_a? String
         | 
| 106 | 
            +
            			symbol.to_sym
         | 
| 107 | 
            +
            		elsif symbol.is_a? Symbol
         | 
| 108 | 
            +
            			symbol
         | 
| 109 | 
            +
            		else
         | 
| 110 | 
            +
            			symbol.to_i
         | 
| 118 111 | 
             
            		end
         | 
| 112 | 
            +
            	# ensure that evey Sybmol::xxx.yyy entry has a description
         | 
| 113 | 
            +
            		contract.description =  contract.to_human[1..-2] if contract.description.nil?
         | 
| 114 | 
            +
            		# overwrite contract if existing
         | 
| 115 | 
            +
            		contracts[ symbol ] = contract.essential
         | 
| 116 | 
            +
            		store_collection
         | 
| 117 | 
            +
            	end
         | 
| 119 118 |  | 
| 120 | 
            -
             | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 119 | 
            +
            	def remove_contract symbol
         | 
| 120 | 
            +
            		@contracts.delete  symbol 
         | 
| 121 | 
            +
            		store_collection
         | 
| 122 | 
            +
            	end
         | 
| 124 123 |  | 
| 125 124 |  | 
| 126 | 
            -
             | 
| 127 | 
            -
             | 
| 128 | 
            -
             | 
| 125 | 
            +
            	def to_human
         | 
| 126 | 
            +
            		self.to_s.split("::").last
         | 
| 127 | 
            +
            	end
         | 
| 129 128 |  | 
| 130 129 |  | 
| 131 130 |  | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 131 | 
            +
            	module Unspecified
         | 
| 132 | 
            +
            		extend Symbols
         | 
| 133 | 
            +
            	end
         | 
| 135 134 |  | 
| 136 | 
            -
             | 
| 135 | 
            +
              end # module Symbols
         | 
| 137 136 | 
             
            end #  module IB
         | 
    
        data/lib/ib/symbols/futures.rb
    CHANGED
    
    | @@ -73,6 +73,18 @@ module IB | |
| 73 73 | 
             
                                              :currency => "USD",
         | 
| 74 74 | 
             
                                              :multiplier => 50,
         | 
| 75 75 | 
             
                                              :description => "E-Mini S&P 500 future"),
         | 
| 76 | 
            +
                     :micro_es => IB::Future.new(:symbol => "MES",
         | 
| 77 | 
            +
                                              :expiry => next_expiry,
         | 
| 78 | 
            +
                                              :exchange => "GLOBEX",
         | 
| 79 | 
            +
                                              :currency => "USD",
         | 
| 80 | 
            +
                                              :multiplier => 5,
         | 
| 81 | 
            +
                                              :description => "Micro E-Mini S&P 500 future"),
         | 
| 82 | 
            +
                     :micro_russell => IB::Future.new(:symbol => "M2K",
         | 
| 83 | 
            +
                                              :expiry => next_expiry,
         | 
| 84 | 
            +
                                              :exchange => "GLOBEX",
         | 
| 85 | 
            +
                                              :currency => "USD",
         | 
| 86 | 
            +
                                              :multiplier => 5,
         | 
| 87 | 
            +
                                              :description => "Micro E-Mini Russell 2000 future"),
         | 
| 76 88 | 
             
            			:zn => IB::Future.new( symbol: 'ZN',
         | 
| 77 89 | 
             
            														expiry: next_expiry,
         | 
| 78 90 | 
             
            													  currency: 'USD',
         | 
    
        data/lib/ib/symbols/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: ib-symbols
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: '1. | 
| 4 | 
            +
              version: '1.1'
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Hartmut Bischoff
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2021-05-08 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: ib-api
         | 
| @@ -24,20 +24,6 @@ dependencies: | |
| 24 24 | 
             
                - - ">="
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: '0'
         | 
| 27 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            -
              name: ox
         | 
| 29 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            -
                requirements:
         | 
| 31 | 
            -
                - - ">="
         | 
| 32 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: '0'
         | 
| 34 | 
            -
              type: :runtime
         | 
| 35 | 
            -
              prerelease: false
         | 
| 36 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            -
                requirements:
         | 
| 38 | 
            -
                - - ">="
         | 
| 39 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: '0'
         | 
| 41 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 28 | 
             
              name: bundler
         | 
| 43 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -142,17 +128,6 @@ files: | |
| 142 128 | 
             
            - bin/console.yml
         | 
| 143 129 | 
             
            - bin/setup
         | 
| 144 130 | 
             
            - build.md
         | 
| 145 | 
            -
            - examples/contract_details
         | 
| 146 | 
            -
            - examples/contract_sample_details
         | 
| 147 | 
            -
            - examples/contract_samples.rb
         | 
| 148 | 
            -
            - examples/depth_of_market
         | 
| 149 | 
            -
            - examples/head_time_stamp
         | 
| 150 | 
            -
            - examples/historic_data
         | 
| 151 | 
            -
            - examples/market_data
         | 
| 152 | 
            -
            - examples/option_data
         | 
| 153 | 
            -
            - examples/real_time_data
         | 
| 154 | 
            -
            - examples/snapshot_market_data
         | 
| 155 | 
            -
            - examples/time_and_sales
         | 
| 156 131 | 
             
            - ib-symbols.gemspec
         | 
| 157 132 | 
             
            - lib/ib/symbols.rb
         | 
| 158 133 | 
             
            - lib/ib/symbols/abstract.rb
         | 
| @@ -189,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 189 164 | 
             
                - !ruby/object:Gem::Version
         | 
| 190 165 | 
             
                  version: '0'
         | 
| 191 166 | 
             
            requirements: []
         | 
| 192 | 
            -
            rubygems_version: 3. | 
| 167 | 
            +
            rubygems_version: 3.2.3
         | 
| 193 168 | 
             
            signing_key: 
         | 
| 194 169 | 
             
            specification_version: 4
         | 
| 195 170 | 
             
            summary: Predefined symbols and watchlist, part of ib-ruby
         | 
    
        data/examples/contract_details
    DELETED
    
    | @@ -1,71 +0,0 @@ | |
| 1 | 
            -
            #!/usr/bin/env ruby
         | 
| 2 | 
            -
            #
         | 
| 3 | 
            -
            # This script gets details for specific contract from IB
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            require 'bundler/setup'
         | 
| 6 | 
            -
            # load predefined symbols
         | 
| 7 | 
            -
            require 'ib/symbols'
         | 
| 8 | 
            -
             | 
| 9 | 
            -
            include IB
         | 
| 10 | 
            -
            # Definition of what we want market data for.  We have to keep track of what ticker id
         | 
| 11 | 
            -
            # corresponds to what symbol ourselves, because the ticks don't include any other
         | 
| 12 | 
            -
            # identifying information. The choice of ticker ids is, as far as I can tell, arbitrary.
         | 
| 13 | 
            -
            #
         | 
| 14 | 
            -
            # I. Selected Contracts
         | 
| 15 | 
            -
            contracts = [ IB::Symbols::Stocks.wfc,
         | 
| 16 | 
            -
                          IB::Symbols::Stocks.vxx,
         | 
| 17 | 
            -
                          IB::Symbols::Futures.vix,
         | 
| 18 | 
            -
                          IB::Symbols::Futures.ym,
         | 
| 19 | 
            -
                          IB::Symbols::Options.ge,
         | 
| 20 | 
            -
            	   ### OSI-Notation is broken
         | 
| 21 | 
            -
            #            IB::Symbols::Options[:vix20],
         | 
| 22 | 
            -
            #            IB::Symbols::Options[:spy270],
         | 
| 23 | 
            -
            #            IB::Symbols::Options[:vxx40],
         | 
| 24 | 
            -
            	       IB::Symbols::Forex.eurusd,
         | 
| 25 | 
            -
            	   ### Bonds are not actually not supported 
         | 
| 26 | 
            -
                       # 8 => IB::Symbols::Bonds[:wag],
         | 
| 27 | 
            -
            	       IB::Symbols::Stocks.wrong ]
         | 
| 28 | 
            -
            # or
         | 
| 29 | 
            -
            # II. Use predefined Contracts
         | 
| 30 | 
            -
            stock_contracts =  Symbols::Stocks.all.map{|x|  Symbols::Stocks.send x }
         | 
| 31 | 
            -
            future_contracts =  Symbols::Futures.all.map{|x|  Symbols::Futures.send x }
         | 
| 32 | 
            -
            option_contracts =  Symbols::Options.all.map{|x|  Symbols::Options.send x }
         | 
| 33 | 
            -
            cfd_contracts =  Symbols::CFD.all.map{|x|  Symbols::CFD.send x }
         | 
| 34 | 
            -
            index_contracts =  Symbols::Index.all.map{|x|  Symbols::Index.send x }
         | 
| 35 | 
            -
             | 
| 36 | 
            -
            ## comment if you want to display selected contracts ( I. )
         | 
| 37 | 
            -
            contracts =  stock_contracts + future_contracts + option_contracts +  cfd_contracts + index_contracts
         | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
            # Connect to IB TWS.
         | 
| 41 | 
            -
            ib = Connection.new :client_id => 11912  do | gw|  # , port: 7497 do | gw | # TWS
         | 
| 42 | 
            -
              # Subscribe to TWS alerts/errors and contract data end marker
         | 
| 43 | 
            -
              gw.subscribe(:Alert, :ContractDataEnd) { |msg| puts msg.to_human }
         | 
| 44 | 
            -
             | 
| 45 | 
            -
              # Now, subscribe to ContractData incoming events.  The code passed in the block
         | 
| 46 | 
            -
              # will be executed when a message of that type is received, with the received
         | 
| 47 | 
            -
              # message as its argument. In this case, we just print out the data.
         | 
| 48 | 
            -
              gw.subscribe(:ContractData, :BondContractData) do |msg| 
         | 
| 49 | 
            -
                puts msg.contract.to_human + "\n"
         | 
| 50 | 
            -
                puts "Attributes: "
         | 
| 51 | 
            -
                puts "\t"+ msg.contract.attributes.map{ |k,v|  "#{k} : #{v}" unless v.blank? || (v.is_a?(Numeric) && v.zero?)  }.join("\n\t")
         | 
| 52 | 
            -
              end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
            # Set log level
         | 
| 55 | 
            -
              gw.logger.level = Logger::FATAL
         | 
| 56 | 
            -
            end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
            ib.wait_for :NextValidOrderId
         | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
            contracts.each do |contract|
         | 
| 62 | 
            -
              puts "\nRequesting contract data for #{contract.description}"
         | 
| 63 | 
            -
             | 
| 64 | 
            -
              # Request Contract details for the symbols we're interested in. TWS will
         | 
| 65 | 
            -
              # respond with ContractData messages, which will be processed by the code above.
         | 
| 66 | 
            -
              ib.send_message :RequestContractData,  :contract => contract
         | 
| 67 | 
            -
             | 
| 68 | 
            -
              # Wait for IB to respond to our request
         | 
| 69 | 
            -
              ib.wait_for :ContractDataEnd, 5 #sec
         | 
| 70 | 
            -
              ib.clear_received :ContractDataEnd
         | 
| 71 | 
            -
            end
         | 
| @@ -1,50 +0,0 @@ | |
| 1 | 
            -
            #!/usr/bin/env ruby
         | 
| 2 | 
            -
            #
         | 
| 3 | 
            -
            # This script gets details for specific contract from IB
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            require 'bundler/setup'
         | 
| 6 | 
            -
            require 'ib/symbols'
         | 
| 7 | 
            -
            require './contract_samples'
         | 
| 8 | 
            -
            include IB
         | 
| 9 | 
            -
            # Definition of what we want market data for.  We have to keep track of what ticker id
         | 
| 10 | 
            -
            # corresponds to what symbol ourselves, because the ticks don't include any other
         | 
| 11 | 
            -
            # identifying information. The choice of ticker ids is, as far as I can tell, arbitrary.
         | 
| 12 | 
            -
            contract_definitions =  ContractSamples.public_instance_methods
         | 
| 13 | 
            -
             | 
| 14 | 
            -
            # get contracts from contract_samples db
         | 
| 15 | 
            -
            include ContractSamples
         | 
| 16 | 
            -
            the_contracts =  contract_definitions.map{ | method | self.send( method )}
         | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
            # Connect to IB TWS.
         | 
| 20 | 
            -
            ib = Connection.new( :client_id => 11912, :port => 4002 ) do | gw| # 7496 # TWS
         | 
| 21 | 
            -
              # subscribe to TWS alerts/errors and contract data end marker
         | 
| 22 | 
            -
              gw.subscribe(:Alert, :ContractDataEnd) { |msg| puts msg.to_human }
         | 
| 23 | 
            -
             | 
| 24 | 
            -
              # subscribe to ContractData incoming events.  The code passed in the block
         | 
| 25 | 
            -
              # will be executed when a message of that type is received, with the received
         | 
| 26 | 
            -
              # message as its argument. In this case, we just print out the data.
         | 
| 27 | 
            -
              gw.subscribe(:ContractData, :BondContractData) do |msg| 
         | 
| 28 | 
            -
                puts "------------------> Recieved Contract Confirmation <----------------------------"
         | 
| 29 | 
            -
                puts msg.contract.to_human + "\n"
         | 
| 30 | 
            -
                puts "Attributes: "
         | 
| 31 | 
            -
                puts "\t"+ msg.contract.attributes.map{ |k,v|  "#{k} : #{v}" unless v.blank?  }.join("\n\t")
         | 
| 32 | 
            -
              end
         | 
| 33 | 
            -
            # Set log level
         | 
| 34 | 
            -
            	gw.logger.level = Logger::DEBUG #FATAL
         | 
| 35 | 
            -
            end
         | 
| 36 | 
            -
             | 
| 37 | 
            -
            ib.wait_for :NextValidOrderId
         | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
            the_contracts.each do | contract|
         | 
| 41 | 
            -
              puts "\nRequesting contract data: #{contract_definitions}: #{contract.to_human}"
         | 
| 42 | 
            -
             | 
| 43 | 
            -
              # Request Contract details for the symbols we're interested in. TWS will
         | 
| 44 | 
            -
              # respond with ContractData messages, which will be processed by the code above.
         | 
| 45 | 
            -
              ib.send_message :RequestContractData, contract: contract
         | 
| 46 | 
            -
             | 
| 47 | 
            -
              # Wait for IB to respond to our request
         | 
| 48 | 
            -
              ib.wait_for :ContractDataEnd, 1 #sec
         | 
| 49 | 
            -
              ib.clear_received :ContractDataEnd
         | 
| 50 | 
            -
            end
         |