Est. 1990 Beginner

Tibco MarketSheet Script

MarketScript was the postfix command language embedded in MarketSheet, the real-time trading-room display product built by Teknekron Software Systems (later TIBCO) around 1990. Traders wrote scripts like INDU find select red fill on buttons and price alerts to recolour, hide, move and navigate the live market-data sheets on their screens; it had no arithmetic, no variables and no control flow, and it survives today almost entirely inside a patent

Created by Teknekron Software Systems, Inc. of Palo Alto, California, the company Vivek Ranadive founded in 1985 to build The Information Bus and which became TIBCO. MarketScript was not designed as a language in its own right and no designer is named for it anywhere; it is the scripting facility of one application, MarketSheet, whose invention is credited in the US patent to Jeffrey S. Risberg

Paradigm Imperative and postfix. A script is a whitespace-separated sequence of words in which operands precede their verb, so a script reads as a sentence: INDU find select red fill. Execution is a straight left-to-right walk with no branches, no loops and no expressions. It is also emphatically event-driven and stateful in a way most command languages are not: scripts are attached to buttons and to price-alert transitions, and almost every verb acts implicitly on a selection set that earlier words in the same script established
Typing None. Every operand is a bare word or a quoted string - an object name, a class name, a colour name, an integer, a geometry such as <xXy>, or a UNIX command line - and the verb decides how to read it. There are no variables, no values that a script can compute, and nothing that a script can return
First Appeared Around 1990. The language is described in full, under the name MarketScript, in the patent application filed on 28 December 1990 that became EP 0 564 548 B1, and the manual text embedded in that application documents MarketSheet versions 2.1 and 2.2 - so the product was already two major versions old by then. The earliest priority in the family is 27 July 1989. Catalogues that date this entry to the 2000s are placing it a decade or more too late, apparently by dating it from the TIBCO brand (adopted in 1996) rather than from the software
Latest Version Unknown, and probably unknowable. MarketScript was never released, versioned, priced or documented separately from MarketSheet; the only version numbers ever attached to it in public are the host product's own, MarketSheet 2.1 and 2.2 as of the 1990 filing, with a source file named ms23.c in the build listing hinting at a 2.3. The product was still being sold as Marketsheet for Windows in the late 1990s, but no manual, release note or download from that era is public

MarketScript is the scripting language nobody set out to write. It is the macro facility of MarketSheet, the real-time display application that Teknekron Software Systems - later TIBCO - put on trading-room screens from around 1990, and it exists for one reason: a trader who had spent an afternoon laying out a sheet of live quotes wanted a button that would turn all the Dow Industrials red.

It is genuinely a language, with a documented grammar, a named command set, a user-extensible glossary and an interpreter of its own in a file called script.c. It is also almost invisible. It was never sold, never versioned, never given a manual of its own, and never escaped the product it lived in. Practically everything anyone can now say about it comes from a single unlikely source: a patent that quotes the MarketSheet 2.1/2.2 user manual at length, including the four pages that document the scripting language.

What MarketSheet was

To understand the language you have to understand the screen it drove.

In 1990 a trading floor was a wall of dedicated terminals - the “green screens” - each one wired to a single vendor’s feed and each one showing what that vendor decided it should show. Teknekron’s pitch, built on The Information Bus, was subject-based addressing: an application asks for “long bond yield” and the middleware works out which service on which server currently publishes it. As the patent puts it, if the source of the information changes, “users need not change their screens and programmers need not change their programs.”

MarketSheet was the client that cashed that promise in. It gave a trader a blank sheet and a toolbox, and the tools created what the patent calls Active Objects:

ToolWhat it puts on the sheet
LabelStatic text; annotations, sheet titles, hand-written help screens
QuoteA live issue, in styles from “brief” (price only) to comprehensive
TickerA selective or block ticker, upticks and downticks in colour
Page fragmentAny rectangle clipped out of a page-based feed such as Telerate or Reuters
Time-based graphPrice against time, axes scalable to minutes or seconds and to 1/8 or 1/32 of a dollar
Data-set graphMultiple instruments at once - a yield curve, for instance
TablePosition blotters, currency lookup tables
PublisherPublishes the user’s own numbers back onto the network for other desks
ButtonRuns a script

A file was a stack of such sheets, one visible at a time. Everything about an object’s appearance - pen, fill, border, font, position, size, visibility - was a property, and everything a user could do through a menu, a script could do too. That is the whole design of the language in one sentence.

The language

A script is a sequence of words, whitespace-separated, read strictly left to right. Operands come before the verb they belong to. The manual describes a script as being entered “as a sentence”, and the examples read like one:

Governments find sheet

Find the sheet named Governments and show it. Compare doing it by hand: open the index dialog, scroll the list, select the entry.

next sheet next sheet

