1 (2024-10-15 14:21:09 отредактировано AgentSmit)

Тема: Проблема с обновлением данных в таблице созданной из Lua (Решено)

Уже 3 часа пытаюсь понять в чем причина. Не обновляются данные в таблице, пока не проведу по ней мышью.

Код уж совсем простой и тут какие-то у меня не понятки вышли. Может кто сталкивался с такой проблемой. Данные через message() идут нормально, а вот в таблице не обновляются пока окно таблицы не получит какое-либо сообщение

Сам код:

-- Переменны для замены на данные хранящиеся в настройках скрипта
local secCode = "MMZ4"

local atrID = "MXI_ATR"
local priceID = "MXI_PRICE"

--Переменные для замены на данные получаемые из терминала
local digit = 2

--Переменные глобальных таблиц и окон
local tableMain = nil
local hwndMain = nil

local isRun = true
function main()
    message("Hello. This is MambaBot",1)
    while isRun do
        if tableMain ~= nil then
            if IsWindowClosed(tableMain) then
                isRun = false
            end            
        end
        sleep(1000)
    end
    message("MambaBot has stopped")
end

function OnParam(class, sec)
    if(class=="SPBFUT" and sec==secCode) then
        if tableMain ~= nil then
            --Обновляем данные в ячеках главной таблицы
            SetCell(tableMain, 2, 1, getInfoParam("SERVERTIME"), 0)
            --message(getInfoParam("SERVERTIME"))
            local atrVal, count, legend
            atrVal, count, legend = getCandlesByIndex(atrID, 0, getNumCandles(atrID) - 1, 1)
            SetCell(tableMain, 7, 1, string.format("%." .. digit .. "f", atrVal[0].close), atrVal[0].close)

            local priceCandleVal
            priceCandleVal, count, legend = getCandlesByIndex(priceID, 0, getNumCandles(priceID) - 1, 1)
            print(count)
            SetCell(tableMain, 3, 1, string.format("%." .. digit .. "f", priceCandleVal[0].open), priceCandleVal[0].open)
            SetCell(tableMain, 4, 1, string.format("%." .. digit .. "f", priceCandleVal[0].high), priceCandleVal[0].high)
            SetCell(tableMain, 5, 1, string.format("%." .. digit .. "f", priceCandleVal[0].low), priceCandleVal[0].low)
            SetCell(tableMain, 6, 1, string.format("%." .. digit .. "f", priceCandleVal[0].close),
                priceCandleVal[0].close)
            message(string.format("%." .. digit .. "f", priceCandleVal[0].close))
        end
    end
end

function OnInit(script_path)

    tableMain = AllocTable()
    AddColumn(tableMain,0,"param",true,QTABLE_STRING_TYPE,12)
    AddColumn(tableMain,1,"value",true,QTABLE_STRING_TYPE,12)

    hwndMain = CreateWindow(tableMain)
    SetWindowCaption(tableMain,"MambaBot Main")
    local rowNum = 1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,"Sec code",0)
    SetCell(tableMain,rowNum,1,secCode,0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,"Time",0)
    SetCell(tableMain,rowNum,1,"00:00:00",0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,"Open",0)
    SetCell(tableMain,rowNum,1,"0.0",0.0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,"High",0)
    SetCell(tableMain,rowNum,1,"0.0",0.0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,"Low",0)
    SetCell(tableMain,rowNum,1,"0.0",0.0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,"Close",0)
    SetCell(tableMain,rowNum,1,"0.0",0.0)
    rowNum = rowNum+1

    InsertRow(tableMain,-1)
    SetCell(tableMain,rowNum,0,"ATR value",0)
    SetCell(tableMain,rowNum,1,"0.0",0.0)
    rowNum = rowNum+1
end

function OnStop(flag)
    if tableMain ~=nil then
        DestroyTable(tableMain)
    end
    isRun = false
    return 100
end

Это всего лишь набросок будущего робота, просто на скоряк кодил, вспоминал как работать с таблицами и получением данных

2 (2024-10-15 13:53:46 отредактировано AgentSmit)

Re: Проблема с обновлением данных в таблице созданной из Lua (Решено)

Не знаю в чем проблема. Но пришлось добавить такой костыль, сразу после записи новых данных в таблицу:

 if tableMain ~= nil then
        InsertRow(tableMain, -1)
        local rowsCount = GetTableSize(tableMain)
        DeleteRow(tableMain,rowsCount)
end

Т.е. после обновления данных в таблице, создаем пустую строку и удаляем ее. Во время работы скрипта, пустая строка даже не успевает отобразиться