Re: Подсчёт спреда
for i=0,#SEC do
message(SEC[i],1)
end
у вас не так?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
QUIK -> DDE → Lua: учебники, общие вопросы → Подсчёт спреда
Чтобы отправить ответ, вы должны войти или зарегистрироваться
for i=0,#SEC do
message(SEC[i],1)
end
у вас не так?
Порядок перебора таблицы видимо зависит от внутреннего формата хранения этой таблицы.
Я как-то не знаю как задать строго определенный перебор таблицы в Lua, но ест подозрение, что если в качестве ключа использовать ценые числа - то порядок перебора должен совпадать с ними, правда это потребует небольшой переделки скрипта... мне надо несного времени, чтобы сооразить/поправить.
О! в тырнетах попалось с ходу [url=http://ilovelua.narod.ru/about_lua.html]следующее[/url]:
Важный момент: пока возможно, Lua внутри себя таблицу хранит как массив, а не как хэш - таблицу. Соответственно доступ к элементам таблицы происходит почти так же быстро, как в массивах Си. Поэтому без особой нужды не стоит превращать массив в хэш. Для того, чтобы не нарушать структуру при добавлении и удалении элементов массива стоит пользоваться библиотекой Lua table.
Т.е. надо изменить формат задания исходного списка на какой-то такой:
SEC = {
{"APTK" = "EQNL"},
{"AVAZP" = "EQNL"}
}
т.е. преобразовать в массив таблиц, вероятно он будет перебираться циклом for ... in pairs согласно изнчально заданной последовательности.
Я вот только не соображу как теперь цикл подправить-то...
Вот такой вариант, думаю, сработает, но наверняка есть изящнее решение.
function OutSpreadToLog()
local file = io.open(logFileName, "a+t")
local i,sec,e1,e2
for e1,e2 in pairs(SEC) do
for sec,class in pairs(e2) do
local qt = getQuoteLevel2(class, sec)
if ((qt.bid_count+0 > 0) and (qt.offer_count+0 > 0)) then
.............
(поправленные строчки выделил)
Ну и соответственно вставить перед file:write("---\n") еще один end.
Сразу скажу - не проверял, за работоспособность не ручаюсь.
function AnIndexOf(t,val)
for k,v in ipairs(t) do
if v == val then return k end
end
end
....
for i=0,#SEC do
message(SEC[AnIndexOf(SEC,SEC[i])],1)
end
может имелось в виду такое, или я уже спать хочу и думаю не в ту сторону
for i=0,#SEC do message(SEC[i],1) end
у вас не так?
в коде автора я менял только строчку финального вывода в файл и у меня бот обращается к ТТП а не к стакану.
Т.е. надо изменить формат задания исходного списка на какой-то такой:
SEC = { {"APTK" = "EQNL"}, {"AVAZP" = "EQNL"} }
Да, такой формат как раз позволяет сохранить порядок размещения элементов в таблице (массиве). Только в синтаксисе ошибочка. Надо так:
SEC = {
{["APTK"] = "EQNL"},
{["LKOH"] = "EQBR"},
{["AVAZP"] = "EQNL"}
}
(обратите внимание, внутри после } везде стоят запятые, кроме последней строчки!)
Цикл поправить так:
function OutSpreadToLog()
local file = io.open(logFileName, "a+t")
local i,sec,n,dat
for n,dat in ipairs(SEC) do
sec,class = next(dat)
local qt = getQuoteLevel2(class, sec)
if ((qt.bid_count+0 > 0) and (qt.offer_count+0 > 0)) then
.............
Никакого end добавлять уже не придется, т.к. никакого нового цикла не добавляем, он не нужен.
Спасибо, всё работает!
Здравствуйте, я по шаблону для расчета среда сделала код для расчета High, Low за короткий промежуток времени, но получить нужные значения так и не получается, выводятся все сделки за интервал времени а выделить из них High, Low не могу
PERIOD = 15 -- период обновления, в секундах
function ReadLogFile()
nnn = 0
message("Readed " .. tostring(nnn) .. " record(s)")
end
function OnInit(path)
scriptPath = path
logFileName = scriptPath .. ".log"
is_run = true
message("Start " .. logFileName)
ReadLogFile()
end
function OnStop()
is_run = false
end
function prevAllTrade()
local _prev=getNumberOf("all_trades")
return function ()
local ret_value = _prev
_prev=getNumberOf("all_trades")
return ret_value
end
end
prev_value=prevAllTrade()
function extreme()
trades={}
dlt = getNumberOf("all_trades") - prev_value()
m = getNumberOf("all_trades")
for i=m-dlt, m-1 do
trades=getItem("all_trades", i)
price = trades.price
High = math.max(trades.price)
Low = math.min(trades.price)
message(" value2=High: " .. tostring(High) .. " Low:" .. tostring(Low), 2)
end
end
function main()
while is_run do
local n = PERIOD
prevAllTrade()
extreme()
while (n > 0) and is_run do
sleep(1000)
n = n - 1
end
end
end
подскажите в каком направлении искать.
shaly, приветствую вас на форуме!
По вашему вопросу:
1) Проинициализируйте глодальные переменные в начале скрипта, например так:
High = -1
Low = 10000000
2) В функции math.max и math.min надо передавать несколько аргументов (хотя бы 2), из которых и будет выбираться максимум/минимум. Например, поправить код функции extreme() так:
function extreme()
trades={}
dlt = getNumberOf("all_trades") - prev_value()
m = getNumberOf("all_trades")
for i=m-dlt, m-1 do
trades=getItem("all_trades", i)
price = trades.price
High = math.max(price, High)
Low = math.min(price, Low)
end
message(" value2=High: " .. tostring(High) .. " Low:" .. tostring(Low), 2)
end
За одно вынес из цикла message, зачем он там, пусть печатает только один раз результат после пробега по очередной порции всех сделок.
спасибо, так расчитывает High и Low, но только не за период, а с момента запсука скрипта, но все равно спасибо
Так вы напишите как вам надо - постараемся помочь. Пока не понятно.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
QUIK -> DDE → Lua: учебники, общие вопросы → Подсчёт спреда
Форум работает на PunBB, при поддержке Informer Technologies, Inc