Advance two sheets. There is no loop construct and no repeat count, so you repeat the phrase.

INDU find select red fill

Select every object named INDU and fill it red. This is the shape of most real scripts: a selection phrase, then one or more editing verbs that act on whatever the selection phrase left selected.

Selection

Almost every verb is implicitly about “the selected items”, and a script builds that selection itself:

PhraseEffect
all selectevery object on the current sheet
none selectnothing
self selectthe object that is running this script
<item_name> find selectevery object carrying that name
<class name> class selectevery object of that class, e.g. Quote class select
<region bounds> region selecteverything inside a region

Names are the key idea, and they are deliberately not the same thing as displayed text: the manual is explicit that “the name of a label, for instance, is different from the text shown by the label.” Names are also not unique. Tag ten quote objects INDU and five UTIL, and INDU find select addresses the first ten as a group. The same trick works for sheets - duplicate sheet names are explicitly allowed so that repeated find sheet calls will walk a series.

Verbs

The documented command set is small enough to list, and its boundaries are revealing:

  • Restacking and visibility: front, back, hide, show, toggle visibility, clear highlight
  • Appearance: <color_name> pen, <color_name> fill, <color_name> borderColor, <integer> borderWidth
  • Geometry: <xXy> move, <dxXdy> move, <widthXheight> size, <dwidthXdheight> rsize, <x> alignLeft, <x> alignRight, <y> alignTop, <y> alignBottom
  • The sheet itself: <color_name> background, on gridLines, off gridLines, toggle gridLines
  • Navigation: next sheet, <name> find sheet and their relatives
  • Environment: on toolBox, off toolBox, toggle toolBox, and the same three for gridTool
  • Execution: beep, <milliseconds> pause, and <UNIX command> execute

Note what is not there. No arithmetic. No comparison. No variables. No conditionals. No user-defined procedure with parameters. A MarketScript script cannot read a price, cannot compute anything from one, and cannot decide anything. It can only do things, and the deciding is done elsewhere.

Where the deciding happens

The deciding happens in the alert machinery, and this is what makes MarketScript more interesting than a keyboard-macro recorder. Every quote object is a two-state machine - normal and alert - with a user-set upper and lower limit on a chosen field, and it carries four scripts rather than one:

  • normal update - runs on each tick that does not breach a limit
  • begin alert - runs on the tick that breaches one, moving the object into the alert state
  • alert update - runs on each subsequent tick while still breached
  • end alert - runs on the tick that comes back into range, and is followed by the normal update script

Graph objects get a two-script version of the same idea, with the alert triggered when the plot line leaves a channel drawn between two trend lines.

So the conditional logic is declarative and lives in the dialog box; the script is purely the consequent. It is a clean separation, arrived at by a product team rather than a language designer, and it is why the language could get away with having no if.

Syntax rules, in full

The manual’s SCRIPTING NOTES section is four paragraphs long and effectively constitutes the rest of the specification:

  • Commands are case-sensitive and “must be entered exactly as shown.”
  • Any item name, sheet name, command or colour name containing a space must be quoted. Single or double quotes both work, and each can contain the other.
  • All geometry is in pixels. The manual offers the calibration that there are “roughly 80 pixels per inch on a workstation screen.”
  • The selection is saved on entry to a script and restored on exit - because scripts fire on price updates at unpredictable moments and must not steal the selection out from under a user who is mid-edit. As a consequence, a script that opens with all select does not need to close with none select.

That last rule is a small piece of real language design. It is a dynamic-extent save/restore of the one piece of global state the language has, motivated entirely by the fact that this language’s programs run concurrently with the user’s own editing.

Escaping the sandbox

Two features give MarketScript far more reach than its command list suggests.

The first is execute, which runs a UNIX command in the background. The patent is enthusiastic about what this bought clients: alert scripts could perform operations “such as changing a color, flashing an object, sounding an audible alarm or executing an external program”, and “the latter capability provides great flexibility by enabling clients to program features such as the ability to telephone a beeper service when an alert occurs.” A bond desk in 1990 could wire a limit breach to a pager. The patent also notes that a scripted command sequence “can also include commands to the operating system, the network communication software and other processes running on the same host or elsewhere on network.”

The second is the glossary, described twice in the patent: a facility “whereby the user can define new commands and add them to the script language”, and which also lets users customise the menus. No syntax for it is given anywhere, and this is the single largest gap in what survives. A user-extensible word set in a postfix language is exactly the Forth arrangement, and if the glossary was as general as the sentence implies, MarketScript was a considerably more serious language than its documented command table shows. There is no way now to find out.

Buttons as hypertext

The other thing MarketScript was for is navigation, and the patent describes it in terms that were not yet ordinary in 1990: buttons “allow creation of hypertext links between different sheets”, the worked example being a link from a security to its options pricing. Buttons came in rectangular, rounded, shadow, check box and radio button styles - the last two for grouped buttons - and because the left mouse button ran the script, you had to use the middle or right button to open a button’s own dialog and edit it.

