Избранное трейдера Ray Intraday
На этот счёт на помощь приходят программы (скрипты), чьи задачи заключаются в оптимизации решений некоторых задач, которые возникают у трейдера в процессе торговли.
Постановка проблемы:
Полноценный скальпинг на ММВБ невозможен, если на инструменте отсутствует активность участников и волатильность. Проблему быстрого поиска нужных инструментов может решить команда (зачастую это неэффективно). Я же не люблю торговать в команде, поэтому взялся за написание скринера для Quik, который бы помогал мне хоть как-то решить эту проблему. В дальнейшем думаю создать что-то завязанное на количестве совершенных сделок в момент времени.
В итоге мы имеем два окна (ликвидные и неликвидные акции) с информацией для торговли. В ячейках представлены значения изменение цены по модулю (подобного я ещё нигде не находил). Неважно падает цена или растёт, важно лишь то на сколько она активна. Для себя я выявил кучу способов как это можно использовать. Например перехват разгона неликвидов или поиск повышение активности после обеда / во время обеда. Внимание сконцентрировано именно на более интересных инструментах. С этими окошками можно точно увидеть мёртвые и немёртвые инструменты в данный момент времени. Обновление таблицы происходит ежесекундно, процессор и ОЗУ не сильно нагружается.
function main -- пример работы функции. Приостановка на клиринг local ServerTime = getInfoParam("SERVERTIME") local tTime = {"14:00:00","14:05:00"} -- время начала/окончания неторгового периода local result = diffTime(tTime[1], tTime[2]) if ServerTime>=tTime[1] and ServerTime<=tTime[2] then message("Приостановка работы скрипта на ".. tostring(result).." сек.") sleep(result*1000) -- время приостановки в секундах. Время в Quik в миллисек., поэтому * 1000 end end function diffTime(time1, time2) -- возвращает разницу в секундах между time2-time1; либо 0, если time1 > time2 -- time1 = "14:00:00" -- time2 = "14:05:00" -- result = diffTime(time1, time2) -- = 300 секунд local dt1 = {} local dt2 = {} local dTime1 = 0 local dTime2 = 0 local result = 0 dt1.hour,dt1.min,dt1.sec = string.match(time1,"(%d*):(%d*):(%d*)") for key,value in pairs(dt1) do dt1[key] = tonumber(value) end dt2.hour,dt2.min,dt2.sec = string.match(time2,"(%d*):(%d*):(%d*)") for key,value in pairs(dt2) do dt2[key] = tonumber(value) end --часы*3600 + минуты*60 + секунды. dTime1 = dt1.hour*3600 + dt1.min*60 + dt1.sec dTime2 = dt2.hour*3600 + dt2.min*60 + dt2.sec result = dTime2 - dTime1 if result <= 0 then return 0 else return result end end
— Функция возвращает имя запускаемого скрипта
— может пригодиться для логирования результата (лог_<имя_запускаемого_скрипта>)
scName="" function OnInit(script_path) scName=tostring(get_file_name(script_path)) -- получение полного пути к исполняемому скрипту end function main() message("имя файла = "..scName) end function get_file_name (file) local file_name = file:match("[^\\]*.lua$") -- поиск в строке полного пути к файлу названия скрипта.lua return file_name:sub(0, #file_name - 4) -- обрезка '.lua' в конце строки end