User interface panels
For setting up strategy parameters, triggering actions, or displaying
something, the following elements are available:
- The sliders for entering or displaying
- the [Result] button that can be redefined by
- the [Action]
scrollbox for displaying or selecting items or triggering script functions,
- and a control panel with user-defined buttons, switches, displays, entry fields,
and spreadsheet lists (Zorro S or executable
The control panel can be created by script or
with Excel™. The panel is a rectangular grid of multi-purpose cells, similar to a
spreadsheet. Every cell can display text, numbers, or a color, and can serve as a numeric or text input field or as a push, toggle, radio, or spin button. With this concept, even complex control functions for commercial strategies can be realized in a simple way. Such a control panel does not look particularly pretty, but it's functional:
A panel can have a virtually unlimited number of rows and
columns. If there are more than fit on the screen, the panel can be scrolled
with scrollbars on the right and bottom side. Header rows or columns can be
defined that stay fixed when the rest of the panel scrolls. This way, individual
asset parameters can be set up or displayed for multi-asset strategies. An
example of a scrolling panel with thousands of rows can be found in the
The following functions can be used for defining and handling a
control panel or for populating the [Action]
panel (int rows, int columns, int color, int size)
Opens an empty control panel with the given number of rows and columns, background color, and horizontal cell size in pixels. If a control panel was already open, it is replaced by the new one. The panel is opened next to the Zorro window, and can be freely moved by dragging it with the mouse. If the number of rows or columns exceed the screen size, scrollbars are added to the panel.
panel(0,0,0) removes the panel.
panel (string filename, int color, int size)
As above, but loads a control panel from a .csv spreadsheet file. Every cell of the panel is set up from the corresponding spreadsheet cell. The cells in the file are separated with ; or ,
delimiters. Every row must end with a new line character. The following control characters in the cell content have a special meaning: !... - cell is a button; #... - cell can be edited; @ - merge the cell with the next not-empty cell to the left. The default colors are grey for text cells, red for numbers,
white for editable cells, and blue for buttons; they can be changed with the ColorPanel variables.
CSV delimiters and control characters must otherwise not appear in
cell content. For still displaying them, the cell content can be set with
panelSet() after loading the panel. Examples of spreadsheet-generated panels can be found in the Strategy
panelSet (int row, int col, string text, int color, int style, int type)
Set properties or update content of an individual cell.
row - row number starting with 0, or -1 for the [Result] button,
or -2 for the [Action] scrollbox.
column number starting with 0, or line number in the [Action]
text - content to appear in the cell, button, or scrollbox line, or 0 for not changing the content. Numbers can be converted to text with strf.
color - background color of the cell, or 0 for
not changing the color.
style - 1 normal text, 2 highlighted text, 3 greyed-out text,
+4 right-aligned, +8 left-aligned, +12 centered,
+16 bold, or 0 for not changing the style.
type - 1 normal cell, 2 editable cell, 4 button, 0 for not changing the type.
If row is -2 and type is nonzero, the
text is selected in the [Action]
Default colors are stored in ColorPanel[n], where n = 0
for text background, 1 for number background, 2
for an editable field, 3 for a button, 4 for
highlighted text, 5 for greyed out text.
panelGet (int row, int col): string
Returns a temporary string with the current content of the cell. Numbers can be converted from the returned string with sscanf, atof, or atoi.
panelMerge(int Row, int Col, int NumRows, int NumCols)
Merges the given area of the panel to a single cell, with the content of the
first cell. Row / Col is the upper left corner
and NumRows / NumCols the size.
panelFix(int NumRows, int NumCols)
Gives the number of header rows and columns that stay fixed on a scrolling
panel. Header cells cannot be merged.
panelSave (string Filename)
Saves the panel content in .csv format to the given
FileName, or to "Data\*.pan" when the name is empty or
panelLoad (string Filename)
Loads the saved panel content in .csv format from the given
FileName, or from "Data\*.pan" when the name
is empty or zero. Only editable or button cells are affected.
click(int Row, int Col)
User-supplied function that is triggered by the following GUI actions:
- mouse click
on a button cell,
- entering a number or editing a cell,
clicking the [Result] button (Row =
- selecting a previously set action from the [Action]
scrollbox (Row = -2).
- selecting an asset with the [Asset]
scrollbox (Row = -3; asset name in
Dependent on the desired behavior of the button, the function can then change the cell color or content through
and/or save the panel content with panelSave().
- Control panels can only be created with Zorro S, but can be included in executable strategies (.x files) and
can then also be used with the free Zorro version.
- Even without a panel, the [Result] button and the
[Asset] and [Action] scrollboxes can trigger the click function.
If this is unwanted, filter out clicks with negative row values.
- Text on the panel caption bar can be displayed with print(TO_PANEL,...).
- The panel stays open after the end of the strategy unless it is explicitely removed either with
panel(0,0,0,0), or by clicking [Edit], or by selecting a new script. As long as it is open, it can still be edited and can even trigger functions when clicked on. For preventing that functions are triggered when the script is not running, check the
RUNNING flag. For keeping the previous panel content when the strategy is restarted, call
panel() or panelLoad() only when both the
INITRUN and the CHANGED flags are set.
- !! The click function is a separate process and not in
sync with with the run or tick functions.
Therefore, do not change the asset, send broker commands, or modify
global variables directly in the click function, because
this can interfere with other
functions and with the rest of your script. Always use call(1,....) for critical
operations inside a click function. See example below.
- The [Action] scrollbox keeps its state after
the end of the strategy unless it is explicitely removed at the end with
panel(0,0,0,0). By clicking [Edit]
or by selecting a new script, the scrollbox is reset to the default actions. The selection
state of the scrollbox can be saved in an AlgoVar and
restored at the start of the strategy; for this use the panelSet
function with the type parameter at 1 for
the selected item.
Examples: (see also Download.c, History.c, PanelTest.c)
// click function example
function click(int row,int col)
if(!is(RUNNING)) return; // prevent clicks after the end of the script
if(row < 0) return; // prevent clicks by result button or scroll box
string Text = panelGet(row,col);
if(Text == "Buy") // toggle button between "Buy" and "Sell"
else if(Text == "Sell")
else if(Text == "Close All") // push button to close all trades
else if(Text == "Enter Trade") // push button to enter position
else if(Text == "Cancel") // back to last saved state
// Entering a code number
int Code = 0;
void click(int row,int col)
Code = atoi(panelGet(0,0));
Code = 0;
print(TO_PANEL,"Enter your code number");
// Start a program via Action scrollbox
void click(int row,int col)
if(row == -2 && col == 0) // first action line
sliders, wait, user supplied functions, ColorPanel
► latest version online