The idiom the manual teaches for building a detail overlay is a fair sample of how the whole thing felt in practice. Put a set of explanatory labels on the sheet, bring them to the front, give them all the name DETAIL, and then make two buttons:

DETAIL find select show
DETAIL find select hide

That is a show/hide toggle on a real-time financial dashboard, built by a trader, in eight words, in 1990.

Why it disappeared

MarketScript’s fate was never in its own hands. The chronology is corporate throughout: Reuters agreed to buy Teknekron Software Systems in December 1993 for a reported $125 million, a sale other accounts date to 1994; the company was renamed TIBCO in or around 1996; in January 1997 it split, with TIBCO Software taking the middleware toward its 1999 IPO and TIBCO Finance Technology keeping the financial desktop. MarketSheet went with the finance half. TIBCO Software’s own S-1 lists TIB/Rendezvous, TIB/ObjectBus, TIB/MessageBroker, TIB/IntegrationManager and the rest of the TIB/ActiveEnterprise suite; MarketSheet is not in it.

On the Reuters side, Marketsheet spent the late 1990s in a straight fight with Reuters’ own Kobra and with Bridge Information Systems’ Bridge Active1 - Waters called it a “display application war” in January 1999 - and it was competing against a sister product inside its own parent company. Kobra won: it shipped as the client software of the Reuters 3000 Xtra terminal, released in 1999, and the trading-room desktop consolidated there. MarketSheet was not so much killed as absorbed, which is why there is no end-of-life notice to point at.

The language went with it. Nothing was open-sourced, no clone was written, no successor borrowed the syntax, and no MarketSheet binary or sheet file is publicly available. Language catalogues that carry an entry for “Tibco MarketSheet Script” generally date it to the 2000s, which is a decade or more late and comes from dating the TIBCO brand rather than the software.

Why it matters

MarketScript is worth a page for three reasons, none of them about influence.

It is a clean specimen of the embedded application language. Not a general-purpose language cut down, and not a DSL designed from a semantics outward, but a language that grew because a graphical product had a command set and someone realised the command set could be typed as well as clicked. HyperTalk, spreadsheet macro languages, AutoLISP and the whole lineage of in-app scripting come from the same pressure. MarketScript shows that pressure operating in an unusually constrained corner - financial market data on X11 workstations - and arriving at a Forth-shaped answer without, so far as anyone can tell, meaning to.

Its division of labour is instructive. By putting the predicate in a dialog box and the consequent in a script, MarketSheet let a language with no conditionals drive genuinely reactive behaviour. That is the same bargain made by CSS media queries, by spreadsheet conditional formatting, and by every rules engine with a form-based condition editor. It is also why the language could stay small enough for a trader to learn between the open and the close.

Its survival is an object lesson in the archaeology of software. MarketScript ran on trading desks at named global banks - Teknekron’s software as a whole was reportedly on more than 10,000 of them - and left essentially nothing behind - no source, no binary, no manual, no mailing list, no newsgroup thread. What preserved it was a lawyer’s decision, some time in 1990, to paste the user manual into a patent application in order to satisfy the enablement requirement. Patent databases turn out to be one of the better archives of vanished commercial software, precisely because they are full of documents whose authors had a legal incentive to explain exactly how the thing worked.

Timeline

