Хочу сделать скрипт, сохраняющий в файл историю, как с Финама (потом сравню ;-) ). Думаю сделать это по данным свечей графика (а как-то иначе можно?).
Для начала помогите, пожалуйста, разобраться с таблицами. Планирую сделать таблицу, в которую потом будут помещены данные всех свечей с графика. Нужны: год, месяц, число, час, минута, OHLC. На Си я бы описал структуру с OHLC и прочим, затем объявил бы массив таких структур. А как сделать это на Lua?
Рекомендую 1) поставить на комп луа со SciTE. 2) без квика на луа сделать простые примеры с таблицами, с циклами, с печатью c фалами. 3)После того, как будет все понятно и просто, переходите к чтению документации по QLua и делайте простые примеры но на квике с таблицами циклами файлами. 4) После того, как будет все понятно и просто, переходите без луа и без квика к написанию своего алгоритма. 5) После того, как будет все понятно и просто с алгоритмом, переходите в QUIK и пишите на луа то о чем мечтаете. Успехов в обучении
s_mike@rambler.ru пишет: Создайте таблицу с целочисленными индексами и присваивайте по этим индексам таблицы с нужными вам полями.
С этим разобрался.
Теперь подскажите, пожалуйста, как получать год, месяц, число, час, минута, OHLC для свечи? Пытался по справке разобраться, по разделу "Функции для доступа к источнику данных" и "Функции O, H, L, C, V, T", но там всё очень сумбурно - не понял.
s_mike@rambler.ru пишет: Создайте таблицу с целочисленными индексами и присваивайте по этим индексам таблицы с нужными вам полями.
С этим разобрался.
Теперь подскажите, пожалуйста, как получать год, месяц, число, час, минута, OHLC для свечи? Пытался по справке разобраться, по разделу "Функции для доступа к источнику данных" и "Функции O, H, L, C, V, T", но там всё очень сумбурно - не понял.
разбирайте возврат функции T(). Это таблица, описывающая время
s_mike@rambler.ru пишет: Создайте таблицу с целочисленными индексами и присваивайте по этим индексам таблицы с нужными вам полями.
С этим разобрался.
Теперь подскажите, пожалуйста, как получать год, месяц, число, час, минута, OHLC для свечи? Пытался по справке разобраться, по разделу "Функции для доступа к источнику данных" и "Функции O, H, L, C, V, T", но там всё очень сумбурно - не понял.
Здравствуйте, Задачу можно решить без открытия окна с графиком, через функции CreateDataSource и SetUpdateCallback Пример есть в руководстве QLUA.chm -Функции взаимодействия скрипта Lua и Рабочего места QUIK --Функции для работы с графиками ---SetUpdateCallback
А я уж начал с getCandlesByIndex возиться... Все темы на этом форуме, в инете, которые через поиск нашел посмотрел, но не нашёл инфу о структуре TABLE t, которую возвращает эта функция. Может, кто подскажет?
Цитата
Sergey Gorokhov пишет: Задачу можно решить без открытия окна с графиком, через функции CreateDataSource и SetUpdateCallback
А это не "из пушки по воробьям"? Мне всего-то надо раз в день сохранить в файл истории новые данные.
Некто пишет: А я уж начал с getCandlesByIndex возиться... Все темы на этом форуме, в инете, которые через поиск нашел посмотрел, но не нашёл инфу о структуре TABLE t, которую возвращает эта функция. Может, кто подскажет?
Попробуйте поискать например в документации Qlua.chm -Функции для работы с графиками --Функции для работы с графиками ---Функции O, H, L, C, V, T
Цитата
Время свечи возвращается с точностью до миллисекунд в виде таблицы с полями: {year, month, day, week_day, hour, min, sec, ms, count}
Цитата
Некто пишет: А это не "из пушки по воробьям"? Мне всего-то надо раз в день сохранить в файл истории новые данные.
Нет это не "из пушки по воробьям" а вполне нормальный доступ к данным.
Sergey Gorokhov пишет: Попробуйте поискать например в документации Qlua.chm
Я нашёл нужную инфу и закодировал раньше, чем прочёл написанные Вами строки :D
Цитата
Sergey Gorokhov пишет: Нет это не "из пушки по воробьям" а вполне нормальный доступ к данным.
Изучать 2 функции, кодировать код с колбэком, изучать "то что создается функцией CreateDataSource", и т. д. и т. п. вместо элементарного использования getCandlesByIndex? Теперь понятно, почему Quick такой глючный - его программируют не по KISS, а по "вполне нормальным" принципам.
Теперь мне надо форматированно сохранять данные из таблицы в файл истории. Я подозреваю, что форматирование будет сложнее того, что я делал на Lua раньше.
Некто пишет: вместо элементарного использования getCandlesByIndex?
Так в чем проблема, используйте getCandlesByIndex если он больше нравится.
Кстати у нас даже готовый пример есть:
Скрытый текст
Код
--[[
Что делает:
Сохраняет график в текстовый файл.
Формат файла такой:
<DATE>;<TIME>;<OPEN>;<HIGH>;<LOW>;<CLOSE>;<VOL>
Как использовать:
Постройте график
В параметрах графика, зайдите на вкладку 'Дополнительно'.
В поле 'Идентификатор' укажите уникальный идентификатор этого графика. По умолчанию GRAPH
Точно такой же идентификаор укажите в переменной TAG
]]
-------------------------------НАСТРОЙКИ-------------------------------
TAG='GRAPH' --Идентификатор графика
separator = ',' --Разделитель колонок
GraphPath=getScriptPath() --папка в которую будет записываться файл с графиком
-----------------------------------------------------------------------
-------------------------------ТО ЧТО НИЖЕ, ТРОГАТЬ НЕ НАДО------------------------------------------------------------------
tbl = {
[1]='DATE', --Дата свечи
[2]='TIME', --Время свечи
[3]='OPEN', --Цена открытия
[4]='HIGH', --Максимальная цена
[5]='LOW', --Минимальная цена
[6]='CLOSE', --Цена закрытия
[7]='VOL' --Объем
}
WORK = true
file = nil
last_candle=0
first_candle=0
function OnInit()
WORK = true
end
function OnStop()
WORK = false
end
function FTEXT(int)
local Output = ""
if int<10 then
Output = "0"
end
return Output .. tostring(int)
end
function dt2str(dt)
return {['DATE']=FTEXT(dt.year)..FTEXT(dt.month)..FTEXT(dt.day), ['TIME']=FTEXT(dt.hour)..FTEXT(dt.min)..FTEXT(dt.sec)}
end
function main()
local line = 0
local t, n, l = getCandlesByIndex(TAG, line, 0, 1)
if n>0 then
local file = io.open(GraphPath..'\\'..l..'.csv', 'w+')
file:write(table.concat(tbl,separator) .. '\n')
file:flush()
while WORK do
last_candle = getNumCandles(TAG)-1
if last_candle>first_candle then
local t, n, l = getCandlesByIndex(TAG, line, first_candle, last_candle-first_candle)
for i=0,n-1 do
tbl = {
[1]=dt2str(t[i].datetime).DATE, --Дата свечи
[2]=dt2str(t[i].datetime).TIME, --Время свечи
[3]=tostring(t[i].open), --Цена открытия
[4]=tostring(t[i].high), --Максимальная цена
[5]=tostring(t[i].low), --Минимальная цена
[6]=tostring(t[i].close), --Цена закрытия
[7]=tostring(t[i].volume) --Объем
}
file:write(table.concat(tbl,separator) .. '\n')
file:flush()
end
first_candle=last_candle
end
end
file:close()
end
end
Sergey Gorokhov пишет: Кстати у нас даже готовый пример есть:
Просматривая код скрипта, я сразу обратил внимание, что в нём без нужды используется OnInit(), OnStop(), while WORK do. Я делаю без этого. Запустил скрипт, жду... А он всё работает и работает... Пришлось останавливать. А выход из while WORK do ... end сделать нельзя?
Sergey Gorokhov пишет: Кстати у нас даже готовый пример есть:
Просматривая код скрипта, я сразу обратил внимание, что в нём без нужды используется OnInit(), OnStop(), while WORK do. Я делаю без этого. Запустил скрипт, жду... А он всё работает и работает... Пришлось останавливать. А выход из while WORK do ... end сделать нельзя?
Скрипт написан так чтобы постоянно записывать свежие данные. Если это не устраивает никто не запрещает написать так как Вам нужно. Следует понимать разницу между примером и готовой программой под Ваши задачи.
В своём скрипте сначала вызываю getNumCandles(), потом getCandlesByIndex(), потом сравниваю кол-во свечей, которые они вернули. Для графика Сбера периодов 1 и 2 мин они равны. Для Si getNumCandles() в 21:30 возвращает бОльшее число. Возможно, это связано с тем, что на FORTS после 19:00 начинается новая сессия?
Некто пишет: Для графика Сбера периодов 1 и 2 мин они равны. Для Si getNumCandles() в 21:30 возвращает бОльшее число. Возможно, это связано с тем, что на FORTS после 19:00 начинается новая сессия?
Некто пишет: Хочу сделать скрипт, сохраняющий в файл историю, как с Финама (потом сравню ).
Как я и хотел, скрипт сохраняет в файл историю в том же формате, что и один из возможных при скачивании с Финама. Есть только одна сложность: в текущей версии мой код просто сохраняет данные всех свечей на минутном периоде. Чтобы сравнить с файлами Финама, пришлось в текстовом редакторе вырезать данные по трём дням в отдельные файлы. Сравнил - они совпадают байт-в-байт. Чтобы не возиться с редактированием в текстовом редакторе, я хотел установить через контекстное меню графика Квика ограничение - отображать график за один день, сохранять моим скриптом его данные в файл, потом сравнивать с файлом с Финама с данными за тот же день. На графике, при настройке в контекстном меню отображать данные за один день, отображаются данные по фьючерсам только до вечерней сессии (кажется, до 18:49). Но мне-то надо до 23:49!
Вопрос: можно ли как-то настроить в Квике отбражение минутных графиков фьючерсов с 10:00 до 23:49?
Если нет, то придётся мне совершенствовать код, чтобы он сам сохранял историю за каждый день по отдельным файлам.
Некто пишет: В своём скрипте сначала вызываю getNumCandles(), потом getCandlesByIndex(), потом сравниваю кол-во свечей, которые они вернули. Для графика Сбера периодов 1 и 2 мин они равны. Для Si getNumCandles() в 21:30 возвращает бОльшее число.
Старатель пишет: В обоих случаях должно возвращаться одинаковое число свечей. Если это не так, - ищите ошибку у себя.
Интересно, кто прав? :)
Цитата
Старатель пишет: В настройках графика нет пункта "отображать данные за один день", но есть настройка Intra-day, где указывается нужное время.
Хотел вставить скриншот, но сценарий страницы глючит, даже браузер "не отвечает". На словах объясню. Можете без ЭЦП и без подключения к серверу Квик запустить - там ищите. Контекстное меню графика - "Параметры текущего окна" - появится окно "Настройка параметров диаграммы" - вкладка "Диаграмма" - " Показывать графики" есть пункт "выбрать с" - можно выбрать на определённый день, но только до 18:45, так что, хоть там и
Цитата
Старатель пишет: нет пункта "отображать данные за один день"
однако, есть пункт с другим названием, но отображающий данные именно за один день.
Цитата
Старатель пишет: есть настройка Intra-day, где указывается нужное время.
Видимо, это может подойти тем, кто каждый день будет сохранять историю после 23:49. Приятного им времяпрепровождения.
Некто пишет: Контекстное меню графика - "Параметры текущего окна" - появится окно "Настройка параметров диаграммы" - вкладка "Диаграмма" - " Показывать графики" есть пункт "выбрать с" - можно выбрать на определённый день, но только до 18:45
Там можно выбрать любое время. Это поле редактируемое.
Старатель пишет: есть настройка Intra-day, где указывается нужное время.
Видимо, это может подойти тем, кто каждый день будет сохранять историю после 23:49 . Приятного им времяпрепровождения.
Сохранять историю с помощью getCandlesByIndex, изменяя каждый раз дату-время графика в настройках, - в любом случае не самое приятное времяпрепровождение :D Проще сохранять историю с помощью CreateDataSource: написал скрипт, запустил один раз и забыл. Остальное он сам сделает.
Надо делать так, как надо. А как не надо - делать не надо.