{"id":22220633,"url":"https://github.com/fix8mt/fix8pro_example","last_synced_at":"2025-10-13T06:31:52.961Z","repository":{"id":43845346,"uuid":"436058110","full_name":"fix8mt/fix8pro_example","owner":"fix8mt","description":"Simple client/server example that can be used as a starting point for development using Fix8Pro","archived":false,"fork":false,"pushed_at":"2023-10-06T05:32:34.000Z","size":2923,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-12-02T23:09:21.760Z","etag":null,"topics":["aggregated","brownian-motion","cpp","cpp-17","custom-fix","executionreport","fix-engine","fix44","fix8","fix8pro","fixprotocol","high-performance","low-latency","market-data","marketdataincrementalrefresh","marketdatasnapshotfullrefresh","newordersingle","ohlc","orderbook","vwap"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fix8mt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-12-07T23:43:20.000Z","updated_at":"2024-08-19T06:45:34.000Z","dependencies_parsed_at":"2023-01-18T02:45:22.518Z","dependency_job_id":null,"html_url":"https://github.com/fix8mt/fix8pro_example","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fix8mt%2Ffix8pro_example","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fix8mt%2Ffix8pro_example/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fix8mt%2Ffix8pro_example/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fix8mt%2Ffix8pro_example/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fix8mt","download_url":"https://codeload.github.com/fix8mt/fix8pro_example/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":236309845,"owners_count":19128391,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aggregated","brownian-motion","cpp","cpp-17","custom-fix","executionreport","fix-engine","fix44","fix8","fix8pro","fixprotocol","high-performance","low-latency","market-data","marketdataincrementalrefresh","marketdatasnapshotfullrefresh","newordersingle","ohlc","orderbook","vwap"],"created_at":"2024-12-02T23:09:23.734Z","updated_at":"2025-10-13T06:31:47.548Z","avatar_url":"https://github.com/fix8mt.png","language":"C++","readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.fix8mt.com\"\u003e\u003cimg src=\"assets/fix8mt_Master_Logo_Green_Trans.png\" width=\"200\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# Fix8Pro C++ example\n#### An example client/server that can be used as a starting point for development using the Fix8Pro C++ Framework.\n\n1.   [Introduction](#introduction)\n1.   [Releases](#releases)\n1.   [To download](#to-download)\n1.   [Before you build](#before-you-build)\n1.   [To build](#to-build)\n1.   [To setup your run environment](#to-setup-your-run-environment)\n1.   [CLI options](#cli-options)\n1.   [To run](#to-run)\n      1. [Run in Order Mode](#run-in-order-mode)\n      1. [Run in Market Data Mode](#run-in-market-data-mode)\n1.   [Securities](#securities)\n1.   [Order Mode](#order-mode)\n1.   [Market Data Mode](#market-data-mode)\n      1. [About the orderbook and matching](#about-the-orderbook-and-matching)\n3.   [About random numbers, distributions and generators used](#about-random-numbers-distributions-and-generators-used)\n      1. [Prices](#prices)\n1.   [Misc Functions](#misc-functions)\n      1. [Capture Screen Output](#capture-screen-output)\n      1. [Tick Capture](#tick-capture)\n      1. [Thread Naming](#thread-naming)\n1.   [Runtime Interaction](#runtime-interaction)\n      1. [As Server](#as-server)\n      1. [As Client](#as-client)\n      1. [Command descriptions](#command-descriptions)\n          1. [logout](#logout)\n          1. [toggle summary](#toggle-summary)\n          1. [disconnect](#disconnect)\n          1. [just exit](#just-exit)\n          1. [resubscribe](#resubscribe)\n          1. [toggle generate](#toggle-generate)\n          1. [toggle quiet](#toggle-quiet)\n          1. [toggle states](#toggle-states)\n6.   [Sample output](#sample-output)\n      1.   [Server](#server)\n      1.   [Client](#client)\n      1.   [Misc](#misc)\n\n------------------------------------------------------------------------\n## Introduction\nYou have two main options when you develop a FIX application using Fix8Pro. For super high performance close to the metal, choose Fix8Pro C++ Framework (this example).\nFor high performance and rapid development using a range of modern languages, choose UFE.\n\nThe UFE package comes with freely available high performance UFEed© client adaptors. You can find full source code and instructions for all our UFEed adaptors (Python, Java, C# and C++)\non our [github repo](https://github.com/fix8mt/ufeed_bindings).\n\nThis example demonstrates how to create a client and a server that can accept or initiate FIX sessions. A client or server can run in two modes -\nas an execution gateway processing orders and sending execution reports; and as a market data server, accepting market data subscriptions, sending full refreshes and incremental updates. These modes are discussed in detail below.\n\nThis example uses the standard FIX44 dictionary, uses high quality pseudo-random number generation classes provided by the C++ Standard Library and offers a model for creating trading simulations.\n\n\u003ckbd\u003e ![Shows the server responding to a NewOrderSingle](assets/example_server_detail.png)\n  \u003cp\u003e\u003ci\u003eMessage displayed with the built-in Fix8Pro printer\u003c/i\u003e\u003c/p\u003e\n\u003c/kbd\u003e\n\n## Releases\nThere are a number of releases available. Each release builds on the previous in terms of complexity and functionality. These are summarised here:\n1. Simple client/server with `NewOrderSingle` and `ExecutionReport` (order mode only). [Browse the source](https://github.com/fix8mt/fix8pro_example/tree/dd8603eef63d71aa3d87574a688b4fc0fa592875)\n1. Client/server with market data generation, simple aggregated order book (order mode and market data mode). [Browse the source](https://github.com/fix8mt/fix8pro_example/tree/4960b3a7873d2f5492d4eae595467f71cc45e7d4)\n1. Client/server with market data history (custom FIX messages) (order mode and market data mode). [Browse the source](https://github.com/fix8mt/fix8pro_example/tree/4960b3a7873d2f5492d4eae595467f71cc45e7d4)\n\nYou can read about all the available releases [`here`](https://github.com/fix8mt/fix8pro_example/releases).\n\n## To download\nThere are two branches: [`master`](https://github.com/fix8mt/fix8pro_example) (stable version)\nand [`dev`](https://github.com/fix8mt/fix8pro_example/tree/dev) (latest cutting edge).\n\nOptionally specify the `dev` branch when you clone:\n```bash\ngit clone https://github.com/fix8mt/fix8pro_example.git [-b dev]\ncd fix8pro_example\n```\n\n## Before you build\nYou will need the following to build this example:\n1. A supported [`C++17`](https://en.wikipedia.org/wiki/C%2B%2B17) compiler and build environment\n1. A Fix8Pro license from [`Fix8MT`](https://fix8mt.com/) (or an evaluation license)\n1. An installed Fix8Pro binary [package](https://www.fix8mt.com/releases), minimum version **22.03**\n\n## To build\nFor example assuming you have installed Fix8Pro to `/opt/fix8pro` and your license file is also in `/opt/fix8pro`:\n```bash\nmkdir build\ncd build\ncmake -DFIX8PRO_LICENSE_FILE=/opt/fix8pro/mylic.xml -DFIX8PRO_ROOT=/opt/fix8pro -DCMAKE_INSTALL_PREFIX=./ -DCMAKE_BUILD_TYPE=Release ..\nmake install\n```\n\n## To setup your run environment\n1. Add your Fix8Pro binary and library installation directories to your `$PATH` and `$LD_LIBRARY_PATH`.\nFor example, if you installed Fix8Pro to `/opt/fix8pro`:\n```bash\nexport PATH=$PATH:/opt/fix8pro/bin\nexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/fix8pro/lib\n```\n2. Set your `$FIX8PRO_LICENSE_FILE` environment variable.\nFor example, if your license file is in `/opt/fix8pro`:\n```bash\nexport FIX8PRO_LICENSE_FILE=/opt/fix8pro/mylic.xml\n```\n\n## CLI options\n\n\u003cdetails\u003e\u003csummary\u003e\u003ci\u003eThese options are defined in \u003c/i\u003e\u003ctt\u003eApplication::options_setup()\u003c/tt\u003e. \u003ci\u003eSome of the options are added by \u003c/i\u003e\u003ctt\u003eFix8ProApplication\u003c/tt\u003e.\u003c/summary\u003e\n\u003cp\u003e\n\n```bash\n% ./simpleclisrv -h\nFix8Pro sample client/server\nUsage:\n  simpleclisrv [OPTION...]\n\n  -b, --brownopts arg      set the Brownian options (drift,volume,lpf)\n                           parameters (default: 0.01,20.0,0.025)\n  -c, --config arg         xml config (default: simple_client.xml or\n                           simple_server.xml)\n  -d, --depth arg          use with market data mode, set maximum depth to\n                           request on subscription (default: 10)\n  -f, --refdata arg        specify alternate security reference data\n  -g, --giveupreset arg    number of reliable reconnects to try before\n                           resetting seqnums (default: 10)\n  -k, --capture arg        capture all screen output to specified file\n  -l, --log arg            global log filename (default:\n                           ./run/client_%{DATE}_global.log or ./run/server_%{DATE}_global.log)\n  -m, --marketdata         run in marketdata mode (default order mode)\n  -n, --numsec arg         maximum number of securities to use (default no\n                           limit) (default: 0)\n  -q, --quiet              do not print fix output\n  -r, --reliable           start in reliable mode (default: true)\n  -s, --server             run in server mode (default client mode)\n  -t, --states             show session and reliable session thread state\n                           changes (default: true)\n  -u, --summary            run in summary display mode\n  -C, --clientsession arg  name of client session profile in xml config to\n                           use (default: CLI)\n  -G, --generate           generate NewOrderSingle(client) or market\n                           data(server) messages (default: true)\n  -H, --showheartbeats     show inbound heartbeats (default: true)\n  -I, --interval arg       generation interval (msecs); if -ve choose random\n                           interval between 0 and -(n) (default: 5000)\n  -K, --tickcapture arg    capture all trade ticks to specified file\n  -L, --libpath arg        library path to load Fix8 schema object, default\n                           path or LD_LIBRARY_PATH\n  -P, --password arg       FIX password used in logon (cleartext) (default:\n                           password)\n  -R, --receive arg        set next expected receive sequence number\n                           (default: 0)\n  -S, --send arg           set next expected send sequence number (default:\n                           0)\n  -T, --threadname arg     prefix thread names with given string\n  -U, --username arg       FIX username used in logon (default: testuser)\n  -V, --serversession arg  name of server session profile in xml config to\n                           use (default: SRV)\n  -D, --debug              debug mode\n\n info options:\n  -h, --help          Help screen\n  -v, --version       Version\n  -0, --showcmdline   Show cmdline details\n  -5, --environment   Show FIX8PRO environment variable help; show env vars\n                      (debug mode)\n  -6, --dependencies  Show shared library dependencies\n  -7, --binaryreport  Show ABI, lib and binary info\n  -8, --appinfo       Show application banner and info\n\n history options:\n  -1, --history      Print command history; look in current directory or in\n                     $FIX8PRO_CMD_HIST_DIR; use $FIX8PRO_CMD_HIST_SIZE to set\n                     max history or 0 to turn off\n  -2, --invoke arg   Invoke given command by index (use -ve from last)\n  -3, --remove       Remove all history\n  -4, --interactive  Interactve mode, select/edit using bash-like commands,\n                     (? \u003center\u003e for help)\n\nexamples:\ncli/srv pair:\n   simpleclisrv -c config/simple_server.xml -s\n   simpleclisrv -c config/simple_client.xml\ncli/srv pair with supplied hash pw, random generation interval (~1s), base thread named, run server in summary mode:\n   simpleclisrv -sc ../config/simple_server.xml -P 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 -u -T clisrv\n   simpleclisrv -c ../config/simple_client.xml -I -1000 -P 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 -u -T clisrv\ncli/srv pair running in market data mode, load refdata from file, random generation interval (~1s), client depth 30 levels:\n   simpleclisrv -sc ../config/simple_server.xml -u -T clisrv -f ../config/sample_ref_data.csv\n   simpleclisrv -c ../config/simple_client.xml -I -1000 -u -T clisrv -d 30\n```\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n## To run\nThis example has been designed to run as two instances - a client and a server. For simplicity we'll run the test from the `./build` directory.\nBy default, the application runs in 'order mode'.\n\n### Run in Order Mode\nIn one terminal we'll run our server:\n```bash\n./simpleclisrv -c ../config/simple_server.xml -s\n```\nIn our other terminal we'll run our client:\n```bash\n./simpleclisrv -c ../config/simple_client.xml\n```\n- When connected, the client will send a `NewOrderSingle` every 5 seconds. The server will simulate an order accept and trade, sending back an acknowledgment followed by a random number of fills (`ExecutionReport`s).\n- From the client, press `l\u003center\u003e` to logout and shutdown, `q\u003center\u003e` to shutdown and `x\u003center\u003e` to just exit\n\n### Run in Market Data Mode\n```bash\n./simpleclisrv -c ../config/simple_server.xml -s -m\n```\nIn our other terminal run the client:\n```bash\n./simpleclisrv -c ../config/simple_client.xml -m\n```\n- When connected, the client will send a `SecurityListRequest`. The server will respond with a `SecurityList` message containing repeating groups of all available securities. The client will then randomly\nselect a sub-set of those securities and send `MarketDataRequest` messages subscribing to those securities. The server will then respond with `MarketDataIncrementalRefresh` and `MarketDataSnapshotFullRefresh` messages\nwhich will show incremental changes to a simulated order book, top of book and full market depth.\n- From the client, press `l\u003center\u003e` to logout and shutdown, `q\u003center\u003e` to shutdown and `x\u003center\u003e` to just exit\n\n## Securities\nThe default set of secutities used in both order and market data modes are hard coded in the application (the static `Instrument` table is show below). The values for each symbol are a reference price and the maximum quantity that can be ordered:\n```cpp\nconst Instruments SimpleSession::_staticdata\n{\n   { \"AAPL:NASDAQ\",  { 163.17,   50 } },  { \"MSFT:NASDAQ\",  { 289.86,   50 } },\n   { \"GOOG:NASDAQ\",  { 2642.44,  100 } }, { \"AMZN:NASDAQ\",  { 2912.82,  100 } },\n   { \"TSLA:NASDAQ\",  { 838.29,   120 } }, { \"MMM:NYSE\",     { 149.5,    120 } },\n   { \"FB:NASDAQ\",    { 200.06,   120 } }, { \"NVDA:NASDAQ\",  { 229.36,   120 } },\n   { \"UNH:NYSE\",     { 498.65,   120 } }, { \"JNJ:NYSE\",     { 169.48,   120 } },\n   { \"V:NYSE\",       { 200.29,   120 } }, { \"JPM:NYSE\",     { 134.40,   300 } },\n   { \"WMT:NYSE\",     { 142.82,   300 } }, { \"PG:NYSE\",      { 155.14,   300 } },\n   { \"XOM:NYSE\",     { 84.09,    300 } }, { \"HD:NYSE\",      { 324.26,   300 } },\n   { \"BAC:NYSE\",     { 40.95,    200 } }, { \"MC:NYSE\",      { 330.76,   200 } },\n   { \"CVX:NYSE\",     { 158.65,   200 } }, { \"PFE:NYSE\",     { 48.65,    200 } },\n};\n```\nYou can supply your own list of securities in CSV format (see `-f` option). A sample 100 US stocks is provided in the file `config/sample_ref_data.csv`, a sample is shown here:\n```\n# security, refprice, max order qty\nAAPL:NASDAQ,   163.17,  50\nMSFT:NASDAQ,   289.86,  50\nGOOG:NASDAQ,   2642.44, 100\nAMZN:NASDAQ,   2912.82, 100\nTSLA:NASDAQ,   838.29,  120\nMMM:NYSE,      149.5,   120\nFB:NASDAQ,     200.06,  120\nNVDA:NASDAQ,   229.36,  120\nUNH:NYSE,      498.65,  120\nJNJ:NYSE,      169.48,  120\nV:NYSE,        200.29,  120\nJPM:NYSE,      134.40,  300\nWMT:NYSE,      142.82,  300\nPG:NYSE,       155.14,  300\nXOM:NYSE,      84.09,   300\nHD:NYSE,       324.26,  300\nBAC:NYSE,      40.95,   200\nMC:NYSE,       330.76,  200\nCVX:NYSE,      158.65,  200\nPFE:NYSE,      48.65,   200\nABBV:NASDAQ,   161.89,  100\nLLY:NYSE,      291.42,  200\n```\n\n## Order Mode\nThis is the default mode for the client and server. After the client logs in and establishes a normal session, it will begin to send `NewOrderSingle` order messages from a randomly selected symbol.\n\nThe client generates orders using the following method:\n1. A security is randomly selected\n1. A randomly selected quantity is chosen, from 1 - maximum\n1. A randomly selected price is chosen, using the cauchy distribution (see notes below)\n1. `OrdType` is set to limit\n1. Randomly selected `HandlInst`, `TimeInForce` and `Side` are chosen\n\nThe server receives the order and responds using the following method:\n1. Orders are randomly accepted or rejected by an average of 4 to 1\n1. Fields are automatically copied from the inbound `NewOrderSingle` to the outbound `ExecutionReport` where legal\n1. For rejected orders, a randomly selected `OrdRejReason` is chosen and an order reject is sent\n1. For accepted orders, an order acknowledgement is sent\n1. Orders will randomly fill or rest by an average of 3 to 1\n1. For filled orders, the orders will completely fill immediately by an average of 1 in 4\n1. The remaining quantities are randomly filled by successive `ExecutionReport` messages until exhausted\n1. Each fill is also randomly assigned 1 to 12 `ContraBroker`s with a randomly chosen sub-quantity and `ContraTrader` ID in repeating groups\n\n## Market Data Mode\nThis mode simulates a market data service. After the client logs in and establishes a normal session, it will request a list of securities, subscribe to some and then receive market data updates continually from the server. The market data generated in this mode is not the same data generated in order mode.\n\nThis process is described below:\n\nThe client subscribes as follows:\n1. At startup or if resubscribe is triggered, the client sends a `SecurityListRequest`;\n1. A `SecurityList` is received, containing repeating groups of all available securities\n1. From a randomly selected sub-set of these securities, `MarketDataRequest` messages are sent; `SubscriptionRequestType::SnapshotAndUpdates` is chosen;\nthe default number of depth levels is set to 10. You can override this on the client command line with the `-d` option\n\nThe server operates as follows:\n1. When a `SecurityListRequest` is received the server responds with a `SecurityList` containing repeating groups of all available securities\n1. The server then generates prices continually for all subscribed securities using the same algorithm as Order Mode\n1. A `MarketDataSnapshotFullRefresh` is sent about 1 in 10 messages\n1. When `MarketDataSnapshotFullRefresh` is sent, about 1 in 2 are top of book (TOB) refreshes containing Best Bid/Volume, Best Offer/Volume, Open, High, Low, Close,\nLast/Volume, Total Volume, VWAP and Imbalance\n1. The other `MarketDataSnapshotFullRefresh` messages will be the full aggregated orderbook, containing all the depth levels up to the maximum requested (default 10)\n1. A `MarketDataIncrementalRefresh` is sent about 9 in 10 messages. Of these, about 1 in 4 will be cancels, the rest new orders\n1. When an order is generated a matching algorithm attempts to match out the order; remaining volume is then inserted into the orderbook\n1. Order cancels are applied directly to the orderbook\n1. After matching or cancelling orders, a difference algorithm generates a series of book deltas\n\n### About the orderbook and matching\n1. Each security has its own double sided aggregated orderbook. Bids are reverse sorted by price, asks are sorted by price.\nIndividual (unaggregated) orders are not maintained.\n1. Each price level holds the total accumulated order quantity and the total number of orders\n1. Matching occurs only when a new order is generated; orders are matched out from the top of the book, exhausting all available\nquantity at or below (above) the best bid or offer; matched quantities are subtracted from the available quantity; price levels are\nremoved when no quantity or order count remains\n1. Any remaining quantity not matched is inserted into the orderbook\n1. Only limit GTC orders are supported\n1. A 'daily' record is maintained for each security which contains Open, High, Low, Close, Last/Volume, Total Volume and Total Price Volume (TPV)\n1. VWAP and Imbalance are calculated when a `MarketDataSnapshotFullRefresh` TOB is sent using the TPV and best bid/offer quantities\n\n## About random numbers, distributions and generators used\nWe are using the following pseudo-random number generation functions provided by the standard library:\n1. [`std::mersenne_twister_engine`](https://en.wikipedia.org/wiki/Mersenne_Twister) engine (mt19937_64) seeded using the `std::random_device` (with optionally supplied implementation-defined token)\n1. [`std::uniform_int_distribution`](https://en.wikipedia.org/wiki/Discrete_uniform_distribution) is used to select random integers from a range\n1. [`std::uniform_real_distribution`](https://en.wikipedia.org/wiki/Discrete_uniform_distribution) is used to select random floating point numbers from a range\n1. [`std::bernoulli_distribution`](https://en.wikipedia.org/wiki/Bernoulli_distribution) is used to select a random boolean value with a specified probability\n\n### Prices\nPrices are generated using random numbers from the uniform real distribution. These are then put through a Brownian filter, described [here](https://en.wikipedia.org/wiki/Wiener_process). The parameters to this filter can be set from the command line.\n\n\u003ckbd\u003e ![Shows a tick chart for the symbol PEP:NASDAQ from prices generated by this application](assets/PEP_NASDAQ.png)\n  \u003cp\u003e\u003ci\u003eTick chart for the symbol PEP:NASDAQ from prices generated by this application, demonstrating the Brownian filter\u003c/i\u003e\u003c/p\u003e\n\u003c/kbd\u003e\n\nThe following parameters can be set on the command line:\n\n| Parameter | Description | Range | Default |\n| --------- | ----------- | ------| ------- |\n| drift | random amount to drift | 0.0 - 1.0 | 0.01 |\n| volume | amount of 'swing' | 0.0 - 50.0 | 20.0 |\n| lpf | low pass filter level | 0.0 - 1.0 | 0.025 |\n\nLarger _drift_ yields larger trends away from the reference price. Larger _volume_ has a similar effect. Lower _lpf_ creats more variability. You will need to experiemt to find the combination of the three to suit your purposes.\n\n## Runtime Interaction\nA simple command menu is provided where you can control certain aspects of the application.\n\n### As Server\n```\nl - logout\ns - toggle summary\nq - disconnect (no logout)\nx - just exit\ng - toggle generate (market data mode)\nQ - toggle quiet\nS - toggle states\n? - help\n```\n### As Client\n```\nl - logout and quit\nq - quit (no logout)\nx - just exit\ng - toggle generate (order mode)\nG - resubscribe (market data mode)\ns - toggle summary\nQ - toggle quiet\nS - toggle states\n? - help\n```\n### Command descriptions\n#### logout\nSends a `Logout` message, waits for a `Logout` reply. In server mode, the server will listen for a new connection; in client mode the application exits\n#### toggle summary\nToggles between summary mode and full message display mode. In summary mode a single line is displayed for each message or repeating group element\n#### disconnect\nCloses the session without sending a logout\n#### just exit\nExits the application without logout or closing the session\n#### resubscribe\nFrom the client in market data mode, unsubscribes and resubscribes to market data, randomly selecting a new set of securities\n#### toggle generate\nIn market data mode, toggles the generation of market data from the server; in order mode, toggles the generation of orders from the client\n#### toggle quiet\nToggles output; when client mode is on, no market data or order messages are displayed\n#### toggle states\nWhen enabled, the application will verbosely display session and reliable session states as they change\n\n## Misc Functions\n### Capture Screen Output\nPassing a filename with the `--capture` switch will cause the client (or server) to send a copy of all screen output to specified file. Note that screen escape sequences (such as colours, etc) will be filtered out.\n\n### Tick Capture\nPassing a filename with the `--tickcapture` will cause the server to save each tick to the specified file. Use in combination with `--numsec 1` to capture a single security's tick data.\n\n### Thread Naming\nPassing a name with the `--threadname` will cause the client or server to append the name to the OS thread name. This will allow you to identify the application threads and filter them by name for viewing (see example below).\n\n## Sample output\n\n### Server\n\n\u003cdetails\u003e\u003csummary\u003e\u003ci\u003eShows the server responding to a NewOrderSingle by sending an ExecutionReport.\u003c/i\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n\u003ckbd\u003e ![Shows the server responding to a NewOrderSingle](assets/example_server_detail.png)\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003ci\u003eShows the server sending and receiving messages (summary mode).\u003c/i\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n\u003ckbd\u003e ![Shows the server sending and receiving messages](assets/example_server_summary.png)\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n### Client\n\n\u003cdetails\u003e\u003csummary\u003e\u003ci\u003eShows the client receiving an ExecutionReport (verbose mode).\u003c/i\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n\u003ckbd\u003e ![Shows the client receiving an ExecutionReport](assets/example_client_detail.png)\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003ci\u003eShows the client sending and receiving messages (summary mode).\u003c/i\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n\u003ckbd\u003e ![Shows the client sending and receiving messages](assets/example_client_summary.png)\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003ci\u003eShows a reliable client attempting to reconnect, finally performing an automatic sequence reset and successfully connecting. Notice the state changes.\u003c/i\u003e\u003c/summary\u003e\n\n\u003cp\u003e\n\n\u003ckbd\u003e ![Shows a reliable client attempting to reconnect, finally performing an automatic sequence reset and successfully connecting](assets/example_client_reliable.png)\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n### Misc\n\n\u003cdetails\u003e\u003csummary\u003e\u003ci\u003eUsing thread naming and filtering with htop, showing client and server threads.\u003c/i\u003e\u003c/summary\u003e\n\u003cp\u003e\n\n\u003ckbd\u003e ![Thread naming and filtering](assets/example_htop.png)\n\n\u003c/p\u003e\n\u003c/details\u003e\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffix8mt%2Ffix8pro_example","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffix8mt%2Ffix8pro_example","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffix8mt%2Ffix8pro_example/lists"}