26

Re: Подсчёт спреда

for i=0,#SEC do
      message(SEC[i],1)
end

у вас не так?

27

Re: Подсчёт спреда

Порядок перебора таблицы видимо зависит от внутреннего формата хранения этой таблицы.
Я как-то не знаю как задать строго определенный перебор таблицы в 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.

Сразу скажу - не проверял, за работоспособность не ручаюсь.

28 (2013-02-14 00:31:51 отредактировано sam)

Re: Подсчёт спреда

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

может имелось в виду такое, или я уже спать хочу и думаю не в ту сторону

29

Re: Подсчёт спреда

sam пишет:
for i=0,#SEC do
      message(SEC[i],1)
end

у вас не так?

в коде автора я менял только строчку финального вывода в файл и у меня бот обращается к ТТП а не к стакану.

30

Re: Подсчёт спреда

admin пишет:

Т.е. надо изменить формат задания исходного списка на какой-то такой:

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 добавлять уже не придется, т.к. никакого нового цикла не добавляем, он не нужен.

31

Re: Подсчёт спреда

Спасибо, всё работает!

32

Re: Подсчёт спреда

Здравствуйте, я по шаблону для расчета среда сделала код для расчета 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

подскажите в каком направлении искать.

33

Re: Подсчёт спреда

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, зачем он там, пусть печатает только один раз результат после пробега по очередной порции всех сделок.

34 (2013-08-01 16:36:05 отредактировано shaly)

Re: Подсчёт спреда

спасибо, так расчитывает High и Low, но только не за период, а с момента запсука скрипта, но все равно спасибо

35

Re: Подсчёт спреда

Так вы напишите как вам надо - постараемся помочь. Пока не понятно.