{"id":175877,"date":"2020-09-25T15:49:00","date_gmt":"2020-09-25T19:49:00","guid":{"rendered":"https:\/\/ibkrcampus.com\/trading-lessons\/customizing-market-data-functions\/"},"modified":"2023-04-25T20:51:36","modified_gmt":"2023-04-26T00:51:36","slug":"customizing-market-data-functions","status":"publish","type":"trading-lessons","link":"https:\/\/www.interactivebrokers.com\/campus\/trading-lessons\/customizing-market-data-functions\/","title":{"rendered":"Customizing Market Data Functions"},"content":{"rendered":"<p>In the previous lesson, we learned about various streaming and historical market data functions which allow pulling market data from the TWS. In this lesson, we will cover the structure of the real-time market data functions and learn to customize these functions.<\/p>\n<h4>In this lesson, you would:<\/h4>\n<ul>\n<li>Learn the structure of real-time market data functions<\/li>\n<li>Learn to customize the functions<\/li>\n<\/ul>\n<h3>Arguments to the Market Data Functions<\/h3>\n<p>The data functions like reqMktData, reqMktDepth, and reqRealTimeBars all have a special CALLBACK and EventWrapper arguments. By default, the CALLBACK argument calls the twsCALLBACK function from the IBrokers package.<\/p>\n<p>The arguments of the functions can be seen in the image below.<\/p>\n<p><img decoding=\"async\" class=\"size-medium wp-image-3427 aligncenter lazyload\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/01\/Screen-Shot-2020-09-29-at-2.50.19-PM.png\" alt=\"\" width=\"960\" height=\"293\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 960px; aspect-ratio: 960\/293;\"><\/p>\n<h3>twsCALLBACK Function<\/h3>\n<p>The twsCALLBACK function receives the header of each incoming message from the TWS. The header is then passed to the processMsg function along with the eWrapper object.<\/p>\n<p>The eWrapper object has functions to manage all the incoming message types from the TWS. Once the process Message call returns, another cycle of the infinite loop occurs.<\/p>\n<p>This can be understood from the internal code of the twsCALLBACK function shown below.<\/p>\n<p><img decoding=\"async\" class=\"size-medium wp-image-3428 aligncenter lazyload\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/01\/Screen-Shot-2020-09-29-at-2.52.05-PM.png\" alt=\"\" width=\"645\" height=\"540\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 645px; aspect-ratio: 645\/540;\"><\/p>\n<p>In this internal code, we can see that the incoming message gets stored in the curMsg variable which is passed to the processMsg function. This function is placed within the infinite while loop. Let us understand the processMsg function.<\/p>\n<h3>processMsg Function<\/h3>\n<p>The processMsg function internally is a series of if-else statements that branch according to a known incoming message type. Each message received will invoke the appropriately named eWrapper callback. This can be understood from the internal code of the processMsg function shown below.<\/p>\n<p><img decoding=\"async\" class=\"size-medium wp-image-3429 aligncenter lazyload\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/01\/Screen-Shot-2020-09-29-at-2.53.42-PM.png\" alt=\"\" width=\"612\" height=\"540\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 612px; aspect-ratio: 612\/540;\"><\/p>\n<p>In this internal code, we can see a series of if-else statements based on incoming message type and has a corresponding eWrapper function.<\/p>\n<h3>eWrapper Function<\/h3>\n<p>eWrapper is an R closure that contains a list of functions to manage all incoming message type. Each message has a corresponding function in eWrapper to handle the particular details of each incoming message.<\/p>\n<p>The eWrapper function creates an instance of eWrapper closure. By creating an instance of eWrapper we can then modify any or all the particular methods embedded in the eWrapper object.<\/p>\n<p>This image below shows the list of eWrapper methods. The listed methods can be modified for the rapid customization of incoming messages. The data environment is .Data, with accessor methods get.Data, assign.Data, and remove.Data.<\/p>\n<p><img decoding=\"async\" class=\"size-medium wp-image-3430 aligncenter lazyload\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/01\/Screen-Shot-2020-09-29-at-2.57.50-PM.png\" alt=\"\" width=\"960\" height=\"527\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 960px; aspect-ratio: 960\/527;\"><\/p>\n<h3>Customizing Data Function<\/h3>\n<p>Let us take an example to show how customization of data function works.<\/p>\n<p><img decoding=\"async\" class=\"size-medium wp-image-3431 aligncenter lazyload\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/01\/Screen-Shot-2020-09-29-at-2.59.03-PM.png\" alt=\"\" width=\"865\" height=\"540\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 865px; aspect-ratio: 865\/540;\"><\/p>\n<p>In this example, the codes shown in the green boxes modify the tws callback function. The code in the first green box assigns symbol names to the eWrapper data. The code in the second box, binds the data in a dataframe for easy readability.<\/p>\n<p>This modified twsCALLBACK function is named as \u201csnapShot\u201d and is used as an argument to the request Market data function.<\/p>\n<p>Let us now compare the data streams using the normal request market data function versus the modified function. On line 11, we run the normal request market data function. As can be seen the streaming data is not easily readable.<\/p>\n<p>Let us now look at the modified request market data function. On line 14, we first source the snapshot R file that contains the modified twsCALLBACK function named as snapshot.<\/p>\n<p>We run the request market data function with the snapshot function as the input to the CALLBACK argument of the request market data function.<\/p>\n<p><img decoding=\"async\" class=\"size-medium wp-image-3432 aligncenter lazyload\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/01\/Screen-Shot-2020-09-29-at-3.01.41-PM.png\" alt=\"\" width=\"960\" height=\"483\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 960px; aspect-ratio: 960\/483;\"><\/p>\n<p>As can be seen, the snapshot data output is more convenient to read than the normal output.<\/p>\n<p><img decoding=\"async\" class=\"size-medium wp-image-3433 aligncenter lazyload\" data-src=\"\/campus\/wp-content\/uploads\/sites\/2\/2023\/01\/Screen-Shot-2020-09-29-at-3.02.49-PM.png\" alt=\"\" width=\"960\" height=\"269\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 960px; aspect-ratio: 960\/269;\"><\/p>\n<p>Similar to this example, you can try different ways to customize the real-time market data functions based on your requirements.<\/p>\n<h3>Summary<\/h3>\n<p>In this lesson, we learnt the structure of real-time market data functions and saw how to customize the functions. You can try different ways to customize the data functions based on your requirements.<\/p>\n<p>Note \u2013 The IBrokers package provides native R access to Interactive Brokers Trader Workstation API<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this lesson, we will cover the structure of the real-time market data functions and learn to customize these functions.<\/p>\n","protected":false},"author":851,"featured_media":221440,"parent":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"contributors-categories":[13654],"traders-academy":[13126,13128,13132],"class_list":{"0":"post-175877","1":"trading-lessons","2":"type-trading-lessons","3":"status-publish","4":"has-post-thumbnail","6":"contributors-categories-quantinsti","7":"traders-academy-intermediate-trading","8":"traders-academy-level","9":"traders-academy-trading-lesson"},"pp_statuses_selecting_workflow":false,"pp_workflow_action":"current","pp_status_selection":"publish","acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Archives | Traders&#039; Academy | IBKR Campus<\/title>\n<meta name=\"description\" content=\"In this lesson, we will cover the structure of the real-time market data functions and learn to customize these functions.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.interactivebrokers.com\/campus\/wp-json\/wp\/v2\/trading-lessons\/175877\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Customizing Market Data Functions\" \/>\n<meta property=\"og:description\" content=\"In this lesson, we will cover the structure of the real-time market data functions and learn to customize these functions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.interactivebrokers.com\/campus\/trading-lessons\/customizing-market-data-functions\/\" \/>\n<meta property=\"og:site_name\" content=\"IBKR Campus US\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-26T00:51:36+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Customizing Market Data Functions\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\n\t    \"@context\": \"https:\\\/\\\/schema.org\",\n\t    \"@graph\": [\n\t        {\n\t            \"@type\": \"WebPage\",\n\t            \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/trading-lessons\\\/customizing-market-data-functions\\\/\",\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/trading-lessons\\\/customizing-market-data-functions\\\/\",\n\t            \"name\": \"Customizing Market Data Functions\",\n\t            \"isPartOf\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#website\"\n\t            },\n\t            \"primaryImageOfPage\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/trading-lessons\\\/customizing-market-data-functions\\\/#primaryimage\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/trading-lessons\\\/customizing-market-data-functions\\\/#primaryimage\"\n\t            },\n\t            \"thumbnailUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2020\\\/09\\\/mqdefault-7.jpg\",\n\t            \"datePublished\": \"2020-09-25T19:49:00+00:00\",\n\t            \"dateModified\": \"2023-04-26T00:51:36+00:00\",\n\t            \"description\": \"In this lesson, we will cover the structure of the real-time market data functions and learn to customize these functions.\",\n\t            \"breadcrumb\": {\n\t                \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/trading-lessons\\\/customizing-market-data-functions\\\/#breadcrumb\"\n\t            },\n\t            \"inLanguage\": \"en-US\",\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"ReadAction\",\n\t                    \"target\": [\n\t                        \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/trading-lessons\\\/customizing-market-data-functions\\\/\"\n\t                    ]\n\t                }\n\t            ]\n\t        },\n\t        {\n\t            \"@type\": \"ImageObject\",\n\t            \"inLanguage\": \"en-US\",\n\t            \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/trading-lessons\\\/customizing-market-data-functions\\\/#primaryimage\",\n\t            \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2020\\\/09\\\/mqdefault-7.jpg\",\n\t            \"contentUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2020\\\/09\\\/mqdefault-7.jpg\",\n\t            \"width\": 320,\n\t            \"height\": 180,\n\t            \"caption\": \"Customizing Market Data Functions\"\n\t        },\n\t        {\n\t            \"@type\": \"BreadcrumbList\",\n\t            \"@id\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/trading-lessons\\\/customizing-market-data-functions\\\/#breadcrumb\",\n\t            \"itemListElement\": [\n\t                {\n\t                    \"@type\": \"ListItem\",\n\t                    \"position\": 1,\n\t                    \"name\": \"Academy Lessons\",\n\t                    \"item\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/trading-lessons\\\/\"\n\t                },\n\t                {\n\t                    \"@type\": \"ListItem\",\n\t                    \"position\": 2,\n\t                    \"name\": \"Customizing Market Data Functions\"\n\t                }\n\t            ]\n\t        },\n\t        {\n\t            \"@type\": \"WebSite\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#website\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/\",\n\t            \"name\": \"IBKR Campus US\",\n\t            \"description\": \"Financial Education from Interactive Brokers\",\n\t            \"publisher\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\"\n\t            },\n\t            \"potentialAction\": [\n\t                {\n\t                    \"@type\": \"SearchAction\",\n\t                    \"target\": {\n\t                        \"@type\": \"EntryPoint\",\n\t                        \"urlTemplate\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/?s={search_term_string}\"\n\t                    },\n\t                    \"query-input\": {\n\t                        \"@type\": \"PropertyValueSpecification\",\n\t                        \"valueRequired\": true,\n\t                        \"valueName\": \"search_term_string\"\n\t                    }\n\t                }\n\t            ],\n\t            \"inLanguage\": \"en-US\"\n\t        },\n\t        {\n\t            \"@type\": \"Organization\",\n\t            \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#organization\",\n\t            \"name\": \"Interactive Brokers\",\n\t            \"alternateName\": \"IBKR\",\n\t            \"url\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/\",\n\t            \"logo\": {\n\t                \"@type\": \"ImageObject\",\n\t                \"inLanguage\": \"en-US\",\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/logo\\\/image\\\/\",\n\t                \"url\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/05\\\/ibkr-campus-logo.jpg\",\n\t                \"contentUrl\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2024\\\/05\\\/ibkr-campus-logo.jpg\",\n\t                \"width\": 669,\n\t                \"height\": 669,\n\t                \"caption\": \"Interactive Brokers\"\n\t            },\n\t            \"image\": {\n\t                \"@id\": \"https:\\\/\\\/ibkrcampus.com\\\/campus\\\/#\\\/schema\\\/logo\\\/image\\\/\"\n\t            },\n\t            \"publishingPrinciples\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/about-ibkr-campus\\\/\",\n\t            \"ethicsPolicy\": \"https:\\\/\\\/www.interactivebrokers.com\\\/campus\\\/cyber-security-notice\\\/\"\n\t        }\n\t    ]\n\t}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Archives | Traders' Academy | IBKR Campus","description":"In this lesson, we will cover the structure of the real-time market data functions and learn to customize these functions.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.interactivebrokers.com\/campus\/wp-json\/wp\/v2\/trading-lessons\/175877\/","og_locale":"en_US","og_type":"article","og_title":"Customizing Market Data Functions","og_description":"In this lesson, we will cover the structure of the real-time market data functions and learn to customize these functions.","og_url":"https:\/\/www.interactivebrokers.com\/campus\/trading-lessons\/customizing-market-data-functions\/","og_site_name":"IBKR Campus US","article_modified_time":"2023-04-26T00:51:36+00:00","twitter_card":"summary_large_image","twitter_title":"Customizing Market Data Functions","twitter_misc":{"Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.interactivebrokers.com\/campus\/trading-lessons\/customizing-market-data-functions\/","url":"https:\/\/www.interactivebrokers.com\/campus\/trading-lessons\/customizing-market-data-functions\/","name":"Customizing Market Data Functions","isPartOf":{"@id":"https:\/\/ibkrcampus.com\/campus\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/trading-lessons\/customizing-market-data-functions\/#primaryimage"},"image":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/trading-lessons\/customizing-market-data-functions\/#primaryimage"},"thumbnailUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2020\/09\/mqdefault-7.jpg","datePublished":"2020-09-25T19:49:00+00:00","dateModified":"2023-04-26T00:51:36+00:00","description":"In this lesson, we will cover the structure of the real-time market data functions and learn to customize these functions.","breadcrumb":{"@id":"https:\/\/www.interactivebrokers.com\/campus\/trading-lessons\/customizing-market-data-functions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.interactivebrokers.com\/campus\/trading-lessons\/customizing-market-data-functions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.interactivebrokers.com\/campus\/trading-lessons\/customizing-market-data-functions\/#primaryimage","url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2020\/09\/mqdefault-7.jpg","contentUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2020\/09\/mqdefault-7.jpg","width":320,"height":180,"caption":"Customizing Market Data Functions"},{"@type":"BreadcrumbList","@id":"https:\/\/www.interactivebrokers.com\/campus\/trading-lessons\/customizing-market-data-functions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Academy Lessons","item":"https:\/\/ibkrcampus.com\/campus\/trading-lessons\/"},{"@type":"ListItem","position":2,"name":"Customizing Market Data Functions"}]},{"@type":"WebSite","@id":"https:\/\/ibkrcampus.com\/campus\/#website","url":"https:\/\/ibkrcampus.com\/campus\/","name":"IBKR Campus US","description":"Financial Education from Interactive Brokers","publisher":{"@id":"https:\/\/ibkrcampus.com\/campus\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ibkrcampus.com\/campus\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ibkrcampus.com\/campus\/#organization","name":"Interactive Brokers","alternateName":"IBKR","url":"https:\/\/ibkrcampus.com\/campus\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/logo\/image\/","url":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/05\/ibkr-campus-logo.jpg","contentUrl":"https:\/\/www.interactivebrokers.com\/campus\/wp-content\/uploads\/sites\/2\/2024\/05\/ibkr-campus-logo.jpg","width":669,"height":669,"caption":"Interactive Brokers"},"image":{"@id":"https:\/\/ibkrcampus.com\/campus\/#\/schema\/logo\/image\/"},"publishingPrinciples":"https:\/\/www.interactivebrokers.com\/campus\/about-ibkr-campus\/","ethicsPolicy":"https:\/\/www.interactivebrokers.com\/campus\/cyber-security-notice\/"}]}},"_links":{"self":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/trading-lessons\/175877","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/trading-lessons"}],"about":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/types\/trading-lessons"}],"author":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/users\/851"}],"replies":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/comments?post=175877"}],"version-history":[{"count":0,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/trading-lessons\/175877\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/media\/221440"}],"wp:attachment":[{"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/media?parent=175877"}],"wp:term":[{"taxonomy":"contributors-categories","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/contributors-categories?post=175877"},{"taxonomy":"traders-academy","embeddable":true,"href":"https:\/\/ibkrcampus.com\/campus\/wp-json\/wp\/v2\/traders-academy?post=175877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}