ib-extensions 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/Gemfile +2 -1
- data/Gemfile.lock +33 -34
- data/README.md +12 -7
- data/bin/console +3 -5
- data/bin/{gateway.rb → gateway} +13 -4
- data/changelog.md +6 -0
- data/ib-extensions.gemspec +1 -0
- data/lib/ib/alerts/base-alert.rb +3 -1
- data/lib/ib/alerts/order-alerts.rb +5 -0
- data/lib/ib/eod.rb +19 -23
- data/lib/ib/extensions.rb +1 -0
- data/lib/ib/extensions/version.rb +1 -1
- data/lib/ib/gateway.rb +77 -63
- data/lib/ib/gateway/account-infos.rb +1 -2
- data/lib/ib/gateway/order-handling.rb +121 -126
- data/lib/ib/market-price.rb +2 -2
- data/lib/ib/models/account.rb +63 -56
- data/lib/ib/models/option.rb +20 -0
- data/lib/ib/option-chain.rb +180 -182
- data/lib/ib/order-prototypes.rb +1 -1
- data/lib/ib/spread-prototypes.rb +2 -2
- data/lib/ib/spread_prototypes/stock-spread.rb +1 -1
- data/lib/ib/verify.rb +192 -222
- metadata +19 -18
- data/examples/cancel_orders +0 -74
- data/examples/eod +0 -35
- data/examples/input.rb +0 -475
- data/examples/market_price +0 -57
- data/examples/option_chain +0 -67
- data/examples/place_and_modify_order +0 -162
- data/examples/place_bracket_order +0 -62
- data/examples/place_butterfly_order +0 -104
- data/examples/place_combo_order +0 -70
- data/examples/place_limit_order +0 -82
- data/examples/place_the_limit_order +0 -145
- data/examples/volatility_research +0 -139
- data/examples/what_if_order +0 -90
- data/lib/ib/models/spread.rb +0 -159
data/lib/ib/models/spread.rb
DELETED
@@ -1,159 +0,0 @@
|
|
1
|
-
require 'ib/verify'
|
2
|
-
module IB
|
3
|
-
class Spread < Bag
|
4
|
-
has_many :legs
|
5
|
-
|
6
|
-
using IBSupport
|
7
|
-
|
8
|
-
=begin
|
9
|
-
Parameters: front: YYYMM(DD)
|
10
|
-
back: {n}w, {n}d or YYYYMM(DD)
|
11
|
-
|
12
|
-
Adds (or substracts) relative (back) measures to the front month, just passes absolute YYYYMM(DD) value
|
13
|
-
|
14
|
-
front: 201809 back: 2m (-1m) --> 201811 (201808)
|
15
|
-
front: 20180908 back: 1w (-1w) --> 20180918 (20180902)
|
16
|
-
=end
|
17
|
-
|
18
|
-
def transform_distance front, back
|
19
|
-
# Check Format of back: 201809 --> > 200.000
|
20
|
-
# 20180989 ---> 20.000.000
|
21
|
-
start_date = front.to_i < 20000000 ? Date.strptime(front.to_s,"%Y%m") : Date.strptime(front.to_s,"%Y%m%d")
|
22
|
-
nb = if back.to_i > 200000
|
23
|
-
back.to_i
|
24
|
-
elsif back[-1] == "w" && front.to_i > 20000000
|
25
|
-
start_date + (back.to_i * 7)
|
26
|
-
elsif back[-1] == "m" && front.to_i > 200000
|
27
|
-
start_date >> back.to_i
|
28
|
-
else
|
29
|
-
error "Wrong date #{back} required format YYYMM, YYYYMMDD ord {n}w or {n}m"
|
30
|
-
end
|
31
|
-
if nb.is_a?(Date)
|
32
|
-
if back[-1]=='w'
|
33
|
-
nb.strftime("%Y%m%d")
|
34
|
-
else
|
35
|
-
nb.strftime("%Y%m")
|
36
|
-
end
|
37
|
-
else
|
38
|
-
nb
|
39
|
-
end
|
40
|
-
end # def
|
41
|
-
|
42
|
-
def to_human
|
43
|
-
self.description
|
44
|
-
end
|
45
|
-
|
46
|
-
def calculate_spread_value( array_of_portfolio_values )
|
47
|
-
array_of_portfolio_values.map{|x| x.send yield }.sum if block_given?
|
48
|
-
end
|
49
|
-
|
50
|
-
def fake_portfolio_position( array_of_portfolio_values )
|
51
|
-
calculate_spread_value= ->( a_o_p_v, attribute ) do
|
52
|
-
a_o_p_v.map{|x| x.send attribute }.sum
|
53
|
-
end
|
54
|
-
ar=array_of_portfolio_values
|
55
|
-
IB::PortfolioValue.new contract: self,
|
56
|
-
average_cost: calculate_spread_value[ar, :average_cost],
|
57
|
-
market_price: calculate_spread_value[ar, :market_price],
|
58
|
-
market_value: calculate_spread_value[ar, :market_value],
|
59
|
-
unrealized_pnl: calculate_spread_value[ar, :unrealized_pnl],
|
60
|
-
realized_pnl: calculate_spread_value[ar, :realized_pnl],
|
61
|
-
position: 0
|
62
|
-
|
63
|
-
end
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
def serialize_rabbit
|
68
|
-
{ "Spread" => serialize( :option, :trading_class ),
|
69
|
-
'legs' => legs.map{ |y| y.serialize :option, :trading_class }, 'combo_legs' => combo_legs.map(&:serialize),
|
70
|
-
'misc' => [description]
|
71
|
-
}
|
72
|
-
end
|
73
|
-
|
74
|
-
# adds a leg to any spread
|
75
|
-
#
|
76
|
-
# Parameter:
|
77
|
-
# contract: Will be verified. Contract.essential is added to legs-array
|
78
|
-
# action: :buy or :sell
|
79
|
-
# weight:
|
80
|
-
# ratio:
|
81
|
-
#
|
82
|
-
# Default: action: :buy, weight: 1
|
83
|
-
|
84
|
-
def add_leg contract, **leg_params
|
85
|
-
evaluated_contracts = []
|
86
|
-
nc = contract.verify.first.essential
|
87
|
-
# weigth = 1 --> sets Combo.side to buy and overwrites the action statement
|
88
|
-
# leg_params[:weight] = 1 unless leg_params.key?(:weight) || leg_params.key?(:ratio)
|
89
|
-
if nc.is_a?( IB::Contract) && nc.con_id.present?
|
90
|
-
the_leg= ComboLeg.new( nc.attributes.slice( :con_id, :exchange )
|
91
|
-
.merge( leg_params ))
|
92
|
-
self.combo_legs << the_leg
|
93
|
-
self.description = description + " added #{nc.to_human}" rescue "Spread: #{nc.to_human}"
|
94
|
-
self.legs << nc
|
95
|
-
end
|
96
|
-
self # return value to enable chaining
|
97
|
-
|
98
|
-
|
99
|
-
end
|
100
|
-
|
101
|
-
# removes the contract from the spread definition
|
102
|
-
#
|
103
|
-
def remove_leg contract
|
104
|
-
contract.verify do |c|
|
105
|
-
legs.delete_if { |x| x.con_id == c.con_id }
|
106
|
-
combo_legs.delete_if { |x| x.con_id == c.con_id }
|
107
|
-
self.description = description + " removed #{c.to_human}"
|
108
|
-
end
|
109
|
-
self
|
110
|
-
end
|
111
|
-
|
112
|
-
|
113
|
-
def essential
|
114
|
-
legs.each{ |x| x.essential }
|
115
|
-
self
|
116
|
-
end
|
117
|
-
def multiplier
|
118
|
-
(legs.map(&:multiplier).sum/legs.size).to_i
|
119
|
-
end
|
120
|
-
|
121
|
-
# provide a negative con_id
|
122
|
-
def con_id
|
123
|
-
-legs.map(&:con_id).sum
|
124
|
-
end
|
125
|
-
|
126
|
-
|
127
|
-
def non_guaranteed= x
|
128
|
-
super.merge combo_params: [ ['NonGuaranteed', x] ]
|
129
|
-
end
|
130
|
-
|
131
|
-
|
132
|
-
def non_guaranteed
|
133
|
-
combo_params['NonGuaranteed']
|
134
|
-
end
|
135
|
-
# optional: specify default order prarmeters for all spreads
|
136
|
-
# def order_requirements
|
137
|
-
# super.merge symbol: symbol
|
138
|
-
# end
|
139
|
-
|
140
|
-
|
141
|
-
def self.build_from_json container
|
142
|
-
read_leg = ->(a) do
|
143
|
-
IB::ComboLeg.new :con_id => a.read_int,
|
144
|
-
:ratio => a.read_int,
|
145
|
-
:action => a.read_string,
|
146
|
-
:exchange => a.read_string
|
147
|
-
|
148
|
-
end
|
149
|
-
object= self.new container['Spread'].read_contract
|
150
|
-
object.legs = container['legs'].map{|x| IB::Contract.build x.read_contract}
|
151
|
-
object.combo_legs = container['combo_legs'].map{ |x| read_leg[ x ] }
|
152
|
-
object.description = container['misc'].read_string
|
153
|
-
object
|
154
|
-
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
|
159
|
-
end
|