Код скрипта QLua
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 |
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!
Здравствуйте. Пытаюсь вывести в сообщении количество строк в созданной мной таблице, но либо не выходит сообщение, либо выходит ошибка. Вот код:
Что я делаю не так?
message(tostring(rows))
Спасибо за помощь.
Здравствуйте, сделал вывод данных с индикатора в таблицу, судя по документации QLUA ее можно сортировать, но по факту работает только фильтр, подскажите, что не так?
Подскажите пожалуйста как получить значение из 5 колонки? пробую через
что не так?
TABLE GetCell(NUMBER t_id, NUMBER key, NUMBER code)
а у вас "5" это строка
Великолепный и полезный скрипт! Это просто и гениально или просто гениально! Дмитрий, подскажите, какой блок скрипта отвечает за таймфрейм свечек (например, чтобы сделать вместо 1-минутных 5-минутные или 3-минутные свечки)?
За это отвечает функция CheckNewMin, но чтобы сделать не 1-минутный таймфрейм нужно немного логику поменять
Дмитрий! Подскажите, если Вам не трудно, как будет выглядеть условие, которое будет выполняться в случае получения при делении целого числа (например, 60/5=12 - условие выполняется, а 60/7=8,5 - не выполняется). Может есть какая-то специальная математическая функция в QLua?
Остаток от деления %
Огромное спасибо Вам, Дмитрий!
Пожалуйста 🙂
Добрый день!
А можно информацию по сделкам вывести в процентном соотношении в отдельное окно? То есть, если купленных лотов больше, то разность будет показана в отдельном окне, например, в зелёном цвете со значком "+". Если меньше, то в том же окне, но в красном цвете и со значком "-"?
Спасибо!
Здравствуйте, можно.
Я сейчас с помощью Excel тестирую одну стратегию, и если я увижу перспективу, я могу рассчитывать на Вашу помощь? Если да, то каковы тарифы и какие гарантии того, что распоряжаться скриптом смогу только я или тот, кому я разрешу?
На помощь рассчитывать можете.
Тариф на разработку 1000/час: https://quikluacsharp.ru/bez-rubriki/skype-obuchenie-programmirovaniyu-individualnoe/
Гарантия только мои слова, какие еще гарантии я могу дать я не знаю, да и есть ли смысл.
Благодарю!
Всегда пожалуйста!
День добрый!
запустил скрипт, отлично работает!
Но, при экспорте по DDE в эксель приходят нулевые данные.
Даже заполненные когда копирую через CTRL+C и вывожу в эксель - названия столбцов выводятся, а значения нулевые.
Это как то решается?
Здравствуйте, никогда не сталкивался с такой проблемой, даже не знаю что Вам подсказать, к сожалению.