Skip to content

Instantly share code, notes, and snippets.

@filip-seedcx
Created March 18, 2019 06:37
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save filip-seedcx/aca7315f1e35b5bebe306740f47c24e1 to your computer and use it in GitHub Desktop.
Save filip-seedcx/aca7315f1e35b5bebe306740f47c24e1 to your computer and use it in GitHub Desktop.
Test demonstrating FIX Gateway's routing based on target comp id
Using Environment cert
Using FIX market data config: /home/filipf/src/gw/robocop/tests/config/certfixmd.ini
Using default FIX file: defaults.ini
Loading defaults from: /home/filipf/src/gw/robocop/tests/defaults.ini
onCreate FIX.4.4:T-ROBO5A->SEEDCX
onCreate FIX.4.4:T-ROBO5B->SEEDCX
FIX.4.4:T-ROBO5A->SEEDCX : SENT ADMIN-LEVEL FIX
(begin_string)8=FIX.4.4 | (body_length)9=75 | (msg_type)35=A(logon) | (msg_seq_num)34=1 | (sender_comp_id)49=T-ROBO5A | (sending_time)52=20190318-06:34:57.953 | (target_comp_id)56=SEEDCX | (encrypt_method)98=0(unencrypted) | (heart_bt_int)108=30 | (reset_seq_num_flag)141=Y | (check_sum)10=038 |
FIX.4.4:T-ROBO5B->SEEDCX : SENT ADMIN-LEVEL FIX
(begin_string)8=FIX.4.4 | (body_length)9=75 | (msg_type)35=A(logon) | (msg_seq_num)34=1 | (sender_comp_id)49=T-ROBO5B | (sending_time)52=20190318-06:34:57.954 | (target_comp_id)56=SEEDCX | (encrypt_method)98=0(unencrypted) | (heart_bt_int)108=30 | (reset_seq_num_flag)141=Y | (check_sum)10=040 |
FIX.4.4:T-ROBO5A->SEEDCX : LOGON
FIX.4.4:T-ROBO5B->SEEDCX : LOGON
FIX.4.4:T-ROBO5A->SEEDCX : SENT APP-LEVEL FIX
(begin_string)8=FIX.4.4 | (body_length)9=216 | (msg_type)35=D(new_order_single) | (msg_seq_num)34=2 | (sender_comp_id)49=T-ROBO5A | (sending_time)52=20190318-06:34:59.958 | (target_comp_id)56=SEEDCX | (target_sub_id)57=SCXM | (sender_location_id)142=US,IL | (account)1=T-ROBO5AMA1 | (cl_ord_id)11=AAm1Z7GER8AutgWNNgriXi | (order_qty)38=1.0 | (ord_type)40=2(limit) | (price)44=6990.0 | (sender_sub_id)50=T-ROBO5AMA1TA1 | (side)54=1(buy) | (symbol)55=COSP:BTC/TST | (transact_time)60=20190318-06:34:59 | (order_capacity)528=A(agency) | (cust_order_capacity)582=1(member_own_account) | (manual_order_indicator)1028=Y | (check_sum)10=081 |
FIX.4.4:T-ROBO5A->SEEDCX : Received APP message:
8=FIX.4.4|9=319|35=8|34=2|49=SEEDCX|50=SCXM|52=20190318-06:34:59.964842906|56=T-ROBO5A|57=T-ROBO5AMA1TA1|142=US,IL|369=2|1=T-ROBO5AMA1|6=0.0|11=AAm1Z7GER8AutgWNNgriXi|14=0.0|17=336300000000007279|37=336300000000000188|38=1.0|39=0|40=2|44=6990.0|54=1|55=COSP:BTC/TST|59=0|60=20190318-06:34:59.963000000|150=0|151=1.0|528=A|582=1|1028=Y|10=044|
FIX.4.4:T-ROBO5A->SEEDCX RECEIVED
(begin_string)8=FIX.4.4 | (body_length)9=319 | (msg_type)35=8(execution_report) | (msg_seq_num)34=2 | (sender_comp_id)49=SEEDCX | (sender_sub_id)50=SCXM | (sending_time)52=20190318-06:34:59.964842906 | (target_comp_id)56=T-ROBO5A | (target_sub_id)57=T-ROBO5AMA1TA1 | (sender_location_id)142=US,IL | (last_msg_seq_num_processed)369=2 | (account)1=T-ROBO5AMA1 | (avg_px)6=0.0 | (cl_ord_id)11=AAm1Z7GER8AutgWNNgriXi | (cum_qty)14=0.0 | (exec_id)17=336300000000007279 | (order_id)37=336300000000000188 | (order_qty)38=1.0 | (ord_status)39=0(new) | (ord_type)40=2(limit) | (price)44=6990.0 | (side)54=1(buy) | (symbol)55=COSP:BTC/TST | (time_in_force)59=0(day) | (transact_time)60=20190318-06:34:59.963000000 | (exec_type)150=0(new) | (leaves_qty)151=1.0 | (order_capacity)528=A(agency) | (cust_order_capacity)582=1(member_own_account) | (manual_order_indicator)1028=Y | (check_sum)10=044 |
--> passed validation
=================== MD expect add order. order_id: 336300000000000188 side: Side.buy price: 6990 size: 1
---> MD validation passed
FIX.4.4:T-ROBO5A->SEEDCX : SENT APP-LEVEL FIX
(begin_string)8=FIX.4.4 | (body_length)9=208 | (msg_type)35=F(order_cancel_request) | (msg_seq_num)34=3 | (sender_comp_id)49=T-ROBO5A | (sending_time)52=20190318-06:34:59.965 | (target_comp_id)56=SEEDCX | (target_sub_id)57=SCXM | (sender_location_id)142=US,IL | (account)1=T-ROBO5AMA1 | (cl_ord_id)11=BVJQ8G5cwvAMUcSXHBGJeB | (orig_cl_ord_id)41=AAm1Z7GER8AutgWNNgriXi | (sender_sub_id)50=T-ROBO5AMA1TA1 | (side)54=1(buy) | (symbol)55=COSP:BTC/TST | (transact_time)60=20190318-06:34:59 | (manual_order_indicator)1028=Y | (check_sum)10=204 |
FIX.4.4:T-ROBO5A->SEEDCX : Received APP message:
8=FIX.4.4|9=345|35=8|34=3|49=SEEDCX|50=SCXM|52=20190318-06:34:59.968788235|56=T-ROBO5A|57=T-ROBO5AMA1TA1|142=US,IL|369=3|1=T-ROBO5AMA1|6=0.0|11=BVJQ8G5cwvAMUcSXHBGJeB|14=0.0|17=336300000000007281|37=336300000000000188|38=1.0|39=4|40=2|41=AAm1Z7GER8AutgWNNgriXi|44=6990.0|54=1|55=COSP:BTC/TST|59=0|60=20190318-06:34:59.968000000|150=4|151=0.0|528=A|582=1|1028=Y|10=199|
FIX.4.4:T-ROBO5A->SEEDCX RECEIVED
(begin_string)8=FIX.4.4 | (body_length)9=345 | (msg_type)35=8(execution_report) | (msg_seq_num)34=3 | (sender_comp_id)49=SEEDCX | (sender_sub_id)50=SCXM | (sending_time)52=20190318-06:34:59.968788235 | (target_comp_id)56=T-ROBO5A | (target_sub_id)57=T-ROBO5AMA1TA1 | (sender_location_id)142=US,IL | (last_msg_seq_num_processed)369=3 | (account)1=T-ROBO5AMA1 | (avg_px)6=0.0 | (cl_ord_id)11=BVJQ8G5cwvAMUcSXHBGJeB | (cum_qty)14=0.0 | (exec_id)17=336300000000007281 | (order_id)37=336300000000000188 | (order_qty)38=1.0 | (ord_status)39=4(canceled) | (ord_type)40=2(limit) | (orig_cl_ord_id)41=AAm1Z7GER8AutgWNNgriXi | (price)44=6990.0 | (side)54=1(buy) | (symbol)55=COSP:BTC/TST | (time_in_force)59=0(day) | (transact_time)60=20190318-06:34:59.968000000 | (exec_type)150=4(canceled) | (leaves_qty)151=0.0 | (order_capacity)528=A(agency) | (cust_order_capacity)582=1(member_own_account) | (manual_order_indicator)1028=Y | (check_sum)10=199 |
--> passed validation
=================== MD expect delete. order_id: 336300000000000188
---> MD validation passed
FIX.4.4:T-ROBO5A->SEEDCX : SENT APP-LEVEL FIX
(begin_string)8=FIX.4.4 | (body_length)9=224 | (msg_type)35=D(new_order_single) | (msg_seq_num)34=4 | (sender_comp_id)49=T-ROBO5A | (sending_time)52=20190318-06:34:59.968 | (target_comp_id)56=SEEDCX | (target_sub_id)57=SCXS | (sender_location_id)142=US,IL | (account)1=T-ROBO5AMA1 | (cl_ord_id)11=5w1fJ7TixsshxaVj4HrDJ5 | (order_qty)38=1.0 | (ord_type)40=2(limit) | (price)44=6990.0 | (sender_sub_id)50=T-ROBO5AMA1TA1 | (side)54=1(buy) | (symbol)55=COF:BTC/TST:20230424 | (transact_time)60=20190318-06:34:59 | (order_capacity)528=A(agency) | (cust_order_capacity)582=1(member_own_account) | (manual_order_indicator)1028=Y | (check_sum)10=010 |
FIX.4.4:T-ROBO5A->SEEDCX : Received APP message:
8=FIX.4.4|9=327|35=8|34=4|49=SEEDCX|50=SCXS|52=20190318-06:34:59.985432981|56=T-ROBO5A|57=T-ROBO5AMA1TA1|142=US,IL|369=4|1=T-ROBO5AMA1|6=0.0|11=5w1fJ7TixsshxaVj4HrDJ5|14=0.0|17=336300000000000123|37=336300000000000003|38=1.0|39=0|40=2|44=6990.0|54=1|55=COF:BTC/TST:20230424|59=0|60=20190318-06:34:59.978000000|150=0|151=1.0|528=A|582=1|1028=Y|10=204|
FIX.4.4:T-ROBO5A->SEEDCX RECEIVED
(begin_string)8=FIX.4.4 | (body_length)9=327 | (msg_type)35=8(execution_report) | (msg_seq_num)34=4 | (sender_comp_id)49=SEEDCX | (sender_sub_id)50=SCXS | (sending_time)52=20190318-06:34:59.985432981 | (target_comp_id)56=T-ROBO5A | (target_sub_id)57=T-ROBO5AMA1TA1 | (sender_location_id)142=US,IL | (last_msg_seq_num_processed)369=4 | (account)1=T-ROBO5AMA1 | (avg_px)6=0.0 | (cl_ord_id)11=5w1fJ7TixsshxaVj4HrDJ5 | (cum_qty)14=0.0 | (exec_id)17=336300000000000123 | (order_id)37=336300000000000003 | (order_qty)38=1.0 | (ord_status)39=0(new) | (ord_type)40=2(limit) | (price)44=6990.0 | (side)54=1(buy) | (symbol)55=COF:BTC/TST:20230424 | (time_in_force)59=0(day) | (transact_time)60=20190318-06:34:59.978000000 | (exec_type)150=0(new) | (leaves_qty)151=1.0 | (order_capacity)528=A(agency) | (cust_order_capacity)582=1(member_own_account) | (manual_order_indicator)1028=Y | (check_sum)10=204 |
--> passed validation
=================== MD expect add order. order_id: 336300000000000003 side: Side.buy price: 6990 size: 1
---> MD validation passed
FIX.4.4:T-ROBO5A->SEEDCX : SENT APP-LEVEL FIX
(begin_string)8=FIX.4.4 | (body_length)9=216 | (msg_type)35=F(order_cancel_request) | (msg_seq_num)34=5 | (sender_comp_id)49=T-ROBO5A | (sending_time)52=20190318-06:34:59.985 | (target_comp_id)56=SEEDCX | (target_sub_id)57=SCXS | (sender_location_id)142=US,IL | (account)1=T-ROBO5AMA1 | (cl_ord_id)11=3W5ptQHMsfWLxBsc3H5R8D | (orig_cl_ord_id)41=5w1fJ7TixsshxaVj4HrDJ5 | (sender_sub_id)50=T-ROBO5AMA1TA1 | (side)54=1(buy) | (symbol)55=COF:BTC/TST:20230424 | (transact_time)60=20190318-06:34:59 | (manual_order_indicator)1028=Y | (check_sum)10=175 |
FIX.4.4:T-ROBO5A->SEEDCX : Received APP message:
8=FIX.4.4|9=353|35=8|34=5|49=SEEDCX|50=SCXS|52=20190318-06:35:00.000885410|56=T-ROBO5A|57=T-ROBO5AMA1TA1|142=US,IL|369=5|1=T-ROBO5AMA1|6=0.0|11=3W5ptQHMsfWLxBsc3H5R8D|14=0.0|17=336300000000000125|37=336300000000000003|38=1.0|39=4|40=2|41=5w1fJ7TixsshxaVj4HrDJ5|44=6990.0|54=1|55=COF:BTC/TST:20230424|59=0|60=20190318-06:34:59.994000000|150=4|151=0.0|528=A|582=1|1028=Y|10=102|
FIX.4.4:T-ROBO5A->SEEDCX RECEIVED
(begin_string)8=FIX.4.4 | (body_length)9=353 | (msg_type)35=8(execution_report) | (msg_seq_num)34=5 | (sender_comp_id)49=SEEDCX | (sender_sub_id)50=SCXS | (sending_time)52=20190318-06:35:00.000885410 | (target_comp_id)56=T-ROBO5A | (target_sub_id)57=T-ROBO5AMA1TA1 | (sender_location_id)142=US,IL | (last_msg_seq_num_processed)369=5 | (account)1=T-ROBO5AMA1 | (avg_px)6=0.0 | (cl_ord_id)11=3W5ptQHMsfWLxBsc3H5R8D | (cum_qty)14=0.0 | (exec_id)17=336300000000000125 | (order_id)37=336300000000000003 | (order_qty)38=1.0 | (ord_status)39=4(canceled) | (ord_type)40=2(limit) | (orig_cl_ord_id)41=5w1fJ7TixsshxaVj4HrDJ5 | (price)44=6990.0 | (side)54=1(buy) | (symbol)55=COF:BTC/TST:20230424 | (time_in_force)59=0(day) | (transact_time)60=20190318-06:34:59.994000000 | (exec_type)150=4(canceled) | (leaves_qty)151=0.0 | (order_capacity)528=A(agency) | (cust_order_capacity)582=1(member_own_account) | (manual_order_indicator)1028=Y | (check_sum)10=102 |
--> passed validation
=================== MD expect delete. order_id: 336300000000000003
---> MD validation passed
FIX.4.4:T-ROBO5A->SEEDCX : SENT APP-LEVEL FIX
(begin_string)8=FIX.4.4 | (body_length)9=225 | (msg_type)35=D(new_order_single) | (msg_seq_num)34=6 | (sender_comp_id)49=T-ROBO5A | (sending_time)52=20190318-06:35:00.001 | (target_comp_id)56=SEEDCX | (target_sub_id)57=BAD-TARGET-COMP-ID | (sender_location_id)142=US,IL | (account)1=T-ROBO5AMA1 | (cl_ord_id)11=LeXorJLDQqJwndtLhgA1Vn | (order_qty)38=1.0 | (ord_type)40=2(limit) | (price)44=6990.0 | (sender_sub_id)50=T-ROBO5AMA1TA1 | (side)54=1(buy) | (symbol)55=BTC/TST | (transact_time)60=20190318-06:35:00 | (order_capacity)528=A(agency) | (cust_order_capacity)582=1(member_own_account) | (manual_order_indicator)1028=Y | (check_sum)10=221 |
FIX.4.4:T-ROBO5A->SEEDCX RECEIVED
(begin_string)8=FIX.4.4 | (body_length)9=189 | (msg_type)35=3(session_reject) | (msg_seq_num)34=6 | (sender_comp_id)49=SEEDCX | (sender_sub_id)50=BAD-TARGET-COMP-ID | (sending_time)52=20190318-06:35:00.003746202 | (target_comp_id)56=T-ROBO5A | (target_sub_id)57=T-ROBO5AMA1TA1 | (sender_location_id)142=US,IL | (last_msg_seq_num_processed)369=6 | (ref_seq_num)45=6 | (text)58=The message contains fields with invalid values. | (ref_tag_id)371=57 | (session_reject_reason)373=5(incorrect_value_for_tag) | (check_sum)10=035 |
--> passed validation
FIX.4.4:T-ROBO5A->SEEDCX : SENT ADMIN-LEVEL FIX
(begin_string)8=FIX.4.4 | (body_length)9=57 | (msg_type)35=5(logout) | (msg_seq_num)34=7 | (sender_comp_id)49=T-ROBO5A | (sending_time)52=20190318-06:35:00.989 | (target_comp_id)56=SEEDCX | (check_sum)10=216 |
FIX.4.4:T-ROBO5B->SEEDCX : SENT ADMIN-LEVEL FIX
(begin_string)8=FIX.4.4 | (body_length)9=57 | (msg_type)35=5(logout) | (msg_seq_num)34=2 | (sender_comp_id)49=T-ROBO5B | (sending_time)52=20190318-06:35:00.989 | (target_comp_id)56=SEEDCX | (check_sum)10=212 |
from robocop import Robocop
# Scenario: Sending a limit order to multiple target sub ids
r = Robocop()
def send(target_sub_id, symbol):
cl_ord_id = r.gen_id()
# New Order
r.driver.send("57=" + target_sub_id + "|55=" + symbol + "|35=D|11=" + cl_ord_id + "|40=2|44=6990.0|54=1|38=1.0|528=A|582=1|1028=Y")
# Acknowledgement
msg1 = r.driver.expect("35=8|11=" + cl_ord_id + "|50=" + target_sub_id + "|55=" + symbol + "|150=0|39=0|54=1|38=1.0|44=6990.0|151=1.0|14=0.0|6=0.0")
r.md.expect_buy_order(price=6990, qty=1, order_id=msg1.order_id)
cl_ord_id_cancel = r.gen_id()
# Cancel Request
r.driver.send("35=F|41=" + cl_ord_id + "|57=" + target_sub_id + "|55=" + symbol + "|11=" + cl_ord_id_cancel + "|54=1|1028=Y")
# Order Cancelled Acknowledgement
r.driver.expect("35=8|11=" + cl_ord_id_cancel + "|50=" + target_sub_id + "|55=" + symbol +"|150=4|39=4|41=" + cl_ord_id + "|44=6990.0|54=1|38=1.0|151=0.0|14=0.0|6=0.0")
r.md.expect_delete_order(order_id=msg1.order_id)
send('SCXM', 'COSP:BTC/TST')
send('SCXS', 'COF:BTC/TST:20230424')
# Now let's send to a bad target_comp_id
cl_ord_id = r.gen_id()
r.driver.send("57=BAD-TARGET-COMP-ID|55=BTC/TST|35=D|11=" + cl_ord_id + "|40=2|44=6990.0|54=1|38=1.0|528=A|582=1|1028=Y")
msg1 = r.driver.expect("35=3|50=BAD-TARGET-COMP-ID|58=The message contains fields with invalid values.|371=57|373=5")
r.stop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment