univer.ua

Раздел 8: 8.12.3 - 8.24

8.13 Функции для получения значений Окна котировок 
8.14 Функции для получения значений Таблицы лимитов по бумагам 
8.15 Функции для получения значений Таблицы лимитов по денежным средствам 
8.16 Функции расчета маржинальных позиций 
8.17 Функции получения значений таблиц «Клиентский портфель» и «Купить/Продать» 
8.18 Функции для работы с файлами 
8.19 Функции для работы со строками 
8.20 Функции для работы с графиками 
8.21 Функции для работы с заявками 
8.22 Функции для работы с метками 
8.23 Сервисные функции 
8.24 Отладка программ QPILE 
ПРИЛОЖЕНИЕ 1. Синтаксис команд языка QPILE 
ПРИЛОЖЕНИЕ 2. Рекомендации к составлению программ на QPILE 

8.12.3 Значения параметров функций

Список возможных кодов классов ценных бумаг «classcode_list»:



Список возможных идентификаторов параметров:






Список идентификаторов дополнительных параметров, доступных для функции GET_PARAM_EX:




8.13 Функции для получения значений Окна котировок

8.13.1 GET_QUOTES_II_LEVEL_DATA

Функция предназначена для получения значений котировок инструментов. С помощью этой функции можно получить данные из Таблицы котировок для заданных кодов класса и бумаги.

MAP GET_QUOTES_II_LEVEL_DATA (STRING ClassCode, STRING SecCode)

Возвращаемый «MAP» имеет следующую структуру:



Коллекции «BID» и «OFFER» имеют следующую структуру:



8.14 Функции для получения значений Таблицы лимитов по бумагам

Функции предназначены для получения значений таблицы для заданного кода клиента, кода фирмы, кода бумаги и счета депо.

8.14.1 DEPO_OPEN_BALANCE

Возвращает значение «Входящего остатка по бумагам».

DEPO_OPEN_BALANCE (STRING client_code, STRING firmid, STRING seccode, STRING account)

8.14.2 DEPO_OPEN_LIMIT

Возвращает значение «Входящего лимита по бумагам».

DEPO_OPEN_LIMIT (STRING client_code, STRING firmid, STRING seccode, STRING account)

8.14.3 DEPO_CURRENT_BALANCE

Возвращает значение «Текущего остатка по бумагам».

DEPO_CURRENT_BALANCE (STRING client_code, STRING firmid, STRING seccode, STRING account)

8.14.4 DEPO_CURRENT_LIMIT

Возвращает значение «Текущего лимита по бумагам».

DEPO_CURRENT_LIMIT (STRING client_code, STRING firmid, STRING seccode, STRING account)

8.14.5 DEPO_LIMIT_AVAILABLE

Возвращает значение доступного количества бумаг.
DEPO_LIMIT_AVAILABLE (STRING client_code, STRING firmid, STRING seccode, STRING account)

8.14.6 DEPO_LIMIT_LOCKED

Возвращает значение «Заблокированного количества бумаг».

DEPO_LIMIT_LOCKED (STRING client_code, STRING firmid, STRING seccode, STRING account)

8.14.7 DEPO_LIMIT_LOCKED_BUY

Возвращает значение «Заблокированного на покупку количества лотов».

DEPO_LIMIT_LOCKED_BUY (STRING client_code, STRING firmid, STRING seccode, STRING account)

8.14.8 DEPO_LIMIT_LOCKED_BUY_VALUE

Возвращает значение «Стоимости бумаг, заблокированных на покупку».
DEPO_LIMIT_LOCKED_BUY_VALUE (STRING client_code, STRING firmid, STRING seccode, STRING account)

Параметры:



ЗАМЕЧАНИЕ: Параметр «account» должен указываться с соблюдением регистра сим-волов (верхнего/нижнего).
Пример:



ClDepoOB = DEPO_OPEN_BALANCE ("1075", "NC0080000000", "HYDR", "L01-00000F00")
ClDepoOL = DEPO_OPEN_LIMIT ("1075", "NC0080000000", "HYDR", "L01-00000F00")
ClDepoСB = DEPO_CURRENT_BALANCE ("1075", "NC0080000000", "HYDR", "L01-00000F00")
ClDepoCL = DEPO_CURRENT_LIMIT ("1075", "NC0080000000", "HYDR", "L01-00000F00")
ClDepoAV = DEPO_LIMIT_AVAILABLE ("1075", "NC0080000000", "HYDR", "L01-00000F00")
ClDepoLCK = DEPO_LIMIT_LOCKED ("1075", "NC0080000000", "HYDR", "L01-00000F00")
ClDepoLCKBuy = DEPO_LIMIT_LOCKED_BUY ("1075", "NC0080000000", "HYDR", "L01-00000F00")
ClDepoLCKBuyValue = DEPO_LIMIT_LOCKED_BUY_VALUE ("1075", "NC0080000000", "HYDR", "L01-00000F00")

В примере показано присвоение переменным значений Таблицы лимитов по бумагам для клиента с кодом «1075» по обыкновенным акциям «РусГидро»:
● переменной «ClDepoOB» присваивается значение входящего остатка,
● переменной «ClDepoOL» присваивается значение входящего лимита,
● переменной «ClDepoCB» присваивается значение текущего остатка,
● переменной «ClDepoCL» присваивается значение текущего лимита,
● переменной «ClDepoAV» присваивается значение доступного количества бумаг,
● переменной «ClDepoLCK» присваивается значение заблокированного количества бумаг,
● переменной «ClDepoLCKBuy» присваивается значение заблокированного на покупку ко-личества лотов,
● переменной «ClDepoLCKBuyValue» присваивается значение стоимости бумаг, заблоки-рованных на покупку.

8.15 Функции для получения значений Таблицы лимитов по денежным средствам

Функции предназначены для получения значений таблицы для заданного кода клиента, кода фирмы, тэга расчетов и кода валюты.

8.15.1 MONEY_OPEN_BALANCE

Возвращает значение «Входящего остатка по денежным средствам».
MONEY_OPEN_BALANCE (STRING client_code, STRING firmid, STRING tag, STRING curr_code)

8.15.2 MONEY_OPEN_LIMIT

Возвращает значение «Входящего лимита по денежным средствам».
MONEY_OPEN_LIMIT (STRING client_code, STRING firmid, STRING tag, STRING curr_code)

8.15.3 MONEY_CURRENT_BALANCE

Возвращает значение «Текущего остатка по денежным средствам».
MONEY_CURRENT_BALANCE (STRING client_code, STRING firmid, STRING tag, STRING curr_code)

8.15.4 MONEY_CURRENT_LIMIT

Возвращает значение «Текущего лимита по денежным средствам».
MONEY_CURRENT_LIMIT (STRING client_code, STRING firmid, STRING tag, STRING curr_code)

8.15.5 MONEY_LIMIT_AVAILABLE

Возвращает значение «Доступного количества денежных средств».
MONEY_LIMIT_AVAILABLE (STRING client_code, STRING firmid, STRING tag, STRING curr_code)

8.15.6 MONEY_LIMIT_LOCKED

Возвращает значение «Заблокированного количества денежных средств.

MONEY_LIMIT_LOCKED (STRING client_code, STRING firmid, STRING tag, STRING curr_code)

Пример:

ClMoneyOB = MONEY_OPEN_BALANCE ("1075", "NC0080000000", "EQTV", "SUR")
ClMoneyOL = MONEY_OPEN_LIMIT ("1075", "NC0080000000", "EQTV", "SUR")
ClMoneyCB = MONEY_CURRENT_BALANCE ("1075", "NC0080000000", "EQTV", "SUR")
ClMoneyCL = MONEY_CURRENT_LIMIT ("1075", "NC0080000000", "EQTV", "SUR")
ClMoneyAV = MONEY_LIMIT_AVAILABLE ("1075", "NC0080000000", "EQTV", "SUR")
ClMoneyLCK = MONEY_LIMIT_LOCKED ("1075", "NC0080000000", "EQTV", "SUR")

В примере показано присвоение переменным значений Таблицы лимитов по денежным средствам на Фондовой бирже ММВБ для клиента с кодом «1075»:
● переменной «ClMoneyOB» присваивается значение входящего остатка по денежным средствам,
● переменной «ClMoneyOL» присваивается значение входящего лимита по денежным средствам,
● переменной «ClMoneyCB» присваивается значение текущего остатка по денежным средствам,
● переменной «ClMoneyCL» присваивается значение текущего лимита по денежным средствам,
● переменной «ClMoneyAV» присваивается значение доступного количества денежных средств,
● переменной «ClMoneyLCK» присваивается значение заблокированного количества де-нежных средств.

8.16 Функции расчета маржинальных позиций

Функции предназначены для получения значений маржинальных позиций для заданного кода клиента, кода фирмы, кода класса, счета депо и кода параметра цены, по которой идет расчет стоимости (например «OPEN» – цена открытия, «LAST» – цена последней сделки и т.п.).

8.16.1 SHORT_VALUE

Возвращает значение «Стоимости всех коротких позиций».

SHORT_VALUE (STRING client_code, STRING firmid, STRING seccode, STRING class_code, STRING account, STRING price_param_code)

8.16.2 LONG_VALUE

Возвращает значение «Стоимости всех длинных позиций».

LONG_VALUE (STRING client_code, STRING firmid, STRING seccode, STRING class_code, STRING account, STRING price_param_code)

Параметры:




ЗАМЕЧАНИЕ (*): параметр чувствителен к верхнему/нижнему регистру символов.

Пример:

ClShortsValue = SHORT_VALUE ("1075", "NC0080000000", "HYDR", "EQBR", "L01-00000F00", "LAST")
ClLongsValue = LONG_VALUE ("1075", "NC0080000000", "HYDRR", "EQBR", "L01-00000F00", "OPEN")

Переменной «ClShortsValue» присваивается значение стоимости всех коротких позиций для клиента с кодом «1075» по инструменту «РусГидро» из класса «А1-Акции» по счету «L01-00000F00», исходя из цены последней сделки.
Переменной ClLongsValue присваивается значение стоимости всех длинных позиций для клиента с кодом «1075» по инструменту «РусГидро» из класса «А1-Акции» по счету «L01-00000F00», исходя из цены открытия.

8.17 Функции получения значений таблиц «Клиентский портфель» и «Купить/Продать»

Функции предназначены для получения значений указанных таблиц. Значения этих таблиц вычисляются на рабочем месте клиента QUIK с периодичностью, установленной в настройках (пункт меню Настройки/Основные, вкладка «Общие», флажок «Обновлять клиентский портфель через каждые .. секунд»).

8.17.1 GET_CLIENT_MARGINAL_PORTFOLIO_INFO

Функция возвращает ассоциативный массив (MAP) с параметрами таблицы «Клиентский портфель», соответствующих идентификатору участника торгов «firmid» и коду клиента «client_code».
MAP GET_CLIENT_MARGINAL_PORTFOLIO_INFO (STRING firmid, STRING client_code)

Параметры:



Пример:

GET_CLIENT_MARGINAL_PORTFOLIO_INFO ("NC0080000000", "1")

8.17.2 GET_CLIENT_MARGINAL_BUY_SELL_INFO

Функция возвращает ассоциативный массив (MAP) с параметрами таблицы «Купить/Продать», означающими возможность купить либо продать указанный инструмент «sec_code» класса «class_code», указанным клиентом «client_code» фирмы «firmid», по указанной цене «price». Если цена равна «0», то используются лучшие значения спроса/предложения.

MAP GET_CLIENT_MARGINAL_BUY_SELL_INFO (STRING firmid, STRING client_code, STRING class_code, STRING sec_code, DOUBLE price)

Параметры:





Пример:

GET_CLIENT_MARGINAL_BUY_SELL_INFO ("NC0080000000", "1", "EQBR", "HYDR", 0)

8.18 Функции для работы с файлами

Функции предназначены для работы с текстовыми файлами и могут использоваться, например, для ведения журнала (log-файла) действий программы. Названия файлов могут содержать пути к ним, например «C:/QUIK/log/new.log».

8.18.1 CLEAR_FILE

Очищает указанный файл.

MAP CLEAR_FILE (STRING target_file)

Функция возвращает ассоциативный массив (MAP), содержащий параметры:



8.18.2 WRITE

Записывает в конец файла «target_file» строку «string_to_write».

MAP WRITE (STRING target_file, STRING string_to_write)

Функция возвращает ассоциативный массив (MAP), содержащий параметры:

8.18.3 WRITELN

Записывает в конец файла «target_file» строку «string_to_write» с последующим переводом строки.

MAP WRITELN (STRING target_file, STRING string_to_write)

Функция возвращает ассоциативный массив (MAP), содержащий параметры:




Пример:

CLEAR_FILE ("new.log")
WRITE ("new.log","Hello, ")
WRITELN ("new.log","world")

8.18.4 GET_FILE_LEN

Возвращает количество строк в файле «target_file». Если такого файла не существует, возвращает «-1».
DOUBLE GET_FILE_LEN (STRING target_file)

8.18.5 READ_LINE

Функция считывает из файла «target_file» и возвращает строку под номером «line». Длина строки не должна превышать 1000 символов, строки большей длины при считывании будут обрезаны.

STRING READ_LINE (STRING target_file, DOUBLE line, DOUBLE error)

«error» – возвращаемый результат выполнения операции. Если значение равно «0», то чтение прошло успешно; «1» – произошла ошибка, «2» – достигнут конец файла.

Пример:

WRITELN ("new.log","Hello, world")
msg = READ_LINE ("new.log", GET_FILE_LEN("new.log"), error)
MESSAGE (msg,1)

8.19 Функции для работы со строками

8.19.1 LEN

Возвращает длину строковой переменной «value».

DOUBLE LEN (STRING value)

8.19.2 TRIM

Обрезает пробелы в конце строки.

STRING TRIM (STRING value)

Функция возвращает строку без пустых символов в конце строки.

8.19.3 SUBSTR

Возвращает подстроку из строки «value», начиная с символа с номером «start» и длиной «len».

STRING SUBSTR (STRING value, DOUBLE start, DOUBLE len)

8.19.4 FIND

Ищет вхождение подстроки в заданную строку.

DOUBLE FIND (STRING value, DOUBLE start, STRING sub)

Функция возвращает позицию первого вхождения подстроки «sub» в строке «value», начиная с позиции «start». Если подстрока не найдена, функция возвращает результат «-1».

Пример:

stroka="anymessage"
stroka2=SUBSTR(stroka, FIND(stroka, 1, "message"), LEN("message"))
MESSAGE (stroka2,2)

8.20 Функции для работы с графиками

8.20.1 GET_CANDLE

Функция для обращения к данным «свечек» на графике, а также к значениям индикаторов технического анализа.

MAP GET_CANDLE (STRING class_code, STRING sec_code, STRING parameter_name, STRING interval, STRING graph_type, DOUBLE Date, DOUBLE Time)

Функция возвращает ассоциативный массив (MAP), содержащий информацию о ценах в момент времени «Date»«Time», для графика, построенного по бумаге с кодом «sec_code» из класса с кодом «class_code» с временным интервалом «interval». Если «class_code» равен «», то функ-ция ищет «sec_code» по всем классам до первого нахождения.

Тип графика указывается следующим кодом:



Значение временного интервала «interval» можно задавать следующими числовыми величинами:



Значение «parameter_name» должно соответствовать одному из значений имени параметра из Таблицы текущих значений параметров. Их перечень см. в п. 8.12. Если «parameter_name» указан как «», то поиск осуществляется по данным Таблицы всех сделок.
Значение даты «Date» нужно указывать в формате «YYYYMMDD». Например, «20050527» оз-начает 27 мая 2005 г. Значение времени «Time» нужно указывать в формате «hhmmss». На-пример, «163500» означает 16 ч. 35 мин.
Функция возвращает ассоциативный массив (MAP), содержащий параметры:


Пример:

msg = GET_CANDLE("EQBR", "HYDR", "", "5", "PRICE", 20101130, 103500)
MESSAGE(msg, 2)

8.20.2 GET_CANDLE_EX

В некоторых случаях, например, когда индикатор технического анализа состоит из нескольких линий, применение функции GET_CANDLE невозможно. Для доступа к таким индикаторам средствами языка QPILE применяется функция GET_CANDLE_EX.

MAP GET_CANDLE_EX (STRING Tag, DOUBLE Date, DOUBLE Time)

Функция возвращает ассоциативный массив (MAP) с данными для графика со строковым иден-тификатором Tag в момент времени «Date» и «Time». Таким образом, для того чтобы обратить-ся к данным на графике, необходимо его предварительно построить и присвоить ему уникаль-ный строковый идентификатор Tag. Идентификатор Tag задается в диалоге «Настройки графи-ка» на закладке «Дополнительно» (см. Раздел 4, п. 4.2.4 Руководства пользователя QUIK).

При вызове функции значение даты «Date» нужно указывать в формате «YYYYMMDD». Напри-мер, «20050527» означает 27 мая 2005 г. Значение времени «Time» нужно указывать в формате «hhmmss». Например, «163500» означает 16 ч. 35 мин. Функция округляет параметр «Time» до ближайшего меньшего значения времени, соответствующего интервалу графика. Например, если интервал графика — «5 минут», а значение параметра «Time» — «163700», то функция округлит значения параметр «Time» до «163500», а если интервал графика – «60 минут», то «163700» округлиться до «160000».

Возвращаемый функцией ассоциативный массив содержит следующие поля:



Каждый элемент коллекции линий содержит ассоциативный массив (MAP) со следующими параметрами:



Пример:
slice = Get_Candle_Ex ("all", 20070511, 170000)
LineCount = Get_Value (slice,"COUNT")
time = Get_Value (slice,"TIME")
lines = Get_Value (slice,"LINES")
FOR lineID FROM 0 TO LineCount-1
line = Get_Collection_Item (lines, lineID)
open = Get_Value (line,"OPEN")
line_name = Get_Value (line,"NAME")
volume = Get_Value (line,"VOLUME")
END FOR

8.21 Функции для работы с заявками

Функции предназначены для создания заявок и отправки их в торговую систему.

8.21.1 SEND_TRANSACTION

Отправляет заявку с параметрами, указанными в массиве «trans_params» и ожидает ответа торговой системы в течение «wait_timeout_for_replay» (в секундах, не менее 5). Элементы мас-сива «trans_params» заполняются по правилам создания строки для импорта транзакций из файла (подробнее см. Раздел 6, п.6.10.3).

MAP SEND_TRANSACTION (DOUBLE wait_timeout_for_replay, MAP trans_params)

Транзакции, выполняющие групповое снятие заявок, не поддерживаются:
● «KILL_ALL_ORDERS» – снять все заявки из торговой системы,
● «KILL_ALL_STOP_ORDERS» – снять все стоп-заявки,
● «KILL_ALL_NEG_DEALS» – снять все заявки на внебиржевые сделки и заявки на сделки РЕПО.

Функция возвращает ассоциативный массив (MAP), содержащий результат обработки заявки:



Пример:

new_global("trans_params", "")
new_global("trans_result", "")
trans_params = CREATE_MAP ()
trans_params = set_value (trans_params, "TRANS_ID", "333")
trans_params = set_value (trans_params, "ACTION", "NEW_ORDER")
trans_params = set_value (trans_params, "CLASSCODE", "EQBR")
trans_params = set_value (trans_params, "SECCODE", "HYDR")
trans_params = set_value (trans_params, "ACCOUNT", "L01-00000F00")
trans_params = set_value (trans_params, "OPERATION", "B")
trans_params = set_value (trans_params, "PRICE", "7.561")
trans_params = set_value (trans_params, "QUANTITY", "1")
trans_params = set_value (trans_params, "CLIENT_CODE", "")
trans_params = set_value (trans_params, "TYPE", "L")
trans_result = SEND_TRANSACTION (30, trans_params)
WRITELN ("qpile_trans.log", get_value (curr_datetime, "DATETIME") & ": " & "Result: " & get_value (trans_result, "RESULT") & ", Result_ex: " & get_value (trans_result, "RESULT_EX") & ", OrderNum: " & get_value (trans_result, "ORDER_NUMBER") & ", Description: " & get_value (trans_result, "DESCRIPTION"))

8.22 Функции для работы с метками

Функции предназначены для построения меток и установки их на график.

8.22.1 ADD_LABEL

Добавляет метку с заданными параметрами.
DOUBLE ADD_LABEL (STRING tag, MAP label params)
В окно, где отображен график с идентификатором «tag» добавляется метка. В случае успешного добавления функция возвращает идентификатор метки или (-1), если добавить метку не удалось.

Формат массива MAP содержит следующие параметры метки:



Пример:

label_params=create_map()
label_params=set_value(label_params,"TEXT", "Текст метки")
label_params=set_value(label_params,"IMAGE_PATH", "image.bmp")
label_params=set_value(label_params,"ALIGNMENT", "LEFT")
label_params=set_value(label_params,"YVALUE", 2000)
label_params=set_value(label_params,"DATE", 20080616)
label_params=set_value(label_params,"TIME", 220000)
label_params=set_value(label_params,"R", 0)
label_params=set_value(label_params,"G", 0)
label_params=set_value(label_params,"B", 200)
label_params=set_value(label_params,"TRANSPARENCY", 10)
label_params=set_value(label_params,"FONT_FACE_NAME", "Tahoma")
label_params=set_value(label_params,"FONT_HEIGHT", 12)
label_params=set_value(label_params,"HINT", "Подсказка")
id=ADD_LABEL("ALL", label_params)

Результат представляется следующим образом: на графике с идентификатором "ALL" будет добавлена метка с параметрами, указанными в массиве label_params.

8.22.2 DELETE_LABEL

Удаляет метку с заданными параметрами.

DOUBLE DELETE_LABEL(STRING tag, DOUBLE id)

Удаляет метку с графика с текстовым идентификатором «tag» по заданному идентификатору id. В случае успешного удаления возвращает 1, в случае неудачи 0.

Пример:
err=DELETE_LABEL("ALL", id)


Результат действия функции будет удаление метки на графике с идентификатором «ALL».

8.22.3 DELETE_ALL_LABELS

Команда удаляет все метки на диаграмме с указанным графиком.

DOUBLE DELETE_ALL_LABELS(STRING tag)

Удаляет все нанесенные метки с диаграммы, содержащей график с идентификатором tag. Если на этой диаграмме отображаются графики с разными идентификаторами, то этой командой бу-дут удалены метки со всех графиков, а не только с указанного графика.

Пример:

err=DELETE_ALL_LABELS("ALL")

Результатом действия функции будет удаление всех меток на графике.

8.22.4 GET_LABEL_PARAMS

Команда позволяет получить параметры меток.

MAP GET_LABEL_PARAMS(STRING tag, DOUBLE id)

Возвращает параметры метки с указанным идентификатором; если метка с указанным иденти-фикатором не существует – возвращается пустой MAP.
Пример:

new_params=GET_LABEL_PARAMS("ALL", id)


Результатом действия является получение данных метки. В случае если такой метки не сущест¬вует, то возвратившиеся значения будут пустыми.

8.22.5 SET_LABEL_PARAMS

Функция задает параметры для метки с указанным идентификатором.

DOUBLE SET_LABEL_PARAMS(STRING tag, DOUBLE id, MAP new label params)

Она позволяет задать новые параметры для метки. В случае успешного обновления парамет-ров функция возвращает 1, в случае неудачи 0.
Пример:

err=SET_LABEL_PARAMS("ALL", id, label_params)


Результатом действия функции будет изменение существующих параметров на заданные функцией.

8.23 Сервисные функции

8.23.1 GET_TRADE_DATE

Возвращает дату текущей торговой сессии.

MAP GET_TRADE_DATE ()

Функция возвращает ассоциативный массив (MAP), содержащий параметры:



Пример:

writeln(log_file_name, get_value(GET_TRADE_DATE(), "Date"))

Записывает в файл строку вида:
02.06.2004

8.23.2 GET_DATETIME

Возвращает текущие дату и время.

MAP GET_DATETIME ()

Функция возвращает ассоциативный массив (MAP), содержащий параметры:



Пример:

writeln(log_file_name, get_value(GET_DATETIME(), "Datetime"))

Записывает в файл строку вида:
02.06.2004 3 16:57:34.460

8.23.3 APPLY_SCALE

Возвращает строку с числом, полученным округлением числа «without_scale» до разрядности «scale».

STRING APPLY_SCALE (DOUBLE without_scale, DOUBLE scale)

8.23.4 IS_CONNECTED

Функция предназначена для определения состояния подключения клиентского места к серверу. Возвращает 1, если клиентское место подключено и 0, если не подключено.

IS_CONNECTED ()

8.23.5 GET_INFO_PARAM

Функция возвращает значения параметров информационного окна (пункт меню Связь / Инфор¬мационное окно).
STRING GET_INFO_PARAM (STRING param_name)
Параметр «param_name» может принимать значения, представленные в таблице.



8.23.6 BREAKPOINT()

Функция предназначена для прерывания режима расчета и вывода окна «Отладка», в котором пользователь сможет наблюдать за дальнейшей работой программы.

BREAKPOINT()

Команда не содержит никаких параметров и результатом ее действия является остановка вы-полнения программы, выделение красным маркером следующей за ней функции и вызов окна «Отладка», в котором пользователь сможет отслеживать выполнение кода скрипта. При необ-ходимости, команда может содержаться в коде произвольное количество раз.

8.24 Отладка программ QPILE

Окно «Отладка» предназначено для пошагового контроля за исполнением кода скриптов. Оно позволяет отслеживать выполнение кода программ, написанных на языке QPILE.

Окно может быть вызвано следующим образом:
● из таблицы QPILE, выбрав команду контекстного меню «Начать расчет в режиме отладки»;
● из кода программы функцией breakpoint().

Окно содержит два больших поля:
● «Код программы» – выводит код языка QPILE;
● «Значения переменных» – выводятся переменные и их значения в виде двух столбцов.

При вызове окна с помощью оператора breakpoint() следующая за ним строка программы будет отмечена красным цветом.



Окно «Отладка» содержит следующие кнопки:
● «Следующий шаг» – выполняет один оператор в коде.
● «Продолжить выполнение» – продолжает выполнение программы, пока не будет нажата кнопка «Остановить расчет», найден еще один оператор breakpoint() или не будет дос-тигнут конец программы.
● «Остановить расчет» – останавливает расчет на последнем выполненном операторе.

Доступные функции:
● «F5» – продолжить выполнение программы,
● «Shift»+«F5» – прекратить отладку программы и закрыть данное окно,
● «F10» – перейти к следующей строке.


ПРИЛОЖЕНИЕ 1. Синтаксис команд языка QPILE

Program:
Statement_List

Statement_List:
Statement "n"
Statement_List "n" Statement

Statement:
NAME=Expression
IFOperator
FOROperator
FUNCDescr
CONTINUE //пропускает выполнение операторов до конца текущего Statement_List
BREAK //начинает выполнение оператора следующего за текущим Statement_List
RETURN //выход из текущего управляющего блока – из тела функции или из всей программы

IFOperator:
"IF" Condition "n"
Statement_List
"ELSE" "n"
Statement_List
"END IF"

Condition
Condition "OR" Condition
Condition "AND" Condition
"("Condition") "
PrimaryCondition

PrimaryCondition
Expression "==" Expression
Expression "=" Expression //c той же семантикой, что и "=="
Expression ">=" Expression
Expression "<=" Expression
Expression ">"Expression
Expression "<"Expression
Expression "!=" Expression
Expression "<>" Expression //c той же семантикой, что и "!="

FOROperator:
"FOR" NAME "IN" ArgList "n"
Statement_List
"END FOR"

"FOR" NAME "FROM" Expression "TO" Expression "n"
Statement_List
"END FOR"

ArgList
NAME // в этом случае переменная с именем NAME должна содержать значение вида ArgList1
ArgList1

ArgList1:
Expression
ArgList "," Expression

FUNCDescr
"FUNC" NAME "(" FargList ")" "n"
Statement_List
"END FUNC"

FArgList
NAME
FArgList "," NAME

Expression:
Expression "+" Term
Expression "–" Term
Expression "&" Term //конкатенация строк
Term

Term:
Term "/" Primary
Term "*" Primary
Primary

Primary:
NUMBER
STRINGNAME //значение переменной с именем NAME
"-" Primary
"(" Expression ")"
FunctionCall

FunctionCall
FNAME "(" ArgList1 ")"

NUMBER:
Digits
Digits "." DigitsSTRING: //определяется стандартно
NAME: //определяется стандартно


Ключевые слова = {IF, ELSE, FOR, IN, TO, FROM, AND, OR, RESULT, FUNC, END FUNC, END FOR, END IF, CONTINUE, BREAK, RETURN}

ПРИЛОЖЕНИЕ 2. Рекомендации к составлению программ на QPILE

1. Функции для работы со структурными переменными, такие как «SET_VALUE», «ADD_COLLECTION_ITEM», «REMOVE_COLLECTION_ITEM» возвращают измененное значение коллекции или массива. Поскольку все параметры передаются в функцию по значению, то использование данных функций в качестве процедур приводит к потере сделанных в них изменений.

Например:

clientscol=INSERT_COLLECTION_ITEM(clientscol,0,initmap)
‘правильно

INSERT_COLLECTION_ITEM(clientscol,0,initmap)
‘неправильно, в этом случае после вызова функции clientscol будет содержать то же значение, что и до ее вызова


2. Возвращаемые функциями значения могут оказаться строковыми, хотя и представлять вещественное число. В этих случаях нужно использовать сложение с «0» для преобра-зования результата к численному значению. Например, для корректной инициализации переменной в операторе присваивания вида «v=GET_VALUE()» стоит написать «v=0+GET_VALUE()». В последнем случае гарантированно достигается вещественное значение переменной.
Аналогичным образом, для приведения вещественного значения к строковому может использоваться операция склейки с пустой строкой «v=""&GET_VALUE()».

3. Произвольные пользовательские типы могут быть сформированы путем комбинации коллекций и ассоциативных массивов. Например, если нужен список структур типа:

c=strruct{
openbal:double
closebal:double
clientcode:string}


то его можно представить как коллекцию ассоциативных массивов, в каждом из которых будет три ключа – «OPENBAL», «CLOSEBAL», «CLIENTCODE». Код для инициализации такой структуры:

initmap=CREATE_MAP()
initmap=SET_VALUE(initmap,"OPENBAL",0)
initmap=SET_VALUE(initmap,"CLOSEBAL",0)
initmap=SET_VALUE(initmap,"CLIENTCODE","")
clientscol=CREATE_COLLECTION()
FOR i FROM 0 TO 10
clientscol=INSERT_COLLECTION_ITEM(clientscol,0,initmap)
END FOR


После чего, для доступа к полю «OPENBAL» 5-го клиента надо написать:

openbal = GET_VALUE(GET_COLLECTION_ITEM(clientscol,5),"OPENBAL")

Если вместо коллекции таких записей использовать массив с ключом представляющим из себя код клиента, то можно будет обращаться к значениям структуры клиента без указания его индекса в массиве, а зная только клиентский код:

clientsmap=CREATE_MAP()
FOR i FROM 0 TO 10
clientsmap=SET_VALUE(clientsmap,"Q" & i, initmap)
END FOR


и последующее обращение к значению поля «OPENBAL» для клиента с кодом «Q5»:

openbal = GET_VALUE(GET_VALUE(clientsmap,"Q5"),"OPENBAL")

4. «MODIFY_ITEM» не выполняет действий, если указанной строки в таблице «OWN» еще нет. Поэтому надо предварительно проверять ее наличие.
При построении пользовательской таблицы на каждой итерации изменяющей в себе строку полезным будет код:

new_global("first_time_flag",0)

if first_time_flag==0
add_item(1, SAMPLE)
first_time_flag=1
else
modify_item(1, SAMPLE)
end if


При первом запуске создается строка номер 1 со значениями полей из переменной «SAMPLE» насчитанной ранее, а на последующих итерациях строка номер 1 модифи-цируется.