Skip to content

Commit 147309f

Browse files
topofocusclaude
andcommitted
WIP: Prepare for merge from ver_10 to master
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 4402616 commit 147309f

14 files changed

Lines changed: 1222 additions & 1 deletion

File tree

Gemfile.lock

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
PATH
2+
remote: .
3+
specs:
4+
ib-api (10.19.1)
5+
activemodel
6+
activesupport (>= 6.0)
7+
ox
8+
terminal-table
9+
workflow (~> 3.1)
10+
zeitwerk
11+
12+
GEM
13+
remote: https://rubygems.org/
14+
specs:
15+
activemodel (7.1.3.4)
16+
activesupport (= 7.1.3.4)
17+
activesupport (7.1.3.4)
18+
base64
19+
bigdecimal
20+
concurrent-ruby (~> 1.0, >= 1.0.2)
21+
connection_pool (>= 2.2.5)
22+
drb
23+
i18n (>= 1.6, < 2)
24+
minitest (>= 5.1)
25+
mutex_m
26+
tzinfo (~> 2.0)
27+
base64 (0.2.0)
28+
bigdecimal (3.1.8)
29+
coderay (1.1.3)
30+
concurrent-ruby (1.3.3)
31+
connection_pool (2.4.1)
32+
diff-lcs (1.5.1)
33+
drb (2.2.1)
34+
ffi (1.17.0-x86_64-linux-gnu)
35+
formatador (1.1.0)
36+
given_core (3.8.2)
37+
sorcerer (>= 0.3.7)
38+
guard (2.18.1)
39+
formatador (>= 0.2.4)
40+
listen (>= 2.7, < 4.0)
41+
lumberjack (>= 1.0.12, < 2.0)
42+
nenv (~> 0.1)
43+
notiffany (~> 0.0)
44+
pry (>= 0.13.0)
45+
shellany (~> 0.0)
46+
thor (>= 0.18.1)
47+
guard-compat (1.2.1)
48+
guard-rspec (4.7.3)
49+
guard (~> 2.1)
50+
guard-compat (~> 1.1)
51+
rspec (>= 2.99.0, < 4.0)
52+
i18n (1.14.5)
53+
concurrent-ruby (~> 1.0)
54+
listen (3.9.0)
55+
rb-fsevent (~> 0.10, >= 0.10.3)
56+
rb-inotify (~> 0.9, >= 0.9.10)
57+
lumberjack (1.2.10)
58+
method_source (1.1.0)
59+
minitest (5.24.1)
60+
mutex_m (0.2.0)
61+
nenv (0.3.0)
62+
notiffany (0.1.3)
63+
nenv (~> 0.1)
64+
shellany (~> 0.0)
65+
ox (2.14.18)
66+
pry (0.14.2)
67+
coderay (~> 1.1)
68+
method_source (~> 1.0)
69+
rake (13.2.1)
70+
rb-fsevent (0.11.2)
71+
rb-inotify (0.11.1)
72+
ffi (~> 1.0)
73+
rspec (3.13.0)
74+
rspec-core (~> 3.13.0)
75+
rspec-expectations (~> 3.13.0)
76+
rspec-mocks (~> 3.13.0)
77+
rspec-collection_matchers (1.2.1)
78+
rspec-expectations (>= 2.99.0.beta1)
79+
rspec-core (3.13.0)
80+
rspec-support (~> 3.13.0)
81+
rspec-expectations (3.13.1)
82+
diff-lcs (>= 1.2.0, < 2.0)
83+
rspec-support (~> 3.13.0)
84+
rspec-given (3.8.2)
85+
given_core (= 3.8.2)
86+
rspec (>= 2.14.0)
87+
rspec-its (1.3.0)
88+
rspec-core (>= 3.0.0)
89+
rspec-expectations (>= 3.0.0)
90+
rspec-mocks (3.13.1)
91+
diff-lcs (>= 1.2.0, < 2.0)
92+
rspec-support (~> 3.13.0)
93+
rspec-support (3.13.1)
94+
shellany (0.0.1)
95+
sorcerer (2.0.1)
96+
terminal-table (3.0.2)
97+
unicode-display_width (>= 1.1.1, < 3)
98+
thor (1.3.1)
99+
tzinfo (2.0.6)
100+
concurrent-ruby (~> 1.0)
101+
unicode-display_width (2.5.0)
102+
workflow (3.1.1)
103+
zeitwerk (2.6.16)
104+
105+
PLATFORMS
106+
x86_64-linux
107+
108+
DEPENDENCIES
109+
bundler
110+
guard
111+
guard-rspec
112+
ib-api!
113+
rake (~> 13.0)
114+
rspec
115+
rspec-collection_matchers
116+
rspec-given
117+
rspec-its
118+
119+
BUNDLED WITH
120+
2.4.6
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
module IB
2+
module Messages
3+
module Outgoing
4+
extend Messages # def_message macros
5+
6+
PlaceOrder = def_message [ 3,0 ]
7+
8+
class PlaceOrder
9+
def encode
10+
order = @data[:order]
11+
contract = @data[:contract]
12+
13+
error 'contract has to be specified' unless contract.is_a? IB::Contract
14+
15+
# send place order msg
16+
fields = [ super ]
17+
fields << contract.serialize_short(:primary_exchange, :sec_id_type)
18+
fields << order.serialize_main_order_fields
19+
fields << order.serialize_extended_order_fields
20+
21+
# Send combo legs for BAG requests (srv v8 and above)
22+
if contract.bag?
23+
fields.push(combo_legs.size)
24+
fields += combo_legs.map do |the_leg|
25+
array = [
26+
the_leg.con_id,
27+
the_leg.ratio,
28+
the_leg.side.to_sup,
29+
the_leg.exchange,
30+
the_leg[:open_close],
31+
the_leg[:short_sale_slot],
32+
the_leg.designated_location,
33+
]
34+
array.push(the_leg.exempt_code) if server_version >= KNOWN_SERVERS[:min_server_ver_sshortx_old] # 51
35+
array
36+
end.flatten
37+
38+
# TODO: order_combo_leg?
39+
if server_version >= KNOWN_SERVERS[:min_server_ver_order_combo_legs_price] # 61
40+
fields.push(contract.combo_legs.size)
41+
fields += contract.combo_legs.map { |leg| leg.price || '' }
42+
end
43+
44+
# TODO: smartComboRoutingParams
45+
if server_version >= KNOWN_SERVERS[:min_server_ver_smart_combo_routing_params] # 57
46+
fields.push(order.combo_params.size)
47+
fields += order.combo_params.to_a
48+
end
49+
end
50+
51+
fields << order.serialize_auxilery_order_fields # incluing advisory order fields
52+
53+
if server_version >= KNOWN_SERVERS[:min_server_ver_models_support]
54+
fields.push(order.model_code )
55+
end
56+
57+
fields += [
58+
order[:short_sale_slot] , # 0 only for retail, 1 or 2 for institution (Institutional)
59+
order.designated_location # only populate when short_sale_slot == 2 (Institutional)
60+
]
61+
62+
fields.push(order.exempt_code) if server_version >= KNOWN_SERVERS[:min_server_ver_sshortx_old]
63+
64+
fields.push(order[:oca_type])
65+
fields += [
66+
order[:rule_80a], # .to_sup[0..0],
67+
order.settling_firm,
68+
order.all_or_none,
69+
order.min_quantity,
70+
order.percent_offset,
71+
false, # was: order.etrade_only || false, desupported in TWS > 981
72+
false, # was: order.firm_quote_only || false, desupported in TWS > 981
73+
'', ## desupported in TWS > 981, too. maybe we have to insert a hard-coded "" here
74+
order[:auction_strategy], # AUCTION_MATCH, AUCTION_IMPROVEMENT, AUCTION_TRANSPARENT
75+
order.starting_price ,
76+
order.stock_ref_price ,
77+
order.delta ,
78+
order.stock_range_lower ,
79+
order.stock_range_upper ,
80+
order.override_percentage_constraints,
81+
order.serialize_volatility_order_fields,
82+
order.serialize_delta_neutral_order_fields
83+
]
84+
85+
fields += [
86+
order.continuous_update,
87+
order[:reference_price_type] ,
88+
order.trail_stop_price,
89+
order.trailing_percent
90+
]
91+
92+
fields << order.serialize_scale_order_fields
93+
94+
fields.push order.hedge_type
95+
fields.push order.hedge_param # default is [] --> omitted if left default
96+
fields.push order.opt_out_smart_routing
97+
98+
fields.push order.clearing_account
99+
fields.push order.clearing_intent
100+
101+
fields.push(order.not_held) if server_version >= KNOWN_SERVERS[:min_server_ver_not_held] #44
102+
103+
if server_version >= KNOWN_SERVERS[:min_server_ver_delta_neutral] # 40
104+
fields += contract.serialize_under_comp
105+
end
106+
107+
if server_version >= KNOWN_SERVERS[:min_server_ver_algo_orders] # 41
108+
fields += order.serialize_algo
109+
end
110+
if server_version >= KNOWN_SERVERS[:min_server_ver_algo_id] # 71
111+
fields.push(order.algo_id)
112+
end
113+
114+
fields.push(order.what_if)
115+
fields.push(order.serialize_misc_options) if server_version >= KNOWN_SERVERS[:min_server_ver_linking] # 70
116+
fields.push(order.solicided) if server_version >= KNOWN_SERVERS[:min_server_ver_order_solicited] # 73
117+
if server_version >= KNOWN_SERVERS[:min_server_ver_randomize_size_and_price] # 76
118+
fields += [
119+
order.random_size,
120+
order.random_price
121+
]
122+
end
123+
124+
fields << order.serialize_pegged_order_fields
125+
fields += order.serialize_conditions
126+
fields += [
127+
order.adjusted_order_type,
128+
order.trigger_price,
129+
order.limit_price_offset,
130+
order.adjusted_stop_price,
131+
order.adjusted_stop_limit_price,
132+
order.adjusted_trailing_amount,
133+
order.adjustable_trailing_unit
134+
]
135+
136+
fields.push(order.ext_operator) if server_version >= KNOWN_SERVERS[:min_server_ver_ext_operator]
137+
138+
fields << order.serialize_soft_dollar_tier
139+
140+
fields.push(order.cash_qty) if server_version >= KNOWN_SERVERS[:min_server_ver_cash_qty] # 111
141+
142+
fields << order.serialize_mifid_order_fields
143+
144+
if server_version >= KNOWN_SERVERS[:min_server_ver_auto_price_for_hedge]
145+
fields.push(order.dont_use_auto_price_for_hedge)
146+
end
147+
148+
fields.push(order.is_O_ms_container) if server_version >= KNOWN_SERVERS[:min_server_ver_order_container]
149+
150+
if server_version >= KNOWN_SERVERS[:min_server_ver_d_peg_orders]
151+
fields.push(order.discretionary_up_to_limit_price)
152+
end
153+
154+
if server_version >= KNOWN_SERVERS[:min_server_ver_price_mgmt_algo]
155+
fields.push(order.use_price_management_algo)
156+
end
157+
158+
if server_version >= KNOWN_SERVERS[:min_server_ver_duration]
159+
fields.push(order.duration)
160+
end
161+
162+
if server_version >= KNOWN_SERVERS[:min_server_ver_post_to_ats]
163+
fields.push(order.post_to_ats)
164+
end
165+
166+
if server_version >= KNOWN_SERVERS[:min_server_ver_auto_cancel_parent]
167+
fields.push(order.auto_cancel_parent)
168+
end
169+
170+
if server_version >= KNOWN_SERVERS[:min_server_ver_advanced_order_reject]
171+
fields.push(order.advanced_order_reject)
172+
end
173+
174+
if server_version >= KNOWN_SERVERS[:min_server_ver_manual_order_time]
175+
fields.push(order.manual_order_time)
176+
end
177+
178+
fields << order.serialize_peg_best_and_mid
179+
180+
if server_version >= KNOWN_SERVERS[:min_server_ver_customer_account]
181+
fields.push(order.customer_account)
182+
end
183+
184+
if server_version >= KNOWN_SERVERS[:min_server_ver_professional_customer]
185+
fields.push(order.professional_account)
186+
end
187+
188+
fields
189+
end
190+
end
191+
end
192+
end
193+
end

0 commit comments

Comments
 (0)