Найти тему
Код торгового робота

Окно с дополнительной информацией в QUIK.

Всем привет!

Ранее в предыдущих выпусках (в этом и этом) я рассматривал использование команды message() для анализа работы скрипта. Но, в предлагаемом там варианте достаточно проблематично вглядываться в мелькающие цифры и делать выводы и как-то реагировать сразу после выдачи информации. Тот вариант больше подходит для анализа после торгового дня. Сегодня я покажу как в скриптах QLUA создать свое окно и выводить в него свою информацию.

Итак, поехали.

Какие команды нам потребуются:

win001=AllocTable() – команда определяет объект-окно, присваивает ему переменную. Далее через эту переменную мы будем работать.

AddColumn – команда определяет колонку.

Формат команды:

NUMBER AddColumn (NUMBER t_id, NUMBER iCode, STRING name, BOOLEAN is_default, NUMBER par_type, NUMBER width)

, где

t_id – это переменная которой мы присвоили командой AllocTable()

iCode – номер колонки, начиная с нулевого.

name – название колонки,

is_default – параметр не используется (я всегда ставлю true)

par_type – тип данных в колонке, одна из следующих констант:

  • QTABLE_INT_TYPE – целое число,
  • QTABLE_DOUBLE_TYPE – число с плавающей точкой,
  • QTABLE_INT64_TYPE – 64-битное целое число,
  • QTABLE_CACHED_STRING_TYPE – кэшируемая строка,
  • QTABLE_TIME_TYPE – время,
  • QTABLE_DATE_TYPE – дата,
  • QTABLE_STRING_TYPE – строка.

width – ширина в условных единицах.

CreateWindow(win001) – команда создает окно из полученных данных (название, количество колонок и пр.)

SetWindowCaption(win001, "Состояние работы") – выводит окно в программе. В этой команде мы можем обозначить что будет написано в верхней строке окна. В данном случае – «Состояние работы».

InsertRow(win001,1) – вставляет строку. Пока пустую. Тут нужно сослаться на переменную, которой присвоено значение командой AllocTable() и номер строки.

SetCell(win001,1,0,"Остаток средств:",0) – заполняем созданные строки данными. Тут указываем переменную созданного окна, номер строки, номер колонки, значение (в данном случае мы добавляем строку «Остаток средств:»). Если в ячейке будет число, то последний параметр должен быть таким – 0. Для строки его можно не указывать.

Вот такие команды нам потребуются.

А теперь давайте напишем отдельный скрипт, который будет нам показывать в нашем окне остаток средств, количество активных заявок на покупку, сумму этих заявок, количество активных заявок на продажу и сумму этих заявок.

Алгоритм такого скрипта будет достаточно простой: сначала мы инициируем создание окна с нашей таблицей, запишем в него заголовки и пр. Потом запустим длинный цикл (в конце тела цикла поставим задержку времени командой sleep()). Внутри цикла проверим остатки по деньгам, запишем данные в переменную (как проверять остатки мы изучали в этой статье). Также внутри цикла проверим количество активных заявок на покупку (в этой статье мы изучали как проходиться по таблице заявок) и на продажу и посчитаем суммы этих заявок. В конце тела цикла мы запишем полученные значения в таблицу.

Так как у нас скрипт будет работать постоянно, то в нашем окне мы будем видеть изменение информации, если будем добавлять новые заявки, снимать их, делать покупки и пр.

Вот такой код у нашего скрипта получается:

function main()
Firm_ID="NC0011100000";
Kod_klienta="11006"; -- нужно поставить свое значение
Torg_schet="NL0011100043"; -- нужно поставить свое значение
win001=AllocTable()
AddColumn(win001, 0, "Показатель", true, QTABLE_STRING_TYPE, 30)
AddColumn(win001, 1, "Значение", true, QTABLE_DOUBLE_TYPE, 20)
CreateWindow(win001);
SetWindowCaption(win001, "Состояние работы");
for fff=1,7 do
InsertRow(win001,fff)
end
SetCell(win001,1,0,"Остаток средств:");
SetCell(win001,2,0,"+--","-------------+");
SetCell(win001,3,0,"Кол-во заявок на продажу");
SetCell(win001,4,0,"Сумма заявок на продажу");
SetCell(win001,5,0,"+--","-------------+");
SetCell(win001,6,0,"Кол-во заявок на покупку");
SetCell(win001,7,0,"Сумма заявок на покупку");
for ddd=1,50000 do -- бесконечный цикл
countOrders = getNumberOf("orders");
count_buy = 0; -- количество заявок на продажу
count_sale = 0; -- сумма заявок на продажу
summ_buy = 0; -- количество заявок на покупку
summ_sale = 0; -- сумма заявок на покупку
for f=0,countOrders-1 do
orderRTSB=getItem("orders",f);
if (orderRTSB.account == Torg_schet) then
if ((bit.band(orderRTSB.flags, 0x1)==1))then
--Нашли заявку на покупку или продажу, активную заявку (это все в if выше прописано)
if (bit.band(orderRTSB.flags, 0x4)==0)then--Если нашли заявку на покупку
count_sale = count_sale+1;
summ_sale = summ_sale + orderRTSB.value;
end
if (bit.band(orderRTSB.flags, 0x4)==4)then--Если нашли заявку на продажу
count_buy = count_buy+1;
summ_buy = summ_buy + orderRTSB.value;
end
end
end
end
money = getMoneyEx(Firm_ID, Kod_klienta,"EQTV", "SUR",0)
moneyFree = money.currentbal;
SetCell(win001,1,1,tostring(moneyFree),0);
SetCell(win001,3,1,tostring(count_buy),0);
SetCell(win001,4,1,tostring(summ_buy),0);
SetCell(win001,6,1,tostring(count_sale),0);
SetCell(win001,7,1,tostring(summ_sale),0);
sleep(5000);
end
end

Скачать данный код

И вновь обращаю внимание, что данный скрипт создан для тестовой работы. В реальном скрипте в команде getMoneyEx() нужно использовать в последнем параметре не 0, а 2.

У меня получилось такое окно:

-2

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

На сегодня у меня все. Пишите в комментариях получилось ли у Вас запустить код. Дальше будет еще интереснее. Не забывайте подписываться на канал.

Всем пока.

====================================

Краткое содержание данного канала.

====================================