ib-extensions 1.0
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 +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +112 -0
- data/Guardfile +24 -0
- data/README.md +99 -0
- data/Rakefile +6 -0
- data/bin/console +96 -0
- data/bin/console.yml +3 -0
- data/bin/gateway.rb +97 -0
- data/bin/setup +8 -0
- data/changelog.md +31 -0
- data/examples/cancel_orders +74 -0
- data/examples/eod +35 -0
- data/examples/input.rb +475 -0
- data/examples/market_price +57 -0
- data/examples/option_chain +67 -0
- data/examples/place_and_modify_order +162 -0
- data/examples/place_bracket_order +62 -0
- data/examples/place_butterfly_order +104 -0
- data/examples/place_combo_order +70 -0
- data/examples/place_limit_order +82 -0
- data/examples/place_the_limit_order +145 -0
- data/examples/volatility_research +139 -0
- data/examples/what_if_order +90 -0
- data/ib-extensions.gemspec +37 -0
- data/lib/ib-gateway.rb +5 -0
- data/lib/ib/alerts/base-alert.rb +128 -0
- data/lib/ib/alerts/gateway-alerts.rb +15 -0
- data/lib/ib/alerts/order-alerts.rb +68 -0
- data/lib/ib/eod.rb +152 -0
- data/lib/ib/extensions.rb +9 -0
- data/lib/ib/extensions/contract.rb +37 -0
- data/lib/ib/extensions/version.rb +5 -0
- data/lib/ib/flex.rb +150 -0
- data/lib/ib/gateway.rb +425 -0
- data/lib/ib/gateway/account-infos.rb +115 -0
- data/lib/ib/gateway/order-handling.rb +150 -0
- data/lib/ib/market-price.rb +134 -0
- data/lib/ib/models/account.rb +329 -0
- data/lib/ib/models/spread.rb +159 -0
- data/lib/ib/option-chain.rb +198 -0
- data/lib/ib/option-greeks.rb +88 -0
- data/lib/ib/order-prototypes.rb +110 -0
- data/lib/ib/order_prototypes/abstract.rb +67 -0
- data/lib/ib/order_prototypes/combo.rb +46 -0
- data/lib/ib/order_prototypes/forex.rb +40 -0
- data/lib/ib/order_prototypes/limit.rb +177 -0
- data/lib/ib/order_prototypes/market.rb +116 -0
- data/lib/ib/order_prototypes/pegged.rb +173 -0
- data/lib/ib/order_prototypes/premarket.rb +31 -0
- data/lib/ib/order_prototypes/stop.rb +202 -0
- data/lib/ib/order_prototypes/volatility.rb +39 -0
- data/lib/ib/spread-prototypes.rb +62 -0
- data/lib/ib/spread_prototypes/butterfly.rb +79 -0
- data/lib/ib/spread_prototypes/calendar.rb +85 -0
- data/lib/ib/spread_prototypes/stock-spread.rb +48 -0
- data/lib/ib/spread_prototypes/straddle.rb +75 -0
- data/lib/ib/spread_prototypes/strangle.rb +96 -0
- data/lib/ib/spread_prototypes/vertical.rb +84 -0
- data/lib/ib/verify.rb +226 -0
- metadata +206 -0
@@ -0,0 +1,173 @@
|
|
1
|
+
module IB
|
2
|
+
module Pegged2Primary
|
3
|
+
extend OrderPrototype
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def defaults
|
7
|
+
super.merge order_type: 'REL' , tif: :day
|
8
|
+
end
|
9
|
+
|
10
|
+
def aliases
|
11
|
+
super.merge limit_price: :price_cap, aux_price: :offset_amount
|
12
|
+
end
|
13
|
+
|
14
|
+
def requirements
|
15
|
+
super.merge aux_price: 'also aliased as :offset_amount',
|
16
|
+
limit_price: 'aliased as :price_cap'
|
17
|
+
end
|
18
|
+
|
19
|
+
def optional
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def summary
|
24
|
+
<<-HERE
|
25
|
+
Relative (a.k.a. Pegged-to-Primary) orders provide a means for traders
|
26
|
+
to seek a more aggressive price than the National Best Bid and Offer
|
27
|
+
(NBBO). By acting as liquidity providers, and placing more aggressive
|
28
|
+
bids and offers than the current best bids and offers, traders increase
|
29
|
+
their odds of filling their order. Quotes are automatically adjusted as
|
30
|
+
the markets move, to remain aggressive. For a buy order, your bid is
|
31
|
+
pegged to the NBB by a more aggressive offset, and if the NBB moves up,
|
32
|
+
your bid will also move up. If the NBB moves down, there will be no
|
33
|
+
adjustment because your bid will become even more aggressive and
|
34
|
+
execute. For sales, your offer is pegged to the NBO by a more
|
35
|
+
aggressive offset, and if the NBO moves down, your offer will also move
|
36
|
+
down. If the NBO moves up, there will be no adjustment because your
|
37
|
+
offer will become more aggressive and execute. In addition to the
|
38
|
+
offset, you can define an absolute cap, which works like a limit price,
|
39
|
+
and will prevent your order from being executed above or below a
|
40
|
+
specified level.
|
41
|
+
Supported Products: Stocks, Options and Futures
|
42
|
+
------
|
43
|
+
not available on paper trading
|
44
|
+
HERE
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
module Pegged2Market
|
49
|
+
extend OrderPrototype
|
50
|
+
class << self
|
51
|
+
|
52
|
+
def defaults
|
53
|
+
super.merge order_type: 'PEG MKT' , tif: :day
|
54
|
+
end
|
55
|
+
|
56
|
+
def aliases
|
57
|
+
Limit.aliases.merge aux_price: :market_offset
|
58
|
+
end
|
59
|
+
|
60
|
+
def requirements
|
61
|
+
super.merge aux_price: :decimal
|
62
|
+
end
|
63
|
+
|
64
|
+
def optional
|
65
|
+
super
|
66
|
+
end
|
67
|
+
|
68
|
+
def summary
|
69
|
+
<<-HERE
|
70
|
+
A pegged-to-market order is designed to maintain a purchase price relative to the
|
71
|
+
national best offer (NBO) or a sale price relative to the national best bid (NBB).
|
72
|
+
Depending on the width of the quote, this order may be passive or aggressive.
|
73
|
+
The trader creates the order by entering a limit price which defines the worst limit
|
74
|
+
price that they are willing to accept.
|
75
|
+
Next, the trader enters an offset amount which computes the active limit price as follows:
|
76
|
+
Sell order price = Bid price + offset amount
|
77
|
+
Buy order price = Ask price - offset amount
|
78
|
+
HERE
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
module Pegged2Stock
|
84
|
+
extend OrderPrototype
|
85
|
+
class << self
|
86
|
+
|
87
|
+
def defaults
|
88
|
+
super.merge order_type: 'PEG STK'
|
89
|
+
end
|
90
|
+
|
91
|
+
def aliases
|
92
|
+
Limit.aliases.merge limit_price: :stock_reference_price
|
93
|
+
end
|
94
|
+
|
95
|
+
def requirements
|
96
|
+
super.merge total_quantity: :decimal,
|
97
|
+
delta: 'required Delta of the Option',
|
98
|
+
starting_price: 'initial Limit-Price for the Option'
|
99
|
+
end
|
100
|
+
|
101
|
+
def optional
|
102
|
+
super.merge limit_price: 'Stock Reference Price',
|
103
|
+
stock_ref_price: '',
|
104
|
+
stock_range_lower: 'Lowest acceptable Stock Price',
|
105
|
+
stock_range_upper: 'Highest accepable Stock Price'
|
106
|
+
end
|
107
|
+
|
108
|
+
def summary
|
109
|
+
<<-HERE
|
110
|
+
Options ONLY
|
111
|
+
------------
|
112
|
+
A Pegged to Stock order continually adjusts the option order price by the product of a signed user-
|
113
|
+
defined delta and the change of the option's underlying stock price.
|
114
|
+
The delta is entered as an absolute and assumed to be positive for calls and negative for puts.
|
115
|
+
A buy or sell call order price is determined by adding the delta times a change in an underlying stock
|
116
|
+
price to a specified starting price for the call.
|
117
|
+
To determine the change in price, the stock reference price is subtracted from the current NBBO
|
118
|
+
midpoint. The Stock Reference Price can be defined by the user, or defaults to the
|
119
|
+
the NBBO midpoint at the time of the order if no reference price is entered.
|
120
|
+
You may also enter a high/low stock price range which cancels the order when reached. The
|
121
|
+
delta times the change in stock price will be rounded to the nearest penny in favor of the order.
|
122
|
+
------------
|
123
|
+
Supported Exchanges: (as of Jan 2018): BOX, NASDAQOM, PHLX
|
124
|
+
HERE
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
module Pegged2Benchmark
|
130
|
+
extend OrderPrototype
|
131
|
+
class << self
|
132
|
+
|
133
|
+
def defaults
|
134
|
+
super.merge order_type: 'PEG BENCH'
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
|
140
|
+
|
141
|
+
def requirements
|
142
|
+
super.merge total_quantity: :decimal,
|
143
|
+
delta: 'required Delta of the Option',
|
144
|
+
starting_price: 'initial Limit-Price for the Option' ,
|
145
|
+
is_pegged_change_amount_decrease: 'increase(true) / decrease(false) Price',
|
146
|
+
pegged_change_amount: ' (increase/decrceas) by... (and likewise for price moving in opposite direction)',
|
147
|
+
reference_change_amount: ' ... whenever there is a price change of...',
|
148
|
+
reference_contract_id: 'the conid of the reference contract',
|
149
|
+
reference_exchange: "Exchange of the reference contract"
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
def optional
|
158
|
+
super.merge stock_ref_price: 'starting price of the reference contract',
|
159
|
+
stock_range_lower: 'Lowest acceptable Price of the reference contract',
|
160
|
+
stock_range_upper: 'Highest accepable Price of the reference contract'
|
161
|
+
end
|
162
|
+
|
163
|
+
def summary
|
164
|
+
<<-HERE
|
165
|
+
The Pegged to Benchmark order is similar to the Pegged to Stock order for options,
|
166
|
+
except that the Pegged to Benchmark allows you to specify any asset type as the
|
167
|
+
reference (benchmark) contract for a stock or option order. Both the primary and
|
168
|
+
reference contracts must use the same currency.
|
169
|
+
HERE
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module IB
|
2
|
+
# module OrderPrototype
|
3
|
+
module AtAuction
|
4
|
+
extend OrderPrototype
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def defaults
|
8
|
+
{ order_type: 'MTL' , tif: "AUC"}
|
9
|
+
end
|
10
|
+
|
11
|
+
def aliases
|
12
|
+
super.merge limit_price: :price
|
13
|
+
end
|
14
|
+
|
15
|
+
def requirements
|
16
|
+
super.merge limit_price: :decimal
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def summary
|
21
|
+
<<-HERE
|
22
|
+
An auction order is entered into the electronic trading system during the pre-market
|
23
|
+
opening period for execution at the Calculated Opening Price (COP).
|
24
|
+
If your order is not filled on the open, the order is re-submitted as a
|
25
|
+
limit order with the limit price set to the COP or the best bid/ask after the market opens.
|
26
|
+
Products: FUT, STK
|
27
|
+
HERE
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
|
2
|
+
module IB
|
3
|
+
module SimpleStop
|
4
|
+
extend OrderPrototype
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def defaults
|
8
|
+
super.merge order_type: :stop
|
9
|
+
end
|
10
|
+
|
11
|
+
def aliases
|
12
|
+
super.merge aux_price: :price
|
13
|
+
end
|
14
|
+
|
15
|
+
def requirements
|
16
|
+
super.merge aux_price: 'Price where the action is triggert. Aliased as :price'
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
def summary
|
21
|
+
<<-HERE
|
22
|
+
A Stop order is an instruction to submit a buy or sell market order if and when the
|
23
|
+
user-specified stop trigger price is attained or penetrated. A Stop order is not guaranteed
|
24
|
+
a specific execution price and may execute significantly away from its stop price.
|
25
|
+
|
26
|
+
A Sell Stop order is always placed below the current market price and is typically used
|
27
|
+
to limit a loss or protect a profit on a long stock position.
|
28
|
+
|
29
|
+
A Buy Stop order is always placed above the current market price. It is typically used
|
30
|
+
to limit a loss or help protect a profit on a short sale.
|
31
|
+
HERE
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
module StopLimit
|
36
|
+
extend OrderPrototype
|
37
|
+
class << self
|
38
|
+
|
39
|
+
def defaults
|
40
|
+
super.merge order_type: :stop_limit
|
41
|
+
end
|
42
|
+
|
43
|
+
def aliases
|
44
|
+
Limit.aliases.merge aux_price: :stop_price
|
45
|
+
end
|
46
|
+
|
47
|
+
def requirements
|
48
|
+
Limit.requirements.merge aux_price: 'Price where the action is triggert. Aliased as :stop_price'
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def summary
|
53
|
+
<<-HERE
|
54
|
+
A Stop-Limit order is an instruction to submit a buy or sell limit order when
|
55
|
+
the user-specified stop trigger price is attained or penetrated. The order has
|
56
|
+
two basic components: the stop price and the limit price. When a trade has occurred
|
57
|
+
at or through the stop price, the order becomes executable and enters the market
|
58
|
+
as a limit order, which is an order to buy or sell at a specified price or better.
|
59
|
+
HERE
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
module StopProtected
|
64
|
+
extend OrderPrototype
|
65
|
+
class << self
|
66
|
+
|
67
|
+
def defaults
|
68
|
+
super.merge order_type: :stop_protected
|
69
|
+
end
|
70
|
+
|
71
|
+
def aliases
|
72
|
+
SimpleStop.aliases
|
73
|
+
end
|
74
|
+
|
75
|
+
def requirements
|
76
|
+
SimpleStop.requirements
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
def summary
|
81
|
+
<<-HERE
|
82
|
+
US-Futures only
|
83
|
+
----------------------------
|
84
|
+
A Stop with Protection order combines the functionality of a stop limit order
|
85
|
+
with a market with protection order. The order is set to trigger at a specified
|
86
|
+
stop price. When the stop price is penetrated, the order is triggered as a
|
87
|
+
market with protection order, which means that it will fill within a specified
|
88
|
+
protected price range equal to the trigger price +/- the exchange-defined protection
|
89
|
+
point range. Any portion of the order that does not fill within this protected
|
90
|
+
range is submitted as a limit order at the exchange-defined trigger price +/-
|
91
|
+
the protection points.
|
92
|
+
HERE
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
# module OrderPrototype
|
97
|
+
module TrailingStop
|
98
|
+
extend OrderPrototype
|
99
|
+
class << self
|
100
|
+
|
101
|
+
|
102
|
+
def defaults
|
103
|
+
super.merge order_type: :trailing_stop , tif: :day
|
104
|
+
end
|
105
|
+
|
106
|
+
def aliases
|
107
|
+
super.merge trail_stop_price: :price,
|
108
|
+
aux_price: :trailing_amount
|
109
|
+
end
|
110
|
+
|
111
|
+
def requirements
|
112
|
+
## usualy the trail_stop_price is the market-price minus(plus) the trailing_amount
|
113
|
+
super.merge trail_stop_price: 'Price to trigger the action, aliased as :price'
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
def alternative_parameters
|
118
|
+
{ aux_price: 'Trailing distance in absolute terms, aliased as :trailing_amount',
|
119
|
+
trailing_percent: 'Trailing distance in relative terms'}
|
120
|
+
end
|
121
|
+
|
122
|
+
def summary
|
123
|
+
<<-HERE
|
124
|
+
A "Sell" trailing stop order sets the stop price at a fixed amount below the market
|
125
|
+
price with an attached "trailing" amount. As the market price rises, the stop price
|
126
|
+
rises by the trail amount, but if the stock price falls, the stop loss price doesn't
|
127
|
+
change, and a market order is submitted when the stop price is hit. This technique
|
128
|
+
is designed to allow an investor to specify a limit on the maximum possible loss,
|
129
|
+
without setting a limit on the maximum possible gain.
|
130
|
+
|
131
|
+
"Buy" trailing stop orders are the mirror image of sell trailing stop orders, and
|
132
|
+
are most appropriate for use in falling markets.
|
133
|
+
|
134
|
+
Note that Trailing Stop orders can have the trailing amount specified as a percent,
|
135
|
+
or as an absolute amount which is specified in the auxPrice field.
|
136
|
+
|
137
|
+
HERE
|
138
|
+
end # summary
|
139
|
+
end # class self
|
140
|
+
end # module
|
141
|
+
|
142
|
+
module TrailingStopLimit
|
143
|
+
extend OrderPrototype
|
144
|
+
class << self
|
145
|
+
|
146
|
+
|
147
|
+
def defaults
|
148
|
+
super.merge order_type: :trailing_limit , tif: :day
|
149
|
+
end
|
150
|
+
|
151
|
+
def aliases
|
152
|
+
Limit.aliases
|
153
|
+
end
|
154
|
+
|
155
|
+
def requirements
|
156
|
+
super.merge trail_stop_price: 'Price to trigger the action',
|
157
|
+
limit_price_offset: 'a pRICE'
|
158
|
+
|
159
|
+
end
|
160
|
+
|
161
|
+
def alternative_parameters
|
162
|
+
{ aux_price: 'Trailing distance in absolute terms',
|
163
|
+
trailing_percent: 'Trailing distance in relative terms'}
|
164
|
+
end
|
165
|
+
|
166
|
+
def summary
|
167
|
+
<<-HERE
|
168
|
+
A trailing stop limit order is designed to allow an investor to specify a
|
169
|
+
limit on the maximum possible loss, without setting a limit on the maximum
|
170
|
+
possible gain. A SELL trailing stop limit moves with the market price, and
|
171
|
+
continually recalculates the stop trigger price at a fixed amount below
|
172
|
+
the market price, based on the user-defined "trailing" amount. The limit
|
173
|
+
order price is also continually recalculated based on the limit offset. As
|
174
|
+
the market price rises, both the stop price and the limit price rise by
|
175
|
+
the trail amount and limit offset respectively, but if the stock price
|
176
|
+
falls, the stop price remains unchanged, and when the stop price is hit a
|
177
|
+
limit order is submitted at the last calculated limit price. A "Buy"
|
178
|
+
trailing stop limit order is the mirror image of a sell trailing stop
|
179
|
+
limit, and is generally used in falling markets.
|
180
|
+
|
181
|
+
Products: BOND, CFD, CASH, FUT, FOP, OPT, STK, WAR
|
182
|
+
HERE
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
# def TrailingStopLimit(action:str, quantity:float, lmtPriceOffset:float,
|
187
|
+
# trailingAmount:float, trailStopPrice:float):
|
188
|
+
#
|
189
|
+
# # ! [trailingstoplimit]
|
190
|
+
# order = Order()
|
191
|
+
# order.action = action
|
192
|
+
# order.orderType = "TRAIL LIMIT"
|
193
|
+
# order.totalQuantity = quantity
|
194
|
+
# order.trailStopPrice = trailStopPrice
|
195
|
+
# order.lmtPriceOffset = lmtPriceOffset
|
196
|
+
# order.auxPrice = trailingAmount
|
197
|
+
# # ! [trailingstoplimit]
|
198
|
+
# return order
|
199
|
+
#
|
200
|
+
#
|
201
|
+
end
|
202
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module IB
|
2
|
+
# module OrderPrototype
|
3
|
+
module Volatility
|
4
|
+
### todo : check again. Order is siently accepted, but not acknowledged
|
5
|
+
extend OrderPrototype
|
6
|
+
class << self
|
7
|
+
|
8
|
+
def defaults
|
9
|
+
{ order_type: :volatility, volatility_type: 2 } #default is annual volatility
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def requirements
|
14
|
+
super.merge volatility: "the desired Option implied Vola (in %)"
|
15
|
+
end
|
16
|
+
|
17
|
+
def aliases
|
18
|
+
super.merge volatility: :volatility_percent
|
19
|
+
end
|
20
|
+
|
21
|
+
def summary
|
22
|
+
<<-HERE
|
23
|
+
Investors are able to create and enter Volatility-type orders for options and combinations
|
24
|
+
rather than price orders. Option traders may wish to trade and position for movements in the
|
25
|
+
price of the option determined by its implied volatility. Because implied volatility is a key
|
26
|
+
determinant of the premium on an option, traders position in specific contract months in an
|
27
|
+
effort to take advantage of perceived changes in implied volatility arising before, during or
|
28
|
+
after earnings or when company specific or broad market volatility is predicted to change.
|
29
|
+
In order to create a Volatility order, clients must first create a Volatility Trader page from
|
30
|
+
the Trading Tools menu and as they enter option contracts, premiums will display in percentage
|
31
|
+
terms rather than premium. The buy/sell process is the same as for regular orders priced in
|
32
|
+
premium terms except that the client can limit the volatility level they are willing to pay or receive.
|
33
|
+
--------
|
34
|
+
Products: FOP, OPT
|
35
|
+
HERE
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'ib/models/spread'
|
2
|
+
require 'ib/verify'
|
3
|
+
# These modules are used to facilitate referencing of most common Spreads
|
4
|
+
|
5
|
+
# Spreads are created in two ways:
|
6
|
+
#
|
7
|
+
# (1) IB::Spread::{prototype}.build from: {underlying},
|
8
|
+
# trading_class: (optional)
|
9
|
+
# {other specific attributes}
|
10
|
+
#
|
11
|
+
# (2) IB::Spread::{prototype}.fabcricate master: [one leg},
|
12
|
+
# {other specific attributes}
|
13
|
+
#
|
14
|
+
# They return a freshly instantiated Spread-Object
|
15
|
+
#
|
16
|
+
module IB
|
17
|
+
module SpreadPrototype
|
18
|
+
|
19
|
+
|
20
|
+
def build from: , **fields
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def initialize_spread ref_contract = nil, **attributes
|
26
|
+
error "Initializing of Spread failed – contract is missing" unless ref_contract.is_a?(IB::Contract)
|
27
|
+
the_contract = ref_contract.merge( attributes ).verify.first
|
28
|
+
error "Underlying for Spread is not valid: #{ref_contract.to_human}" if the_contract.nil?
|
29
|
+
the_spread= IB::Spread.new the_contract.attributes.slice( :exchange, :symbol, :currency )
|
30
|
+
error "Initializing of Spread failed – Underling is no Contract" if the_spread.nil?
|
31
|
+
yield the_spread if block_given? # yield outside mutex controlled verify-environment
|
32
|
+
the_spread # return_value
|
33
|
+
end
|
34
|
+
|
35
|
+
def requirements
|
36
|
+
{}
|
37
|
+
end
|
38
|
+
|
39
|
+
def defaults
|
40
|
+
{}
|
41
|
+
end
|
42
|
+
|
43
|
+
def optional
|
44
|
+
{ }
|
45
|
+
end
|
46
|
+
|
47
|
+
def parameters
|
48
|
+
the_output = ->(var){ var.empty? ? "none" : var.map{|x| x.join(" --> ") }.join("\n\t: ")}
|
49
|
+
|
50
|
+
"Required : " + the_output[requirements] + "\n --------------- \n" +
|
51
|
+
"Optional : " + the_output[optional] + "\n --------------- \n"
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
require 'ib/spread_prototypes/straddle'
|
58
|
+
require 'ib/spread_prototypes/strangle'
|
59
|
+
require 'ib/spread_prototypes/vertical'
|
60
|
+
require 'ib/spread_prototypes/calendar'
|
61
|
+
require 'ib/spread_prototypes/stock-spread'
|
62
|
+
require 'ib/spread_prototypes/butterfly'
|