1985
Vivek Ranadive founds Teknekron Software Systems, Inc. with startup capital from Teknekron Corp. Its product is The Information Bus (TIB), a publish-and-subscribe messaging layer that lets a trading floor add a market-data feed without rewriting its applications, and add applications without touching its feeds. Everything MarketScript later does is downstream of that idea: a script never names a price source, only a subject
1989
27 July: the earliest priority date in the patent family for the MarketSheet "active document" - the display in which a trader assembles quotes, tickers, page fragments, graphs, tables and buttons on freely laid-out sheets of their own design. The US patent, 5,339,392, names Jeffrey S. Risberg as inventor and issues on 16 August 1994
1990
28 December: US application 07/636,044 is filed. Its description embeds the MarketSheet 2.1/2.2 user manual essentially verbatim, and with it the first and only public specification of the scripting language, named there as "the MarketScript command language". The manual is candid about its audience: "The script facility in MarketSheet is primarily for advanced users, so only a brief introduction will be given here." The application also lists the program's build: a widget library called Strata built on X11R3 from the MIT X Consortium, then MarketSheet itself against Strata, the TIB API libraries and X - with script.c holding the interpreter
1991
20 December: PCT/US1991/009811 is filed, carrying the same manual text into the international system. It is granted in Europe as EP 0 564 548 B1 on 17 September 1997, and that grant is the reason any description of MarketScript survives at all - the manual it quotes has never surfaced anywhere else
1993
December: Reuters Holdings PLC agrees to acquire Teknekron Software Systems for a reported $125 million, according to the International Directory of Company Histories; other accounts, including Wikipedia and a 2013 Wired profile of Ranadive, date the sale to 1994, which is presumably when it closed. By this point the International Directory of Company Histories puts the software on more than 10,000 desktops worldwide within five years of launch, at firms including Salomon Brothers, Goldman Sachs, Fidelity and J.P. Morgan. MarketSheet is the face of that installed base; MarketScript is what the traders' buttons are wired with
1994
4 February: Waters reports that Fidelity Investment Services, a long-standing user of Teknekron's UNIX market-data platforms, is beta-testing Marketsheet for Windows - the PC port of the workstation software. The X11-and-Motif world the 1990 manual describes, with its Sun keyboard R9 and R1 keys standing in for Page Up and Page Down, starts giving way here
1996
5 February: Waters reports that ABN Amro Bank has standardised on the TIB and on Teknekron's Marketsheet display software, to be installed at nine sites internationally covering 1,400 dealing positions. In the same year, according to the International Directory of Company Histories, Teknekron Software Systems is renamed TIBCO Inc - though Wikipedia instead dates the founding of TIBCO as a Reuters subsidiary to 1997, so the exact moment the name changed is not firmly established
1997
January: TIBCO Inc. splits in two. TIBCO Software Inc., under Ranadive, takes the middleware to the wider enterprise market; TIBCO Finance Technology Inc. keeps the financial desktop, and with it MarketSheet. On 20 October, Waters reports Morgan Stanley evaluating four off-the-shelf trading workstations for its equities desks in New York and London - Dow Jones Markets' Active1, Bridge Information Systems' Bridgestation, Tibco's Marketsheet for Windows, and Reuters' Kobra
1998
30 November: Waters reports Tibco demonstrating a Marketsheet that shows news drawn from web sites alongside live market data. The active document is being pushed toward the browser era; the scripting model underneath, so far as anything public shows, is not being pushed anywhere
1999
4 January: Waters frames the coming year as a "display application war" among Tibco's Marketsheet, Reuters' Kobra and Bridge Information Systems' Bridge Active1. On 27 May, TIBCO Software Inc. files its IPO registration statement with the SEC; its product list - TIB/Rendezvous, TIB/ObjectBus, TIB/MessageBroker, TIB/IntegrationManager, the TIB/ActiveEnterprise suite - contains no MarketSheet at all. The language and the company that made famous the technology under it have, by this point, formally parted company
2000
Reuters' trading-room desktop strategy consolidates, so far as the public product record shows, on the Kobra client software, which shipped as the front end of the Reuters 3000 Xtra terminal released in 1999 and supported until the end of 2013. No document fixes this shift to a particular date, so 2000 is an approximation. Marketsheet has no comparable public history after this point: no release, no manual, no download and no end-of-life announcement is on the record, which is the ordinary fate of an in-house display product absorbed by its parent's own terminal

Notable Uses & Legacy

ABN Amro Bank

Standardised on the Teknekron Information Bus and Marketsheet display software across nine sites internationally, covering 1,400 dealing positions, under a contract being finalised when Waters reported it on 5 February 1996. Its Chicago operation, the bank's US headquarters, had gone first roughly two years earlier. This is the largest named MarketSheet deployment in the public record

Fidelity Investment Services

A long-time user of Teknekron's UNIX-based digital market-data distribution platforms, and the named beta site for Marketsheet for Windows when Waters reported the PC port on 4 February 1994

Morgan Stanley

Reported by Waters on 20 October 1997 to be reviewing Marketsheet for Windows against three competing trading workstations for its equities traders and analysts in New York and London - a firm that had, in the same report's words, long prided itself on proprietary trading room solutions. What it eventually chose is not on the record; the significance is that by 1997 Marketsheet was one of four packages a bulge-bracket desk would seriously shortlist

Salomon Brothers, Goldman Sachs and J.P. Morgan

Named by the International Directory of Company Histories among the firms running Teknekron's software, which was on more than 10,000 desktops worldwide within five years of launch. The directory names the firms and the product line together rather than tying each firm to MarketSheet specifically, so this is best read as the shape of the installed base rather than as four confirmed MarketSheet sites

Alert automation on the trading floor

The use the language was actually built for, described in the manual rather than in any customer story: a quote object carries four scripts - begin alert, alert update, end alert, and normal update - which fire as a price crosses a limit and crosses back. Minimally such a script beeps and inverts a colour. The patent notes that because a script can invoke an external program, clients used this to do things like telephone a beeper service when an alert fired, which in 1990 was about as close to a mobile push notification as a bond desk could get

Running Today

Run examples using the official Docker image:

docker pull
Last updated: