Расширение интерфейса QLUA

Страницы: 1
RSS
Расширение интерфейса QLUA, Пользовательские пункты контекстного меню таблиц, функция открытия окна заявки с заранее заданными параметрами
 

Предложения касаются дополнений к программному интерфейсу QLUA.

1)

Реализовать функцию, создающую окно ввода новых заявок. В функцию в качестве параметра должна передаваться таблица, аналогичная таблице, передаваемой в качестве параметра в функцию sendTransaction(). Таким образом можно будет в скрипте заранее заполнить нужные параметры.

Справка по функции:

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

Формат вызова:

Код
NUMBER openNewOrderWindow(TABLE transaction)

Функция возвращает 1, если пользователь нажал "ОК", 0 - в ином случае

Параметр transaction - таблица, аналогичная по составу таблице, передаваемой в функцию sendTransaction().

Пример:

Код
openNewOrderWindow ({    ["CLIENT_CODE"]="777777",    ["ACCOUNT"]="MB0007777777",    ["EXECUTION_CONDITION"]="PUT_IN_QUEUE"    ["TRANS_ID"]="777777"    ["CLASSCODE"]="CETS"    ["SECCODE"]="USD000UTSTOM"    ["ACTION"]="NEW_ORDER"    ["OPERATION"]="B"    ["TYPE"]="L"    ["PRICE"]="63.3000"    ["QUANTITY"]="12"})

2)

Реализовать возможность добавления пользовательского пункта меню в контекстное меню каждого вида стандартных таблиц QUIK. При выборе пользователем этого пункта меню должен вызывается callback в пользовательском скрипте, в который должно передаваться имя класса окна (например, “quotes”, ”trades” и т.п.), идентификатор пользовательского пункта меню и таблица, содержащая значения текущей строки стандартной таблицы интерфейса QUIK. Регистрация callback пользовательского скрипта может производиться одновременно с регистрацией в QUIK параметров пункта меню.

Пример:

Где-то в коде инициализации:

Код
registerUserMenuItem("quotes", "Создать заявку и стоп заявку", USER_MAKE_ORDER_AND_STOP_ORDER, UserMenuItemCallback)

В результате вызова этой функции в контекстное меню всех таблиц котировок должен добавиться пункт меню "Создать заявку и стоп-заявку". При выборе пользователем этого пункта меню должен вызваться callback:

Код
function UserMenuItemCallback(table_class, menu_item_id, table_line)    if (table_class == "quotes") then        if (menu_item_id == USER_MAKE_ORDER_AND_STOP_ORDER) then            trans1 = PrepareOrderTransaction(table_line) --подготовить данные для заявки            trans2 = PrepareOrderTransaction(table_line) --подготовить данные для заявки            ProcessOrders({trans1, trans2})        elseif (menu_menu_item_id == USER_ANOTHER_FUNCTION) then            --сделать ещё что-нибудь полезное        else            message("Не реализовано")        end    elseif (table_class == "orders") then        --что-то сделать на радость всем    endend 

Примерные прототипы функций:

Код
NUMBER registerUserMenuItem(STRING table_class, STRING menu_item_text, NUMBER menu_item_id, FUNCTION callback)UserMenuItemCallback(STRING table_class, NUMBER menu_item_id, TABLE table_line)

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

 
Код коряво вставился...
Дублирую здесь
Код
openNewOrderWindow({
    ["CLIENT_CODE"]="777777",
    ["ACCOUNT"]="MB0007777777",
    ["EXECUTION_CONDITION"]="PUT_IN_QUEUE"
    ["TRANS_ID"]="777777"
    ["CLASSCODE"]="CETS"
    ["SECCODE"]="USD000UTSTOM"
    ["ACTION"]="NEW_ORDER"
    ["OPERATION"]="B"
    ["TYPE"]="L"
    ["PRICE"]="63.3000"
    ["QUANTITY"]="12"})

