1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | -- Скрипт выводит в таблицу QLua баланс покупок/продаж -- последних 5-ти 1-минутных свечей, -- окрашивая ячейку в красный если больше продаж, -- в зеленый, если больше покупок -- и в желтый, если покупок и продаж было равное количество -- (c) QuikLuaCSharp.ru CLASS_CODE = "SPBFUT" -- Класс бумаги SEC_CODE = "GZH8" -- Код бумаги IsRun = true Array5Min = {} -- Создает массив для хранения баланса покупок/продаж на последних 5-ти 1-минутных свечах LastBarSeconds = 0 -- Время последнего бара в секундах function main() -- Создает таблицу CreateTable() -- Основной цикл while IsRun do sleep(1) end end --- Функция создает таблицу function CreateTable() -- Получает доступный id для создания t_id = AllocTable() -- Добавляет 5 колонок AddColumn(t_id, 0, "1", true, QTABLE_INT_TYPE, 15) AddColumn(t_id, 1, "2", true, QTABLE_INT_TYPE, 15) AddColumn(t_id, 2, "3", true, QTABLE_INT_TYPE, 15) AddColumn(t_id, 3, "4", true, QTABLE_INT_TYPE, 15) AddColumn(t_id, 4, "5", true, QTABLE_INT_TYPE, 15) -- Создаем t = CreateWindow(t_id) -- Даем заголовок SetWindowCaption(t_id, "Баланс покупок/продаж") -- Добавляет строку InsertRow(t_id, -1) end --- Функции по раскраске ячеек таблицы function Red(col) SetColor(t_id, 1, col, RGB(255,0,0), RGB(0,0,0), RGB(255,0,0), RGB(0,0,0)) end function Yellow(col) SetColor(t_id, 1, col, RGB(240,240,0), RGB(0,0,0), RGB(240,240,0), RGB(0,0,0)) end function Green(col) SetColor(t_id, 1, col, RGB(0,200,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0)) end --- Добавляет/сдвигает ячейки массива при появлении нового минутного бара, корректирует значения и окраску ячеек таблицы function AddNewBarToArray5Min() table.insert(Array5Min, 0) -- Если размер массива стал больше 5, удаляет первый элемент if #Array5Min > 5 then table.remove(Array5Min, 1) end -- (# - длина массива) -- Цикл по элементам массива local Offset = 5 - #Array5Min -- Сдвиг ячеек, если еще нет данных по всем 5-ти барам for i = 1, #Array5Min do -- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет SetBalance(Array5Min[i], i + Offset - 1) end end --- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет, редактирует значение массива function SetBalance(NewBalance, NumCol) SetCell(t_id, 1, NumCol, tostring(NewBalance)) -- Если устанавливается значение последней ячейки if NumCol == 4 then -- То корректируется значение в массиве Array5Min[#Array5Min] = NewBalance end -- Если новое значение < 0, окрашивает в КРАСНЫЙ if NewBalance < 0 then Red(NumCol) end -- Если новое значение = 0, окрашивает в ЖЕЛТЫЙ if NewBalance == 0 then Yellow(NumCol) end -- Если новое значение > 0, окрашивает в ЗЕЛЕНЫЙ if NewBalance > 0 then Green(NumCol) end end --- Если началась новая минута, корректирует время последнего бара и возвращает TRUE, иначе FALSE function CheckNewMin(DealDateTime) -- Переводит время поступившей сделки в секунды (в расчет берется время сделки до минут) DealDateTime.sec = 0 DealDateTime.mcs = 0 local Seconds = os.time(DealDateTime) -- Если сделка прошла на новом минутном баре if Seconds > LastBarSeconds then -- Корректирует время последнего бара LastBarSeconds = Seconds -- Возвращает TRUE return(true) else -- Иначе возвращает FALSE return(false) end end --- Функция вызывается терминалом QUIK при получении обезличенной сделки. function OnAllTrade(alltrade) -- Если сделка по нужному инструменту if alltrade.sec_code == SEC_CODE then -- Если началась новая минута, корректирует время последнего бара и возвращает TRUE, иначе FALSE if CheckNewMin(alltrade.datetime) then -- Добавляет/сдвигает ячейки массива при появлении нового минутного бара, корректирует значения и окраску ячеек таблицы AddNewBarToArray5Min() -- Если сделка на продажу, вычитает объем из текущего if bit.test(alltrade.flags, 0) then -- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет SetBalance(Array5Min[#Array5Min] - alltrade.qty, 4) else -- Если сделка на покупку, прибавляет объем к текущему -- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет SetBalance(Array5Min[#Array5Min] + alltrade.qty, 4) end else -- Сделка в текущей минуте -- Если сделка на продажу, вычитает объем из текущего if bit.test(alltrade.flags, 0) then -- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет SetBalance(Array5Min[#Array5Min] - alltrade.qty, 4) else -- Если сделка на покупку, прибавляет объем к текущему -- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет SetBalance(Array5Min[#Array5Min] + alltrade.qty, 4) end end end end -- Функция вызывается когда пользователь останавливает скрипт function OnStop() IsRun = false end |
-- Скрипт выводит в таблицу QLua баланс покупок/продаж -- последних 5-ти 1-минутных свечей, -- окрашивая ячейку в красный если больше продаж, -- в зеленый, если больше покупок -- и в желтый, если покупок и продаж было равное количество -- (c) QuikLuaCSharp.ru CLASS_CODE = "SPBFUT" -- Класс бумаги SEC_CODE = "GZH8" -- Код бумаги IsRun = true Array5Min = {} -- Создает массив для хранения баланса покупок/продаж на последних 5-ти 1-минутных свечах LastBarSeconds = 0 -- Время последнего бара в секундах function main() -- Создает таблицу CreateTable() -- Основной цикл while IsRun do sleep(1) end end --- Функция создает таблицу function CreateTable() -- Получает доступный id для создания t_id = AllocTable() -- Добавляет 5 колонок AddColumn(t_id, 0, "1", true, QTABLE_INT_TYPE, 15) AddColumn(t_id, 1, "2", true, QTABLE_INT_TYPE, 15) AddColumn(t_id, 2, "3", true, QTABLE_INT_TYPE, 15) AddColumn(t_id, 3, "4", true, QTABLE_INT_TYPE, 15) AddColumn(t_id, 4, "5", true, QTABLE_INT_TYPE, 15) -- Создаем t = CreateWindow(t_id) -- Даем заголовок SetWindowCaption(t_id, "Баланс покупок/продаж") -- Добавляет строку InsertRow(t_id, -1) end --- Функции по раскраске ячеек таблицы function Red(col) SetColor(t_id, 1, col, RGB(255,0,0), RGB(0,0,0), RGB(255,0,0), RGB(0,0,0)) end function Yellow(col) SetColor(t_id, 1, col, RGB(240,240,0), RGB(0,0,0), RGB(240,240,0), RGB(0,0,0)) end function Green(col) SetColor(t_id, 1, col, RGB(0,200,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0)) end --- Добавляет/сдвигает ячейки массива при появлении нового минутного бара, корректирует значения и окраску ячеек таблицы function AddNewBarToArray5Min() table.insert(Array5Min, 0) -- Если размер массива стал больше 5, удаляет первый элемент if #Array5Min > 5 then table.remove(Array5Min, 1) end -- (# - длина массива) -- Цикл по элементам массива local Offset = 5 - #Array5Min -- Сдвиг ячеек, если еще нет данных по всем 5-ти барам for i = 1, #Array5Min do -- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет SetBalance(Array5Min[i], i + Offset - 1) end end --- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет, редактирует значение массива function SetBalance(NewBalance, NumCol) SetCell(t_id, 1, NumCol, tostring(NewBalance)) -- Если устанавливается значение последней ячейки if NumCol == 4 then -- То корректируется значение в массиве Array5Min[#Array5Min] = NewBalance end -- Если новое значение < 0, окрашивает в КРАСНЫЙ if NewBalance < 0 then Red(NumCol) end -- Если новое значение = 0, окрашивает в ЖЕЛТЫЙ if NewBalance == 0 then Yellow(NumCol) end -- Если новое значение > 0, окрашивает в ЗЕЛЕНЫЙ if NewBalance > 0 then Green(NumCol) end end --- Если началась новая минута, корректирует время последнего бара и возвращает TRUE, иначе FALSE function CheckNewMin(DealDateTime) -- Переводит время поступившей сделки в секунды (в расчет берется время сделки до минут) DealDateTime.sec = 0 DealDateTime.mcs = 0 local Seconds = os.time(DealDateTime) -- Если сделка прошла на новом минутном баре if Seconds > LastBarSeconds then -- Корректирует время последнего бара LastBarSeconds = Seconds -- Возвращает TRUE return(true) else -- Иначе возвращает FALSE return(false) end end --- Функция вызывается терминалом QUIK при получении обезличенной сделки. function OnAllTrade(alltrade) -- Если сделка по нужному инструменту if alltrade.sec_code == SEC_CODE then -- Если началась новая минута, корректирует время последнего бара и возвращает TRUE, иначе FALSE if CheckNewMin(alltrade.datetime) then -- Добавляет/сдвигает ячейки массива при появлении нового минутного бара, корректирует значения и окраску ячеек таблицы AddNewBarToArray5Min() -- Если сделка на продажу, вычитает объем из текущего if bit.test(alltrade.flags, 0) then -- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет SetBalance(Array5Min[#Array5Min] - alltrade.qty, 4) else -- Если сделка на покупку, прибавляет объем к текущему -- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет SetBalance(Array5Min[#Array5Min] + alltrade.qty, 4) end else -- Сделка в текущей минуте -- Если сделка на продажу, вычитает объем из текущего if bit.test(alltrade.flags, 0) then -- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет SetBalance(Array5Min[#Array5Min] - alltrade.qty, 4) else -- Если сделка на покупку, прибавляет объем к текущему -- Устанавливает в определенную ячейку новое значение и окрашивает ее в соответствующий цвет SetBalance(Array5Min[#Array5Min] + alltrade.qty, 4) end end end end -- Функция вызывается когда пользователь останавливает скрипт function OnStop() IsRun = false end
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!