1 (2015-04-29 14:11:18 отредактировано slkumax)

Тема: Lua. Выгрузить свечи в файл.

Суть проста- я хотел бы чтобы LUA скрипт каждый день мне выгружал свечи минутки по нужному инструменту в файл. И "дозаписывал" этот файл.
Идеально было бы например в Excel или базу данных.
Но для начала хотя бы в txt файл.

Плюс к этому было бы хорошо, чтобы он и внутри себя имел массив свечей минуток. Ну т.е нажал кнопку "загрузить", и дальше можно внутри скрипта увидеть таблицу минуток и с ней работать.
Пока не могу понять с какой стороны подойти к этому вопросу.
Хотя бы как из Quik в LUA забрать значения свечек минуток сразу?

2 (2015-04-29 18:26:25 отредактировано kalikazandr)

Re: Lua. Выгрузить свечи в файл.

slkumax пишет:

Хотя бы как из Quik в LUA забрать значения свечек минуток сразу?

local n = getNumCandles(ind)--кол-во свечек, где ind = идентификатор графика
local t, res, _ = getCandlesByIndex (ind, 0, 0, n)--получаем все свечи
или так:
local t, res, _ = getCandlesByIndex (ind, 0, n - 500, 500)--получить последние 500 свечей (для справки)

--t - таблица со свечками, res - длина таблицы, _ - легенда (подпись) графика
--t[0] - первая свеча
--t[res-1] - последняя свеча
если проделать такой трюк:
t[0] = nil,
то получим обычный массив Lua и скорость работы с таблицей чуть увеличится, но вы этого не заметите ))

3

Re: Lua. Выгрузить свечи в файл.

kalikazandr пишет:
slkumax пишет:

Хотя бы как из Quik в LUA забрать значения свечек минуток сразу?

local n = getNumCandles(ind)--кол-во свечек, где ind = идентификатор графика
local t, res, _ = getCandlesByIndex (ind, 0, 0, n)--получаем все свечи
или так:
local t, res, _ = getCandlesByIndex (ind, 0, n - 500, 500)--получить последние 500 свечей (для справки)

--t - таблица со свечками, res - длина таблицы, _ - легенда (подпись) графика
--t[0] - первая свеча
--t[res-1] - последняя свеча
если проделать такой трюк:
t[0] = nil,
то получим обычный массив Lua и скорость работы с таблицей чуть увеличится, но вы этого не заметите ))


Спасибо большое. А какой формат этой таблицы свечек?

Я на данный момент реализовал вот таким способом:
function BazToGrZap()
    Baz = CreateDataSource(CLASS, SEC, INTERVAL_M1)
    Raz=Baz:Size()
    for is=1, Raz do
    Open=Baz:O(is)
    Hight=Baz:H(is)
    Close=Baz:C(is)
    Low=Baz:L(is)
    Day=Baz:T(is).day
    Month=Baz:T(is).month
    Year=Baz:T(is).year
    DateTime=
    gridBaza:SetCell(2,is,SEC)
    gridBaza:SetCell(3,is,Open)
    gridBaza:SetCell(4,is,Hight)
    gridBaza:SetCell(5,is,Low)
    gridBaza:SetCell(6,is,Close)
    gridBaza:SetCell(0,is,Day)
    end   


И пока не понимаю как "суммировать год, месяц, день  и часы, минуты и секунды, чтобы представить их в двух столбцах таблицы.

4 (2015-04-29 18:52:35 отредактировано kalikazandr)

Re: Lua. Выгрузить свечи в файл.

slkumax пишет:

И пока не понимаю как "суммировать год, месяц, день  и часы, минуты и секунды, чтобы представить их в двух столбцах таблицы.

local FTEXT = function (V)
    V=tostring (V)
    if string.len (V) == 1 then V = "0".. V end
    return V 
end

local bar = t[1]
local datetime = bar.datetime
local DATE = (datetime.year .. FTEXT (datetime.month) .. FTEXT (datetime.day)) + 0 --число (ГГГГММДД)
local DATE = datetime.year .. "." .. FTEXT (datetime.month) .. "." ..  FTEXT (datetime.day) --строка (ГГГГ.ММ.ДД)
local TIME = (datetime.hour .. FTEXT (datetime.min) .. FTEXT (datetime.sec)) + 0 --число HHMMSS
local TIME = datetime.hour .. ":" .. FTEXT (datetime.min) .. ":" .. FTEXT (datetime.sec) --строка HH:MM:SS

в вашем примере аналогично, FTEXT у меня локальная, поставьте выше строк с ее использованием

5

Re: Lua. Выгрузить свечи в файл.

Спасибо огромное!

6

Re: Lua. Выгрузить свечи в файл.

Следующим шагом понять, как сделать чтобы робот дозаписывал в файл только новые данные. Два раза в сутки например.

7 (2015-04-29 19:43:34 отредактировано kalikazandr)

Re: Lua. Выгрузить свечи в файл.

slkumax пишет:

Следующим шагом понять, как сделать чтобы робот дозаписывал в файл только новые данные. Два раза в сутки например.

нзч.
а зачем? если не лень, откройте все интересующие вас графики, пропишите идентификатор (пару часов убъете, если много инструментов и разные тайм фреймы)
и что-то вроде этого:

local table_remove, string_len = table.remove, string.len
local FTEXT = function (V)
    V=tostring (V)
    if string_len (V) == 1 then V = "0".. V end
    return V  
end
---------------------------------------
local path = getScriptPath ()
s_list = {SBER,GAZP,GMKN}
ind_list = {SBER = ind1, GAZP = ind2, GMKN = ind3}
---------------------------------------
local findStartDayBar =  function (ind)
  local t, res, _ = getCandlesByIndex (ind, 0, getNumCandles(ind) - 500, 500)--500 свечей достаточно
  t[0] = nil--делаю массив из t
  local tt = t
  for i = 1, #tt do
    local bar = tt[i]
    local datetime = bar.datetime
    if datetime.hour + 0 = 10 then break end
    table_remove (t,i)--удаляю свечи вчерашнего дня
  end
  return t--возвращаю с 100000 -вым баром в качестве первого
end

for i = 1, #s_list do
  local sec = s_list[i]
  local ind = ind_list[sec]
  local tab = findStartDayBar (ind)
  local file = path.."\\" .. sec .. ".CSV"
  local f = io.open(file, "a+")--в режиме до записи
  for j = 1, #tab do
    local bar = tab[j]
    local datetime = bar.datetime
    local DATE = datetime.year .. FTEXT (datetime.month) .. FTEXT (datetime.day)
    local TIME = datetime.hour .. FTEXT (datetime.min) .. "00" --минутки - секунды не обязательны?
    local wr = DATE .. ";" .. TIME .. ";" .. bar.open .. ";" .. bar.high .. ";" .. bar.low .. ";" .. bar.close
    f:write(wr)
  end
  f:flush()
end
f:close()
do message("запись завершена",2) end

не проверял, писал прямо тут, но должно работать можно запускать в конце дня, можно добавить фильтр цены закрытия сессии. В экселе разделитель целой и дробной части поставьте "точку".
Да, в качестве идентификатора графика удобно использовать sec_code инструмента:
SBER -дневной график;
SBERm1 - минуточный
тогда ind = sec .. "m1"

8

Re: Lua. Выгрузить свечи в файл.

kalikazandr пишет:
slkumax пишет:

Хотя бы как из Quik в LUA забрать значения свечек минуток сразу?

local n = getNumCandles(ind)--кол-во свечек, где ind = идентификатор графика
local t, res, _ = getCandlesByIndex (ind, 0, 0, n)--получаем все свечи
или так:
local t, res, _ = getCandlesByIndex (ind, 0, n - 500, 500)--получить последние 500 свечей (для справки)

--t - таблица со свечками, res - длина таблицы, _ - легенда (подпись) графика
--t[0] - первая свеча
--t[res-1] - последняя свеча
если проделать такой трюк:
t[0] = nil,
то получим обычный массив Lua и скорость работы с таблицей чуть увеличится, но вы этого не заметите ))


А какой формат у этой таблицы? Т.е как обратиться например к Hight свечи?

9 (2015-04-29 19:50:18 отредактировано kalikazandr)

Re: Lua. Выгрузить свечи в файл.

slkumax пишет:

А какой формат у этой таблицы? Т.е как обратиться например к Hight свечи?

а вот выше посмотрите ))
local bar = t[20]--20 свеча в таблице по счету,
key = datetime, open, high, low, close, volume
local high = bar.high