Код
registerUserMenuItem("quotes", "Создать заявку и стоп заявку", USER_MAKE_ORDER_AND_STOP_ORDER, UserMenuItemCallback)

function UserMenuItemCallback(table_class, menu_item_id, table_line)
    if (table_class == "quotes") then
        if (menu_item_id == USER_MAKE_ORDER_AND_STOP_ORDER) then
            --подготовить данные для транзакций
        elseif (menu_menu_item_id == USER_ANOTHER_FUNCTION) then
            --сделать ещё что-нибудь полезное
        else
            message("Не реализовано")
        end
    elseif (table_class == "orders") then
        --что-то сделать на радость всем
    end
end
 
Здравствуйте!

Ваши пожелания зарегистрированы.  Мы постараемся рассмотреть их и  сообщить Вам результаты анализа. Впоследствии, по результатам анализа,  будет приниматься решение о реализации пожеланий в будущих версиях ПО.
 
Прошу обратить внимание, что эти дополнения в интерфейс QLUA позволят с лёгкостью реализовать в скрипте QLUA ранее многократно и в разных формулировках запрашиваемую функцию "автоматическое выставление стоп лосса и тейк профита с заранее заданными параметрами при создании заявки". Также будет, например, легко реализуема такая плюшка, как групповое изменение заявок - отмена, изменение (например, сдвиг) лимитных и стоп цен, коррекция параметров отступа и защитного спреда, изменение параметров рыночной цены, замена инструмента (например с TOD на TOM).
Вообще, интерфейс QLUA крайне беден в плане наличия средств интерактивного взаимодействия с пользователем. Да, я понимаю, что всё можно делать через файловый ввод-вывод: мониторить новые команды, считывать их и исполнять, но это не улучшает удобство, а главное - быстроту использования.

Поэтому осмелюсь попросить ещё одну функцию взаимодействия скрипта QLUA с пользователем:
Возможность создания немодальных аналогов функции MessageBox из Win32 API. Модальные окошки не подойдут, так как могут потеряться и повесить какой-нибудь поток. Чтобы потерянные окна с запросами из скрипта несложно было найти как интерактивно, так и программно - предлагаю ввести новый тип таблиц - "Запросы из скрипта". Доступ для чтения к ней из LUA предлагаю осуществить с помощью getItem() и других функций из этой группы. Должна быть возможность интерактивно открыть необработанный ранее по каким-то причинам пользователем запрос, отправленный из скрипта и сохранённый в данной таблице. Также должна быть возможность программного снятие переставшего быть актуальным запроса, отправленного ранее из скрипта. Как вариант, можно предусмотреть время действия для каждого из запросов пользователя. Из данного описания запрошенной функциональности следует, что должна быть применена асинхронная, событийно-ориентированная модель обработки ответов пользователя. Возможно, следует ввести дополнительный callback типа OnUserAnswer(request_id, answer).

Примерные прототипы функций:
Код
registerUserAnswerCallback(FUNCTION user_answer_callback)
unregisterUserAnswerCallback()
OnUserAnswer(NUMBER request_id, STRING answer)
NUMBER MessageBoxNonModal(STRING message_str, TABLE options, NUMBER icon_code, NUMBER timeout_in_seconds) -- возвращает request_id
CancelMessageBox(NUMBER request_id)

TABLE options - таблица, содержащая набор пар <текстовое представление опции> и <идентификатор ответа>, например:
Код
options =
{
    {"Да", 1},
    {"Нет", 0},
    {"Не понял", -1}
}

Надписи на кнопках формируются из текстовое представления опции, в качестве поля answer  в callback передается идентификатор ответа.

Разумеется, при остановке скрипта по любым причинам все MessageBox, с ним связанные - закрываются, а следы в таблице "висящих" запросов скрипта (pending requests) - подчищаются.

Спасибо за внимание ;-)
 
Конечно, подобный функционал можно реализовать с помощью пользовательских таблиц, но для этого такой огород приходится городить))
Страницы: 1
Читают тему
Наверх