Пост будет полезен только тем, кто кодит на Луа.
---
Написал простенькую функцию, которая работает с архивом графиков Финама. На Финаме есть история торгов за много лет. Это полезно, чтобы прогнать вашу стратегию на максимально доступных исторических данных.
Архив Финама находится здесь:
https://www.finam.ru/profile/moex-akcii/sberbank/export/
---
Заходите по ссылке, видите там:
Там где «Формат записи в файл» выбираете как у меня: DATE,TIME,OPEN,HIGH,LOW,CLOSE,VOL. Можно брать и другие форматы, но тогда код функции придётся переписать.
---
Выбираете вверху даты с 1 января по 31 декабря и год за годом сохраняте себе на компьютер вот так:
Если лень заходить на Финам и сохранять, можете просто скачать архив.
https://yadi.sk/d/83L4VzRx3agH6Z
Распакуйте. Увидите готовые файлы по СБЕРу с 2013 по 2018 (пятиминутки) и сам парсер. Скрипт должен начать работать без каких-либо дополнительных настроек. Скрипт и файлы истории должны лежать в одной папке.
Файл FINAM_PARSER.lua запускается здесь:
Выдаст такой текст в таблице сообщения КВИКа:
---
Код парсера (файл FINAM_PARSER.lua) сопровождается подробными комментариями шаг за шагом.
ticker="SBER"--тикер акции
first_year=2013--первый сохранённый год
last_year=2018--последний сохранённый год. Не должно быть пропущенных лет.
is_run=true--техническая переменная
---
function finam_parser(paper)--функция парсера
giga_table={}--создаём пустую таблицу
for i=first_year,last_year,1 do--крутим цикл с первого заданного года по последнего.
local tmp_path=getScriptPath().."\\"..paper.."_"..i..".txt"--это путь к файлу с историей. getScriptPath получает путь, где лежит скрипт. В этой же папке лежат файлы с историей. Проверка есть ли такой файл, отключена. В моём рабочем роботе это делает функция path.exists. По умолчанию у вас её нет. Надо отдельно скачивать LuaForWindows.
for line in io.lines(tmp_path) do--читаем файл с историей. Чтение идёт свечка за свечкой (строчка за строчкой)
if string.find(line, "20") then--нам нужны только строчки, начинающиеся с цифры 20, (2018 например)
new_line="{"..line.."}"--считали строку, превратили её в таблицу с помощью фигурных скобок и записали в переменную new_line
local t = loadstring("local t = "..new_line.." return t")()--считали из строки мини-таблицу (свечку).
if t[2]>100000 and t[2]<=184000 then--исключаем цены премаркета и пост-маркета.
table.insert(giga_table,t)--вставляем свечу в создаваемую гигантскую таблицу giga_table
end
end
end
message(tmp_path.." полей в таблице="..#giga_table,1)--КВИК выдаст сообщение: путь к файлу и текущий размер таблицы giga_table
end
return giga_table--парсер возвращает удобную таблицу giga_table, с которой можно дальше работать.
end
function main()--основная функция КВИКа.
finam_parser(ticker)--запускаем парсер с указанным тикером.
message (ticker..": giga_table принята")
message ("посчитаю что нибудь")
max_range=0--задали переменную. Будем искать свечу, у которой наивысшее расстояние между high и low
for i=1,#giga_table do
local range=giga_table[i][4]-giga_table[i][5]
if range>max_range then
max_range=range
data=giga_table[i][1]
vremya=giga_table[i][2]
end
end
message("Самая длинная свеча High-Low="..max_range.." была "..data.." "..vremya)
message("The End")
end
function OnStop(s) --что делать при нажатии на кнопку "остановить"
is_run=false--прерываем вечный цикл внутри main
return 100--число возле return - это время в миллисекундах. Если выставить этот параметр, скрипт будет удобнее останавливаться (без подвисаний)
end
Всем удачных исследований!