ib-symbols 1.0 → 1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/examples/depth_of_market
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# This script connects to IB API and subscribes to L2 (depth of market) data for
|
4
|
-
# specific symbols
|
5
|
-
|
6
|
-
require 'bundler/setup'
|
7
|
-
require 'ib/symbols'
|
8
|
-
|
9
|
-
# Definition of what we want L2 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
|
-
market = {123 => IB::Symbols::Stocks[:wfc],
|
13
|
-
456 => IB::Symbols::Futures[:es],
|
14
|
-
789 => IB::Symbols::Forex[:gbpusd]
|
15
|
-
}
|
16
|
-
|
17
|
-
# First, connect to IB TWS.
|
18
|
-
ib = IB::Connection.new client_id: 1112, port: 4002 do | gw | #, :port => 7496 # TWS
|
19
|
-
|
20
|
-
# Subscribe to TWS alerts/errors
|
21
|
-
gw.subscribe(:Alert) { |msg| puts msg.to_human }
|
22
|
-
|
23
|
-
# Subscribe to MarketDepth events.
|
24
|
-
gw.subscribe(:MarketDepth) do |msg|
|
25
|
-
puts market[msg.request_id].description + ": " + msg.to_human
|
26
|
-
end
|
27
|
-
|
28
|
-
# Set log level
|
29
|
-
gw.logger.level = Logger::FATAL # DEBUG #FATAL
|
30
|
-
|
31
|
-
end
|
32
|
-
# Now we actually request L2 market data for the symbols we're interested in.
|
33
|
-
market.each_pair do |id, contract|
|
34
|
-
ib.send_message :RequestMarketDepth,
|
35
|
-
:id => id,
|
36
|
-
:contract => contract,
|
37
|
-
:num_rows => 5
|
38
|
-
end
|
39
|
-
|
40
|
-
puts "\nSubscribed to market data"
|
41
|
-
puts "\n******** Press <Enter> to cancel... *********\n\n"
|
42
|
-
STDIN.gets
|
43
|
-
puts "Cancelling market data subscription.."
|
44
|
-
|
45
|
-
market.each_pair { |id, contract| ib.send_message :CancelMarketDepth, :id => id }
|
data/examples/head_time_stamp
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# The Head Time Stamp -Request returns the first available date for historical data requests
|
4
|
-
|
5
|
-
require 'bundler/setup'
|
6
|
-
require 'ib/symbols'
|
7
|
-
|
8
|
-
# First, connect to IB TWS and subscribe for events.
|
9
|
-
ib = IB::Connection.new :client_id => 1112 do | gw | #, :port => 7497 # TWS
|
10
|
-
|
11
|
-
# Subscribe to TWS alerts/errors
|
12
|
-
gw.subscribe(:Alert, :HeadTimeStamp) { |msg| puts msg.to_human }
|
13
|
-
# Set log level
|
14
|
-
gw.logger.level = Logger::FATAL # DEBUG -- INFO -- WARN -- ERROR -- FATAL
|
15
|
-
|
16
|
-
end
|
17
|
-
#
|
18
|
-
# We demonstrate it with Apple
|
19
|
-
#
|
20
|
-
|
21
|
-
ib.send_message :RequestHeadTimeStamp, contract: IB::Symbols::Stocks.aapl
|
22
|
-
ib.wait_for :HeadTimeStamp
|
23
|
-
|
24
|
-
|
25
|
-
puts " First datatset for #{IB::Symbols::Stocks.aapl.description} : #{ib.received[:HeadTimeStamp].date.join( " " )} "
|
26
|
-
Thread.new do
|
27
|
-
sleep 1
|
28
|
-
puts "\n******** Press <Enter> to quit *********\n\n"
|
29
|
-
end
|
30
|
-
STDIN.gets
|
31
|
-
puts "\n *** canceling Reqest ..."
|
32
|
-
ib.send_message :CancelHeadTimeStamp
|
33
|
-
# ..
|
34
|
-
puts "Printing all gathered data \n\n"
|
35
|
-
pp ib.received[ :HeadTimeStamp ]
|
data/examples/historic_data
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# This script downloads historic data for specific symbols from IB
|
4
|
-
|
5
|
-
require 'bundler/setup'
|
6
|
-
require 'ib/symbols'
|
7
|
-
|
8
|
-
# Definition of what we want data for. We have to keep track of what ticker id
|
9
|
-
# corresponds to what symbol ourselves, because the ticks don't include any other
|
10
|
-
# identifying information. The choice of ticker ids is, as far as I can tell, arbitrary.
|
11
|
-
# Predefined Symbol-definitions --> lib/ib/symbols
|
12
|
-
contracts = {123 => IB::Symbols::Futures.mini_dax,
|
13
|
-
456 => IB::Stock.new( symbol: 'BAS', currency: 'EUR') , # BASF
|
14
|
-
789 => IB::Symbols::Forex.eurusd
|
15
|
-
}
|
16
|
-
|
17
|
-
# Connect to IB TWS.
|
18
|
-
#ib = IB::Connection.new( :client_id => 1102, port: 7496, host: '10.222.148.177' ) do | gw |
|
19
|
-
ib = IB::Connection.new :client_id => 1112, :port => 7496 do | gw | #, :port => 7497 # TWS
|
20
|
-
|
21
|
-
# Subscribe to TWS alerts/errors
|
22
|
-
gw.subscribe(:Alert, :ManagedAccounts) { |msg| puts msg.to_human }
|
23
|
-
|
24
|
-
# Subscribe to HistoricalData 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
|
-
#
|
28
|
-
# Note that we have to look the ticker id of each incoming message
|
29
|
-
# up in local memory to figure out what it's for.
|
30
|
-
gw.subscribe(IB::Messages::Incoming::HistoricalData) do |msg|
|
31
|
-
puts contracts[msg.request_id].description + ": #{msg.count} items:"
|
32
|
-
msg.results.each { |entry| puts " #{entry}" }
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
# Now we actually request historical data for the symbols we're interested in. TWS will
|
37
|
-
# respond with a HistoricalData message, which will be processed by the code above.
|
38
|
-
contracts.each_pair do |request_id, contract|
|
39
|
-
ib.send_message IB::Messages::Outgoing::RequestHistoricalData.new(
|
40
|
-
:request_id => request_id,
|
41
|
-
:contract => contract,
|
42
|
-
:end_date_time => Time.now.to_ib,
|
43
|
-
:duration => '1 D', # ?
|
44
|
-
:bar_size => :hour1, # IB::BAR_SIZES.key(:hour)?
|
45
|
-
:what_to_show => :trades,
|
46
|
-
:use_rth => 0,
|
47
|
-
:keep_up_todate => 0)
|
48
|
-
end
|
49
|
-
|
50
|
-
# IB does not send any indication when all historic data is done being delivered.
|
51
|
-
# So we need to interrupt manually when our request is answered.
|
52
|
-
puts "\n******** Press <Enter> to exit... *********\n\n"
|
53
|
-
STDIN.gets
|
54
|
-
|
55
|
-
__END__
|
56
|
-
## EXTRACTED FROM THE PYTHON IMPLEMENTATION (Jan 2018)
|
57
|
-
contract:Contract - This object contains a description of the contract for which
|
58
|
-
market data is being requested.
|
59
|
-
endDateTime:str - Defines a query end date and time at any point during the past 6 mos.
|
60
|
-
Valid values include any date/time within the past six months in the format:
|
61
|
-
yyyymmdd HH:mm:ss ttt
|
62
|
-
where "ttt" is the optional time zone.
|
63
|
-
durationStr:str - Set the query duration up to one week, using a time unit
|
64
|
-
of seconds, days or weeks. Valid values include any integer followed by a space
|
65
|
-
and then S (seconds), D (days) or W (week). If no unit is specified, seconds is used.
|
66
|
-
barSizeSetting:str - Specifies the size of the bars that will be returned (within IB/TWS listimits).
|
67
|
-
Valid values include:
|
68
|
-
1 sec
|
69
|
-
5 secs
|
70
|
-
15 secs
|
71
|
-
30 secs
|
72
|
-
1 min
|
73
|
-
2 mins
|
74
|
-
3 mins
|
75
|
-
5 mins
|
76
|
-
15 mins
|
77
|
-
30 mins
|
78
|
-
1 hour
|
79
|
-
1 day
|
80
|
-
whatToShow:str - Determines the nature of data beinging extracted. Valid values include:
|
81
|
-
TRADES
|
82
|
-
MIDPOINT
|
83
|
-
BID
|
84
|
-
ASK
|
85
|
-
BID_ASK
|
86
|
-
HISTORICAL_VOLATILITY
|
87
|
-
OPTION_IMPLIED_VOLATILITY
|
88
|
-
|
89
|
-
useRTH:int - Determines whether to return all data available during the requested time span,
|
90
|
-
or only data that falls within regular trading hours. Valid values include:
|
91
|
-
|
92
|
-
0 - all data is returned even where the market in question was outside of its
|
93
|
-
regular trading hours.
|
94
|
-
1 - only data within the regular trading hours is returned, even if the
|
95
|
-
requested time span falls partially or completely outside of the RTH.
|
96
|
-
formatDate: int - Determines the date format applied to returned bars. validd values include:
|
97
|
-
1 - dates applying to bars returned in the format: yyyymmdd{space}{space}hh:mm:dd
|
98
|
-
2 - dates are returned as a long integer specifying the number of seconds since
|
99
|
-
1/1/1970 GMT.
|
100
|
-
chartOptions:TagValueList - For internal use only. Use default value XYZ. """
|
101
|
-
|
102
|
-
|
data/examples/market_data
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# This script connects to IB API and subscribes to market data for specific symbols
|
4
|
-
|
5
|
-
require 'bundler/setup'
|
6
|
-
require 'ib-api'
|
7
|
-
require 'ib/symbols'
|
8
|
-
|
9
|
-
COUNT_OF_EVENTS = 20
|
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
|
-
# (note: the forex symbols used here MUST be defined in lib/ib/symbols/forex.rb)
|
14
|
-
market = {123 => IB::Symbols::Forex.gbpusd ,
|
15
|
-
456 => IB::Symbols::Forex.eurusd ,
|
16
|
-
789 => IB::Symbols::Forex.usdcad }
|
17
|
-
|
18
|
-
# connect to IB TWS.
|
19
|
-
|
20
|
-
counter = 0
|
21
|
-
|
22
|
-
ib = IB::Connection.new( :client_id => 1112) do | gw | #, :port => 7496 # TWS)
|
23
|
-
## Subcribe to forseable events before the connection is completed
|
24
|
-
## Subscribe to TWS alerts/errors
|
25
|
-
gw.subscribe(:Alert) { |msg| puts msg.to_human }
|
26
|
-
gw.logger.level = Logger::FATAL
|
27
|
-
|
28
|
-
# Subscribe to TickerPrice and TickerSize events. The code passed in the block will
|
29
|
-
# be executed when a message of that type is received, with the received message as its
|
30
|
-
# argument. In this case, we just print out the tick. NB: The description field is not
|
31
|
-
# from IB TWS. It is defined locally in forex.rb, and is just arbitrary text.
|
32
|
-
|
33
|
-
gw.subscribe(:TickRequestParameters, :TickPrice, :TickSize, :TickGeneric) do |msg|
|
34
|
-
puts market[msg.ticker_id].description + ": " + msg.to_human
|
35
|
-
counter = counter + 1
|
36
|
-
if counter == COUNT_OF_EVENTS
|
37
|
-
puts "\nCancelling market data subscription.."
|
38
|
-
market.each_pair { |id, _| ib.send_message :CancelMarketData, :id => id }
|
39
|
-
puts "Generally, the TWS sends additional TickEvents after the subscription is cancelled ... \n\n"
|
40
|
-
Thread.new do
|
41
|
-
sleep 1
|
42
|
-
puts "\n******** Press <Enter> to quit *********\n\n"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
# Now we actually request market data for the symbols we're interested in.
|
48
|
-
ib.send_message :RequestMarketDataType, :market_data_type => :delayed
|
49
|
-
market.each_pair do |id, contract|
|
50
|
-
ib.send_message :RequestMarketData, :id => id, :contract => contract
|
51
|
-
end
|
52
|
-
|
53
|
-
puts "\nSubscribed to market data"
|
54
|
-
puts "\n********* Receiving #{COUNT_OF_EVENTS} TickEvents, then canceling the subscription ***** \n\n"
|
55
|
-
STDIN.gets
|
56
|
-
|
57
|
-
#@market.each_pair { |id, _| ib.send_message :CancelMarketData, :id => id }
|
data/examples/option_data
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# This script subscribes to market data for a list of Options
|
4
|
-
|
5
|
-
require 'bundler/setup'
|
6
|
-
require 'ib/symbols'
|
7
|
-
COUNT_OF_EVENTS = 20
|
8
|
-
# Definition of what we want market data for. We have to keep track of what ticker id
|
9
|
-
# corresponds to what symbol ourselves, because the ticks don't include any other
|
10
|
-
# identifying information. The choice of ticker ids is, as far as I can tell, arbitrary.
|
11
|
-
contracts = [ IB::Symbols::Options.ge, IB::Symbols::Options.spy,
|
12
|
-
IB::Symbols::Options.aapl]
|
13
|
-
list_of_ids =[]
|
14
|
-
|
15
|
-
counter = 0
|
16
|
-
|
17
|
-
#contracts = [ IB::Option.new( symbol: 'ESTX50', exchange:'DTB', multiplier: 10, currency: 'EUR', strike: 3200, expiry: '202012', right: :put) ,IB::Symbols::Options.ge ]
|
18
|
-
# First, connect to IB TWS. Arbitrary :client_id is used to identify your script
|
19
|
-
ib = IB::Connection.new( client_id: 1116, port: 7496) do | gw| #, :port => 7496 # TWS
|
20
|
-
|
21
|
-
## Subscribe to TWS alerts/errors
|
22
|
-
gw.subscribe(:Alert, :ManagedAccounts) { |msg| puts msg.to_human }
|
23
|
-
# set the log level
|
24
|
-
gw.logger.level = Logger::FATAL
|
25
|
-
# Subscribe to Ticker... events. The code passed in the block will be executed when
|
26
|
-
# any message of that type is received, with the received message as its argument.
|
27
|
-
# In this case, we just print out the tick.
|
28
|
-
#
|
29
|
-
# (N.B. The description field is not from IB TWS. It is defined
|
30
|
-
# locally in forex.rb, and is just arbitrary text.)
|
31
|
-
gw.subscribe(:TickPrice, :TickSize, :TickOption, :TickString, :TickRequestParameters) do |msg|
|
32
|
-
counter = counter + 1
|
33
|
-
if counter == COUNT_OF_EVENTS
|
34
|
-
puts "Cancelling market data subscription.."
|
35
|
-
list_of_ids.each { |id| ib.send_message :CancelMarketData, :id => id }
|
36
|
-
puts "Generally, the TWS sends additional TickEvents after the subscription is cancelled ... \n\n"
|
37
|
-
Thread.new do
|
38
|
-
sleep 1
|
39
|
-
puts "\n******** Press <Enter> to quit *********\n\n"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# Now we actually request market data for the symbols we're interested in.
|
46
|
-
#
|
47
|
-
# ### ticklist-values : lib/ib/messages/outgoing/request_marketdata.rb
|
48
|
-
ib.send_message :RequestMarketDataType, :market_data_type => :delayed
|
49
|
-
list_of_ids = contracts.map do |contract|
|
50
|
-
ib.send_message :RequestMarketData, :contract => contract , tick_list: [100,101,106]
|
51
|
-
end
|
52
|
-
# we modify contracts: { ticker_id => Contract } ( Will be used in the subscrption thread )
|
53
|
-
contracts = list_of_ids.zip( contracts ).to_h
|
54
|
-
puts "Contracts: \n\t #{contracts.map{|x,y| "#{x} :: #{y.to_human}"}.join("\n\t")} "
|
55
|
-
puts "\nSubscribed to market data"
|
56
|
-
puts "\n******** Press <Enter> to cancel subscriptions *********\n\n"
|
57
|
-
STDIN.gets
|
58
|
-
puts "Cancelling market data subscription.."
|
59
|
-
|
60
|
-
contracts.each_with_index { | contract, i| ib.send_message :CancelMarketData, :id => i+1 }
|
61
|
-
|
62
|
-
puts "\n******** Press <Enter> to quit.. *********\n\n"
|
63
|
-
STDIN.gets
|
data/examples/real_time_data
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
#
|
3
|
-
# Subscribe to real time data for specific symbol from IB
|
4
|
-
|
5
|
-
require 'bundler/setup'
|
6
|
-
require 'ib/symbols'
|
7
|
-
|
8
|
-
contracts = {1 => IB::Symbols::Stocks[:vxx],
|
9
|
-
9 => IB::Symbols::Forex[:gbpusd]
|
10
|
-
}
|
11
|
-
|
12
|
-
# Connect to IB TWS.
|
13
|
-
ib = IB::Connection.new :client_id => 1112 do | gw | #, :port => 7497 # TWS
|
14
|
-
|
15
|
-
# Subscribe to TWS alerts/errors
|
16
|
-
gw.subscribe(:Alert) { |msg| puts msg.to_human }
|
17
|
-
|
18
|
-
# Subscribe to RealTimeBar incoming events. We have to use message request_id
|
19
|
-
# to figure out what contract it's for.
|
20
|
-
gw.subscribe(IB::Messages::Incoming::RealTimeBar) do |msg|
|
21
|
-
puts contracts[msg.request_id].description + ": #{msg.to_human}"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
contracts.each_pair do |request_id, contract|
|
25
|
-
ib.send_message IB::Messages::Outgoing::RequestRealTimeBars.new(
|
26
|
-
:request_id => request_id,
|
27
|
-
:contract => contract,
|
28
|
-
# :bar_size => 5, # Only 5 secs bars supported (hard coded in messages/outgoing/bar_requests)
|
29
|
-
:data_type => :trades, # possible values: :trades, :bid, :ask , :midpoint
|
30
|
-
:use_rth => false)
|
31
|
-
end
|
32
|
-
|
33
|
-
# So we need to interrupt manually when we do not want any more quotes.
|
34
|
-
puts "\n******** Press <Enter> to exit... *********\n\n"
|
35
|
-
STDIN.gets
|
@@ -1,105 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
##
|
3
|
-
## This script connects to IB API and collects snaphot Data for given Contracts
|
4
|
-
##
|
5
|
-
#
|
6
|
-
class Snapshot
|
7
|
-
def initialize
|
8
|
-
@contracts = Array.new
|
9
|
-
@prices = Hash.new
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
def add_contract *contract
|
14
|
-
contract.each do |c|
|
15
|
-
@contracts << c
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def print_results
|
20
|
-
# @prices.each do |x,y|
|
21
|
-
# STDOUT.print " #{@contracts[x][:display_text] } \t" +
|
22
|
-
# y.collect{|x,y| "#{x}: #{y}"}.join(" \n\t\t\t ") +" \n"
|
23
|
-
# enda
|
24
|
-
@prices.each do |a,b|
|
25
|
-
contract = b.delete :contract
|
26
|
-
if contract.present?
|
27
|
-
puts contract.to_human
|
28
|
-
print b.inspect # [:bid_price], b[:ask_price], b[:high], b[:low], b[:close_price]
|
29
|
-
print"\n"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
|
35
|
-
def process
|
36
|
-
ib = IB::Connection.current
|
37
|
-
|
38
|
-
count = @contracts.size
|
39
|
-
ib.subscribe(:Alert) do |msg|
|
40
|
-
if msg.code == 354 # Requested market data is not subscribed
|
41
|
-
count -=1 # wir zählen den Counter runter, so dass
|
42
|
-
puts "No Marketdata Subscription" # am Ende die Orderantwort ausgelöst wird
|
43
|
-
else
|
44
|
-
puts msg.message # unhandled Alert
|
45
|
-
end
|
46
|
-
end
|
47
|
-
# we collect price-events in @prices-Hash
|
48
|
-
ib.subscribe( :TickPrice){ |msg| @prices[msg.ticker_id][msg.type]=msg.price }
|
49
|
-
# When finished, print the results
|
50
|
-
ib.subscribe( :TickSnapshotEnd){ count -=1; print_results if count.zero? }
|
51
|
-
# fire the request
|
52
|
-
ib.send_message :RequestMarketDataType, :market_data_type => :delayed
|
53
|
-
|
54
|
-
@contracts.each do | contract |
|
55
|
-
request_id = ib.send_message :RequestMarketData, :contract => contract, :snapshot => 1
|
56
|
-
# connect contracts to prices
|
57
|
-
@prices[request_id] = {:contract => contract}
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
end # class
|
62
|
-
|
63
|
-
#### here it starts #######
|
64
|
-
|
65
|
-
require 'bundler/setup'
|
66
|
-
require 'ib/symbols'
|
67
|
-
|
68
|
-
# # Connect to IB TWS
|
69
|
-
IB::Connection.new client_id: 1112, port: 7496 do | gw | # , :port => 7497 do |gw|
|
70
|
-
|
71
|
-
# Set log level
|
72
|
-
gw.logger.level = Logger::FATAL
|
73
|
-
end
|
74
|
-
|
75
|
-
s = Snapshot.new
|
76
|
-
s.add_contract IB::Stock.new symbol: 'FAST', :con_id => 269120, :exchange => 'SMART'
|
77
|
-
s.add_contract IB::Stock.new :symbol => 'IBM'
|
78
|
-
s.add_contract IB::Symbols::Forex.eurusd
|
79
|
-
s.process
|
80
|
-
|
81
|
-
Thread.new do
|
82
|
-
sleep 3
|
83
|
-
puts "\n******** Press <Enter> to quit *********\n\n"
|
84
|
-
end
|
85
|
-
STDIN.gets
|
86
|
-
puts "done."
|
87
|
-
|
88
|
-
|
89
|
-
=begin
|
90
|
-
Expected Output
|
91
|
-
|
92
|
-
Market data farm is connecting:usfarm
|
93
|
-
Market data farm connection is OK:cashfarm
|
94
|
-
Market data farm is connecting:usfarm
|
95
|
-
Market data farm connection is OK:usfarm
|
96
|
-
Requested market data is not subscribed. Displaying delayed market data...
|
97
|
-
Requested market data is not subscribed. Displaying delayed market data...
|
98
|
-
<Stock: FAST USD>
|
99
|
-
{:delayed_bid=>0.578e2, :delayed_ask=>0.5784e2, :delayed_last=>0.5781e2, :delayed_high=>0.584e2, :delayed_low=>0.573e2, :delayed_close=>0.5737e2, :delayed_open=>0.0}
|
100
|
-
<Stock: IBM USD>
|
101
|
-
{:delayed_bid=>0.16083e3, :delayed_ask=>0.16085e3, :delayed_last=>0.16085e3, :delayed_high=>0.16125e3, :delayed_low=>0.15852e3, :delayed_close=>0.15812e3, :delayed_open=>0.0}
|
102
|
-
<Contract: EUR forex IDEALPRO USD>
|
103
|
-
{:high=>0.123835e1, :low=>0.12316e1, :close_price=>0.12368e1, :bid_price=>0.123218e1, :ask_price=>0.123219e1}
|
104
|
-
|
105
|
-
=end
|