Nikolay (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 След.
Перестали скачиваться тиковые данные
 
Не замечал такой проблемы на этой версии.
Единственное что, я не останавливаю поток через sleep.
После заказа идет возврат в main и периодически проверяется все ли данные загружены. Приходят долго, но приходят.
Quik 8.6 Critical error ACCESS_VIOLATION
 
Нет, не в колбеках.

Вот схематичный скрипт, падающий с этой ошибкой.

Код
local sleep  = _G.sleep
local isRun  = true

function _G.main()

    local sec_code = 'SRZ0'
    local class_code = 'SPBFUT'

    local ds = _G.CreateDataSource(class_code, sec_code, _G.INTERVAL_M5)
    if not ds then
        isRun = false
    end

    local index = 0
    if isRun then
        while isRun do
            local last = ds:Size()
            if last ~= 0 then
                while index < last-1 do
                    index = index + 1
                    ds:T(index)
                end
                ds:Close(last)
                ds:T(last)
            end
            sleep(100)
        end
    end
end

Он с ошибкой, как у меня было (Close вместо C). Но хотелось бы внятного сообщения, типа - попытка индексировать значение nil.

И еще особенность: скрипт, упавший с этой ошибкой повторно не запустить, кнопка "Запустить" не активна. Приходится удалять и заново добавлять.
Quik 8.6 Critical error ACCESS_VIOLATION
 
Отмена тревоги.
В одном месте была ошибка вызова. Вместо ds:C() вызвано ds:Close().
Quik 8.6 Critical error ACCESS_VIOLATION
 
Сегодня тоже первый раз (за все время использования версий > 8.5) словил такую ошибку на 8.8.4.3.

При этом это не тики, а M5, и произошла она на уже загруженных данных. Т.е. это была новая порция, скорее всего. Индекс бара фиксируется в переменной перед чтением.

Скрипт упал, хотя часть кода работы с свечками обернута pcall.

С другой стороны, никакой доп. информации нет, поэтому пока могу предположить, что это именно доступ к барам, как и в примере выше. Но кто знает, что это было на самом деле.
Хотелось бы, конечно, чтобы секции pcall давали больше информации.
Использование памяти скриптами Lua
 
Это безумно много. Если только Вы не храните в таблицах обезличенные сделки или некие расчеты на огромное число ключей.
Но даже с этим больше 50-100 мб. это явно где-то утечка.
Возможно часто получаются данные произвольных таблиц.

Я на > 8.5 версиях больше 70 мб. не получал. При 20 мб. я уже начинаю отлаживать и исправлять утечки памяти или оптимизировать код.
Зависание QUIK
 
А почему она там должна выскочить? Если колбек выполняется, то там 1, а если висит основной поток, то, по идее, колбек не выполнится.
Либо, можно предположить, что после "отвисания" он просто вызовет все колбеки в очереди. Последовательно.
Преобразование целого числа в строку в QUIK 8.8+
 
Только сейчас увидел, что Вы пытаетесь сделать.
lua не может преобразовать double с таким числом цифр как 9152336732254970146.0

4-ое издание Programming in Lua, глава 4 (https://www.moys.gov.iq/upload/common/Programming_in_Lua%2C_4th_ed._%282017%29_.pdf)

For floating-point numbers, Standard Lua uses double precision. It represents each number with 64 bits, 11of which are used for the exponent. Double-precision floating-point numbers can represent numbers withroughly 16 significant decimal digits, in a range from -10308 to 10308. (Small Lua uses single-precisionfloats, with 32 bits. In this case, the range is from -1038 to 1038, with roughly seven significant decimaldigits.)

Any  integer  up  to  2^53  (which  is  9007199254740992)  has  an   exact  representation  as  a  double-precisionfloating-point number.  Integers with larger absolute values may lose precision when converted  to a float.

Поэтому если число имеет тип math.type = integer, то до 2^53 (9007199254740992) нет проблем представления. А если это уже double, то его не будет.
Преобразование целого числа в строку в QUIK 8.8+
 
Попробуйте использовать паттерн "%.0f".
Отладка QUIK 8.8
 
Цитата
TGB написал:
https://cloud.mail.ru/public/5iZb/2NSAPmJem   - ссылка на мою тестовую программу (с кодами и инструкцией по ее запуску). Старая ссылка удалена.
 При запуске этой программы дампы возникают быстро (у меня в течении 5 минут), но в произвольные моменты. Эта же программа (с dll оттранслированными для Lua 5.1) непрерывно (месяцами) без проблем работает во всех версиях QUIK < 8.5.
  Одна из функций данной программы, которая включена сейчас по умолчанию, это тестирование автоматического управления
памятью в QLua.
 Особенностью теста является высокая нагрузка (1500 обращений в секунду) на управление автоматической памятью QLua в условиях многопоточности.
 Можете также посмотреть обсуждение по ссылке  https://forum.quik.ru/forum10/topic5119/?PAGEN_1=3  , начиная с комментария № 145.
А Ваше решение только под qlua? Тесты на vanilla lua 5.3 не пробовали запускать? Тогда бы было понятно, что проблема именно в реализации qlua.
Использование памяти скриптами Lua
 
Еще больший расход памяти будет если объявить локальную переменную и в нее записывать полученный результат. Память тратится как раз на хранение текущих и промежуточных данных.
Каждый раз получая данные с сервера, их надо хранить. В вашем примере переменная глобальная, но ее бы стоило инициализировать ранее, чтобы под нее была выделена память.

А сбрасывается память при автоматическом запуске garbage collector. При этом очищается "мусор", т.е. выделенная память под локальные переменные (неиспользуемые ключи таблиц и т.д.), которые уже не нужны.
Вы также можете вручную запустить collectgarbage, но разработчики не советуют это делать.
Не пойму, где ошибка.
 
Без полного кода сложно будет получить ответ. Где часть кода создания таблицы и ее колонок?
Проблема с кодировкой
 
21 век, как никак...
Проблема с кодировкой
 
Писать в кодировке Win 1251. Квик другой не понимает.
Статус сессии.
 
Цитата
nikolz написал:
Есть очень простое решения проблемы статуса сессии.
Делаем раз - синхронизируем компьютер по серверу времени.  Это позволяет нам синхронизироваться с временем биржи с погрешностью не более 0.01 сек
Делаем два - пишем константы начала и конца сессий
Делаем три - где надо и не надо просто сравниваем текущее время с константами и решаем какое сейчас состояние сессии без каких либо кодов с биржи
------------------------
Самое смешное в том,  что биржа(брокер)  свои коды формируют точно так же.
Так и делаем как дублирующий слой. Зачастую так надежней. Но времена меняются иногда, в этом проблема.
Статус сессии.
 
Цитата
Как нет когда есть?
https://arqatech.com/upload/iblock/9c0/Doc880.zip
Файл "8 Язык QPILE.pdf", глава "8.12.3 Значения параметров функций" на стр 65

Цитата
Nikolay написал:
А теперь скажите где это описано в справке? Скажем, чтобы новичок разобрался. Я уже не говорю про англоговорящего пользователя.
Что именно написано? то что везде параметры называются одинаково? кажется это и так очевидно.
Какой такой QPILE? Мы говорим про реализацию qLua. Вы же предлагает читать документацию по QPILE как дополнение к qLua. При этом это не сказано в руководстве по языку qLua.
Поставьте себя на место новичка, впервые открывшего терминал в 2020 г., желающего написать скрипт на qLua. Ваша справка такова, что вам приходится постоянно отвечать на простейшие вопросы, вместо того, чтобы пользователь просто прочитал.
Статус сессии.
 
Цитата
Sergey Gorokhov написал:
Цитата
Nikolay написал:
chm можно открыть только на Windows (без сторонних программ). Часто разработка ведется в других средах, где проще открыть pdf файл.
В чем проблема скачать инструкцию в pdf с нашего сайта?
Никаких, кроме того, что там нет описания параметров. Как я и сказал, пользуемся online справками.
Цитата
1) В терминале QUIK есть так называемые формальные заголовки (их видно при выводе по DDE)
2) В терминале QUIK есть язык QPILE, в котором есть функция GET_PARAM_EX, которая принимает значения из п.1
3) В терминале QUIK есть язык QLUA, в котором есть функция getParamEx, которая тоже принимает значения из п.1
А теперь скажите где это описано в справке? Скажем, чтобы новичок разобрался. Я уже не говорю про англоговорящего пользователя.
Но это уже отдельная тема, итак не по теме автора.
Статус сессии.
 
Цитата
видимо читать так "В справке  info.chm  есть раздел Значения параметров функций"
зачем дублировать одну и ту же информацию дважды?
Тогда и весь документ "Интерпретатор языка Lua" стоит исключить - зачем дублировать. Правда он еще есть в English варианте, а справку english qlua.chm не видел.

chm можно открыть только на Windows (без сторонних программ). Часто разработка ведется в других средах, где проще открыть pdf файл.

У нас есть pdf документ по языку, справка chm по языку, справка chm по терминалу. Параметры функции (причем здесь терминал) описаны в справке к терминалу. Замечу при этом, что раздел "Значения параметров функций" расположен в части "Алгоритмический язык QPILE". Уверены что это дублирование информации? Формально, описания параметров для функции языка qlua getParam(Ex) нет.

Впрочем, будем продолжать пользоваться online справками.
Статус сессии.
 
Т.е. это параметр, которого нет в описании (в этом и был вопрос), который брокер может не транслировать...
Как-то странно, при взгляде со стороны.

Кстати по описанию, почему в документе "Интерпретатор языка Lua" нет описания доступных параметров
функции getParam(Ex)?


В справке qlua.chm есть раздел Значения параметров функций. Добавьте такой же раздел и в документ "Интерпретатор языка Lua".
Статус сессии.
 
Цитата
Sergey Gorokhov написал:
tradingphase
Это что за параметр такой. Его нет в описании доступных параметров.
Статус сессии.
 
Я уже просил сделать заполнение параметров отвечающих за время открытых сессий (как это сделано для срочной секции). Но для фондовой сессии заполняется только времена аукциона.
Если я правильно помню ответ: все вопросы к бирже.

А по статусам, да, поддерживаю.
OnTransReply - что я делаю не так?
 
Если есть поток транзакций, то надо сохранить "ключи транзакций" и по приходу ответа уже что-то делать.
Можете организовать некую таблицу с ключами равными номерам транзакций, а в колбеке проверять, что такой ключ есть и выполнять какие-то действия.

Правда Вам стоит сразу задуматься и о некой уникальности ключа транзакции. Сейчас Вы просто смотрите на номер транзакции. Но если Вы запустите два скрипта одновременно, то гарантий уникальности уже не будет. Стоит проверять не только номер, но и инструмент. Плюс при отправке транзакции можно добавить некий комментарий, а в колбеке фильтровать по нему же, чтобы получить свой колбек, а не соседнего скрипта.
OnTransReply - что я делаю не так?
 
В момент когда приходит колбек, номер транзакции уже другой. Вы не знаете когда придет ответ от транзакции, может минут 5 и более приходить.
Получение данных из таблиц при автостарте
 
Есть ли ожидание (либо проверка) чтобы все пакеты были получены с сервера на момент запроса, прежде чем запрашивать данные?
Отладка QUIK 8.8
 
Цитата
Юрий написал:


Ему волю дай так он всю возможную память сожрет... Не разобрались еще в проблеме? Хотя бы выяснили в чем причина?
Проверьте на предмет "поврежденных" открытых графиков. Т.е. повреждены данные. У меня были такие после обновления. Выявил путем последовательного закрытия и перезапуска.
У меня отжирал всю виртуальныю память.

Еще на версии 8.х самопроизвольно в таблицу текущих торгов и в настройки закзанных потоков данных добавляются инструменты. Обычно это фьючерсные контракты. Каждый раз убираешь и снова сами добавляются. Скажете, что брокер, но у меня вопрос - почему у брокера есть возможность добавлять мне в поток и в таблицы данные.
getFuturesHolding
 
Ваш тестовый контур тоже транслируется биржей?
Хоть это и технологические изменения, но не очень понятно почему меняется позиция. Вар. маржа, суммовая позиция - это понятно, но количественный баланс не очень.
В чем отличия SearchItems и getNumberOf/getItem?
 
Мои наблюдения.

Хоть и говорят, что SearchItems быстрее, но я наблюдал такое поведение:
Если таблица для выборки мала, то SearchItems будет предпочтительней.
А вот если она большая, скажем таблица обезличенных сделок, то здесь уже не все так очевидно. SearchItems вызывало большую нагрузку, нежели прямой перебор.
При этом выборка идет с запоминанием последнего прочитанного индекса, чтобы сузить последующие запросы. Т.е. размер исходной таблицы как-то влиял на результат, хотя, по идее, реализация должна быть тоже простым перебором с вызовом функции фильтрации для каждой строки.

Если просто написать некий цикл на 10 млн. повторений перебора, скажем таблицы из 10 строк, то особой разницы нет. Здесь я бы предпочел SearchItems, т.к. памяти меньше уйдет.
getFuturesHolding
 
Сначала решил проверить на вашем тестовом контуре в вечений клиринг. Кулено 2 контракта SRU0.

Вот простейший скрипт:
Код
local isRun = true
local logFile

local function log_tostring(...)
    local n = select('#', ...)
    if n == 1 then
    return tostring(select(1, ...))
    end
    local t = {}
    for i = 1, n do
    t[#t + 1] = tostring((select(i, ...)))
    end
    return table.concat(t, " ")
end

local function myLog(...)
    if logFile==nil then return end
    logFile:write(tostring(os.date("%c",os.time())).." "..log_tostring(...).."\n");
    logFile:flush();
end

local function GetFuturesHolding(Sec)

    local futures_client_holding = _G.getFuturesHolding(Sec.FIRM_ID, Sec.ACCOUNT, Sec.SEC_CODE, 0)
    if futures_client_holding then
        return futures_client_holding.totalnet
    end
    return 0
end

local function GetTotalnet(Sec)

    local num = getNumberOf('futures_client_holding')
    for i = 0, num - 1 do
        local futures_client_holding = getItem('futures_client_holding',i)
        if futures_client_holding and futures_client_holding.sec_code == Sec.SEC_CODE and futures_client_holding.trdaccid == Sec.ACCOUNT then
            return futures_client_holding.totalnet
        end
    end
    return 0
end

function _G.main()

    logFile = io.open(_G.getScriptPath().."\\test_log.txt", "w")

    local Sec          = {SEC_CODE = 'SRU0', CLASS_CODE = 'SPBFUT', ACCOUNT = 'SPBFUT001nw', FIRM_ID = 'SPBFUT000000'}
    local curOpenCount = GetTotalnet(Sec)

    while isRun do
        local new_count = GetFuturesHolding(Sec)
        if  new_count ~= curOpenCount then
            myLog('----------------------------------------------------------------------------------')
            myLog('getFuturesHolding new_count', new_count)
            curOpenCount = new_count
            for i = 0, _G.getNumberOf('futures_client_holding') - 1 do
                local fut_pos = _G.getItem('futures_client_holding', i)
                myLog('futures_client_holding', i, 'sec_code', fut_pos.sec_code, 'avrposnprice', fut_pos.avrposnprice, 'totalnet', fut_pos.totalnet)
            end
            myLog('----------------------------------------------------------------------------------')
        end
        sleep(100)
    end
end

function _G.OnFuturesClientHolding(fut_pos)
    myLog('----------------------------------------------------------------------------------')
    myLog('          OnFuturesClientHolding ', 'sec_code', fut_pos.sec_code, 'avrposnprice', fut_pos.avrposnprice, 'totalnet', fut_pos.totalnet)
    myLog('----------------------------------------------------------------------------------')
end

function _G.OnStop()
    isRun = false
    myLog("Script Stoped")
    if logFile then logFile:close() end
end

function _G.OnClose()
    isRun = false
    myLog("Script OnClose")
end

А вот, что происходит во время вечернего клиринга. Я так понимаю это технологические изменения позиции. Реальные скрипты не проверяют баланс во время клиринга, но здесь вопрос: а согласованы ли параметры
TRADINGSTATUS и CLSTATE с изменением баланса? Т.е. не может ли быть так, что статус клиринга еще не успел обновиться, а баланс через getFuturesHolding обнулился?

Правда также возникает вопрос: а с чего он так скачет туда-обратно? Если вывести позицию в торговую панель стакана, то там стабильно позиция остается правильной.

[INFO  2020-08-04 15:37:55] : ----------------------------------------------------------------------------------[INFO  2020-08-04 15:37:55] : futures_client_holding 0 {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 18, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 18}
[INFO  2020-08-04 15:37:55] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:38:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:38:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = -12, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = -12}
[INFO  2020-08-04 15:38:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:39:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:39:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 6, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 6}
[INFO  2020-08-04 15:39:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:40:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:40:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 24, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 24}
[INFO  2020-08-04 15:40:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:41:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:41:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 18, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 18}
[INFO  2020-08-04 15:41:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:42:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:42:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 10, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 10}
[INFO  2020-08-04 15:42:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:43:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:43:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 28, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 28}
[INFO  2020-08-04 15:43:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:44:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:44:24] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 36, sec_code = "SRU0", seccode = "SRU0", session_status = 3, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 36}
[INFO  2020-08-04 15:44:24] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:45:00] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:45:00] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:45:00] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] :           OnFuturesClientHolding  {avrposnprice = 0, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 0, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] : getFuturesHolding new_count 0
[INFO  2020-08-04 15:47:06] : futures_client_holding 0 {avrposnprice = 0, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 0, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:06] :           OnFuturesClientHolding  {avrposnprice = 0, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 0, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:06] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:07] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:07] :           OnFuturesClientHolding  {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:07] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:07] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:07] : getFuturesHolding new_count 2
[INFO  2020-08-04 15:47:07] : futures_client_holding 0 {avrposnprice = 22792, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 2, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:07] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] :           OnFuturesClientHolding  {avrposnprice = 0, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 0, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : getFuturesHolding new_count 0
[INFO  2020-08-04 15:47:10] : futures_client_holding 0 {avrposnprice = 0, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 0, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 0, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] :           OnFuturesClientHolding  {avrposnprice = 22800, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 2, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:47:10] : getFuturesHolding new_count 2
[INFO  2020-08-04 15:47:10] : futures_client_holding 0 {avrposnprice = 22800, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = 0, sec_code = "SRU0", seccode = "SRU0", session_status = 4, startbuy = 0, startnet = 2, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = 0}
[INFO  2020-08-04 15:47:10] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:48:26] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:48:26] :           OnFuturesClientHolding  {avrposnprice = 22800, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = -300, sec_code = "SRU0", seccode = "SRU0", session_status = 5, startbuy = 0, startnet = 2, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 0, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = -300}
[INFO  2020-08-04 15:48:26] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:50:48] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 15:50:48] :           OnFuturesClientHolding  {avrposnprice = 22800, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = -300, sec_code = "SRU0", seccode = "SRU0", session_status = 5, startbuy = 0, startnet = 2, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 16, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = -300}
[INFO  2020-08-04 15:50:48] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 16:00:01] : ----------------------------------------------------------------------------------
[INFO  2020-08-04 16:00:01] :           OnFuturesClientHolding  {avrposnprice = 22800, cbplplanned = 0, cbplused = 0, firmid = "SPBFUT000000", openbuys = 0, opensells = 0, positionvalue = 0, real_varmargin = -300, sec_code = "SRU0", seccode = "SRU0", session_status = 6, startbuy = 0, startnet = 2, startsell = 0, todaybuy = 0, todaysell = 0, total_varmargin = 16, totalnet = 2, trdaccid = "SPBFUT001nw", type = 0, varmargin = -300}
[INFO  2020-08-04 16:00:01] : ----------------------------------------------------------------------------------
luasql (проблема с cursor:fetch)
 
Я собирал версию ODBC. Она универсальна. sqlite3 не очень люблю, т.к. блокировки транзакций на уровне базы. Правда она умеет in memory, что приятно.
luasql (проблема с cursor:fetch)
 
Собирали сами? У меня стабильно падала после некоторого времени.
Надо заново проверить, вдруг починили. Техподдержка Квика так и не ответила, по моему обращению.
В чем отличия SearchItems и getNumberOf/getItem?
 
Самая главная проблема - это расход памяти.
При переборе каждый раз получатся строка таблицы, в которой может быть много полей.
Если это делать на каждом цикле алгоритма, то память прямо улетает.

SearchItems возвращает массив индексов отфильтрованных строк. Что само по себе уже меньше по объему, ну и, зачастую, надо просто последний взять, например.
luasql (проблема с cursor:fetch)
 
Я год назад, когда собрал версию для х64, тоже столкнулся с этим. Даже issue отправлял https://github.com/keplerproject/luasql/issues/115

Решение - перейти на итератор курсора.
Код
function SQL_Rows(connection, sql_statement)
 local cursor = assert(connection:execute (sql_statement))
 return function ()
  return cursor:fetch()
 end
end

Кстати, у Вас библиотека на х64 стабильно работает? Я бросил попытки еще в январе.
getFuturesHolding
 
Добрый день.

На этом форуме вы очень часто просите привести текст скрипта. Но я же написал просто про функцию.
Я не могу привести конкретные примеры, т.к. это сообщения от клиентов. Анализ логов явно указывает на то, что эта функция возвращает результат пустой. Я всего лишь обращаю ваше внимание, что такое поведение проявляется в редких случаях перед клирингом. Это происходит на счетах с единой позицией.

Я попробую промоделировать. Правда у меня нет счета с единой позицией.
Вам же прогнать unit тесты не составит труда.
getFuturesHolding
 
На версии 8.х столкнулся на реальных счетах разных брокеров, что функции получения текущих позиций как getFuturesHolding,
getDepoEx работают нестабильно. Чаще всего это происходит с getFuturesHolding на едином счете.
В течении сессии часто (обычно перед клирингом) функция не возвращает ничего. При этом если перебрать строки прямым итератором, то все нормально находится.

Приходится отказываться от использования функций. Но перебор - это существенный расход памяти и просто медленней.
Появляется лишняя строка в таблице
 
Я уже давно ушел от редактирования чего либо в колбеках Квика. Есть глобальная очередь сообщений, в колбеке в нее идет только запись информации о событии.

А уже в main идет обработка и очистка. Также реализованы свои колбеки - задача в очередь, когда выполнилась дернул свою функцию.
Многопоточность - это опять решать проблемы потоков. Блокировка поможет, но тогда зачем потоки, если блокировать остальные.

Цитата
Старатель написал:
Что-то никак не пойму, работа с QLua-таблицей - это синхронные или асинхронные сообщения?Саппорт, можете просветить?
Предположу что синхронный. Квик виснет если сделать бесконечный цикл в колбеке окна.
Не обновляется таблица при добавления цикла repeat...until
 
Вы этот код как реальный пример рабочего кода приводите, либо как некий тестовый пример?

Если просто как пример, что repeat until выполняется всегда хоть один раз пока истинно условие. Т.е., если надо выполнять пока есть лимиты, то это будет условие until asset > 0
У Вас было 5, начинаем выполнять:
4, 3, 2, 1. Все, т.к. на последнем шаге 1 станет 0 и мы выйдем из цикла.

Также и с другими цифровыми порогами. Выполняете пока у вас asset больше. Вы же вычитаете 1 в процессе, значит asset будет уменьшаться.

Если же это рабочий код, то он не предусматривает, что транзакция может не пройти, баланс может обновляться долго, ответ транзакции идет долго. Сервер же далеко, он может быть занят.
Отладка QUIK 8.7
 
Я здесь соглашусь. Данное поведение будет нелогичным.
Вы вносите элемент статической типизации в динамически типизированный язык.  
Обновление пользовательской таблицы/окна
 
Пришлось добавить Highlight цветом фона при выводе, т.к. он заставляет обновить окно таблицы и все начинает плавно работать.
Костыль, но что делать.
Индикатор Squeeze Momentum Indicator, Прошу помощи по перекодировки индикатора в луа для Квик
 
Ну раз у Вас нет ошибок при запуске индикатора как скрипта а я его вижу перед глазами в версии > 8.5, то, скорее всего, не подгружается maLib через require('maLib')

Можете заменить загрузку библиотеки такой конструкцией:
_G.load   = _G.loadfile or _G.load
local maLib = load(_G.getWorkingFolder().."\\Luaindicators\\maLib.lua")()

Либо пропишите пути поиска библиотеки через package.path

Что касается priceAvgProfile, то тоже вижу его перед собой. Но возможно, у Вас проблема в данных и надо отловить ошибку. Посмотрю еще на разных бумагах.
Утечка памяти
 
Здесь уже и не знаешь что это... Возможно и расход, хотя при закрытии закладки она не высвобождается. Только перезапуск освобождает память.

Выглядит это так: загружаю одну сохраненную закладку с графиками, через секунду виртуальная память резким скачком становится 17 гб.
Далее можно закрывать ее, графики - не важно, память уже выделена. Только перезапуск с закрытыми проблемными графиками и таблицами.

Если разработчикам интересно, то я могу выслать одну из проблемных закладок. Что-то бета тест у нас затянулся с 8.x версиями.
Утечка памяти
 
Пришлось с нуля установить Квик. Далее последовательно восстанавливал ранее сохраненные закладки.
Выявились закладки, которые приводили к такому расходу. Как только загружал их в чистый Квик сразу подскакивал расход на десятки гб.
Две из них ожидаемо содержали склейки фьючей. Но одна была с графиком Аэрофлота. Но ее добавление давало 17 гб расхода.

Очень странное поведение 8.х версий Квика...
Утечка памяти
 
Недавно началось очень странное поведение системы при работе Квика. Версия 8.3.1.38. При этом он был установлен еще в мае.

Памяти на рабочем месте 32 гб. Свободной полно. Но явно идет утечка памяти. Виртуальная память выделена > 80 ГБ.

То ли это Windows 10 так балуется, то ли у Квика лыжи не едут... Но, еще раз, полтора месяца с момента обновления, не было проблем.

https://funkyimg.com/i/3683s.png
[BUG] QUIK вешается при использовании DestroyTable из main
 
Да, есть такое.

Я добавлял проверку есть ли такое окно по isWindowClosed(id), но бесполезно.
Индикатор Squeeze Momentum Indicator, Прошу помощи по перекодировки индикатора в луа для Квик
 
Добавьте файл индикатора в окно доступные скрипты: Сервисы - Lua скрипты.
Запустите его. Будет показана ошибка компиляции. Именно она не дает добавить индикатор в список.
Файл я посмотрел - он в правильно кодировке.

Также обновил priceAvgProfile. Напомнили, он был не совместим с lua 5.3
Скрипт прекращает работу, а не должен, Скрипт прекращает работу по непонятной причине, как ее выявить?
 
Отладчик Вам не поможет, если ошибка спонтанная, т.е. зависящая от данных. Допустим индексация значения nil, ожидая table.

В этом случае Вам проще обернуть критические функции в pcall, перехваченные ошибки записывать в лог. При этом надо обязательно добавить assert на входяшие данные.
Если ожидаете таблицу, проверьте что она и пришла. Ждете строку, проверьте, что она есть.
Тогда исключение по таким проверкам Вам и дать искомую ошибку.
Принципы написания скриптов, Разделять или объединять?
 
Это, конечно, похвально написать свой RabbitMQ, но, в результате, получится схема не меньшей сложности. Т.е. мы пишем свой терминал. Он будет собирать события терминала, исполнять команды скриптов и читать их ответы, передавать им поток данных.

При этом мы итак находимся внутри такого окружения... Что мешает написать скрипт исполняющий сразу несколько алгоритмов, по многим инструментам. Будет один скрипт, одно окружение.
А колбеки Квика слишком ненадежная конструкция. Проще без них. Хотя, конечно, от части из них отказаться сложно, как, например, OnTransReply.
Принципы написания скриптов, Разделять или объединять?
 
Медленней чем, что? У меня код с использованием десятка библиотек выполняется с одной итерация цикла где-то за 150-250 мс. При этом 60 мс - это установленная задержка.
Вариантов то нет, если надо писать сложный код. Это будут классы, модули, функциоанальный подход и т.д. Иначе будет совсем не разобраться через некоторое время, открыв свой же код.

Это относится не только к скриптам для Квика. Это общая практика программирования.
Цитата
Вызов отдельной функции требует больше времени, чем исполнения кода в основном потоке
А где, собственно, это функция вызывается... Все выполняется в дополнительном потоке Квика - функции main. Функцию можно только упрекать в расходовании памяти на дополнительные локальные переменные, но скорость то тут причем.

А универсальное пишем как раз для того, чтобы писать скрипты быстро и удобно. Иначе код придется писать с нуля каждый раз. А если ошибка, то что, исправлять в каждом файле.
Индикатор Squeeze Momentum Indicator, Прошу помощи по перекодировки индикатора в луа для Квик
 
Если Вы скачали файлы с GitHub, то необходимо провести конвертацию файла в кодировку 1251, т.к. на сайте все хранится в UTF-8.
Также не забудьте положить рядом файл maLib.lua т.к. индикатор зависит от нее.
Впрочем, это видно из кода.
Принципы написания скриптов, Разделять или объединять?
 
Когда у Вас скрипт на тысячи, десятки тысяч строк, то писать в одном файле это смело.
А когда у Вас уже написано много скриптов, то придешь к модулям, т.к. каждый раз писать одно и тоже - это тоже смело.
При этом модуль - это не команда dofile в глобальном окружении, а нормальный модуль, подключаемый через require.
Можно ли программно получить данные OHLCV по нескольким дневным периодам, без использования графика?, У меня что-то не получилось, есть ли способ?
 
Тогда возникает вопрос, а что же не получилось?

Заказываете данные через ds = CreateDataSource(class_code, sec_code, interval)

Назначаете тип колбека:
ds:SetEmptyCallBack()
или
ds:SetUpdateCallback(function)

Получаете через ds:C(index), ds:L(index) и т.д.

http://luaq.ru/CreateDataSource.html
for для значений свечей
 
Выводить значения надо для каждого бара. Также, обычно, не выводят значения, пока число баров не стало больше чем период расчета (т.к. выборка недостаточна).

Вы можете просто инициализировать переменную в замыкании, отвечающую за результат расчета, и выводить ее всегда. Иначе у Вас могут образовываться дырки в расчете (это и приведет к такой прямой линии), когда бара нет и CandleExist(I,ds) вернет ложь.

В тех ссылках, что я скидывал подробно описана как строить индикатор. Вы сейчас зацепились за какой-то отрывок кода, не понимаю зачем он. Лучше, все же, взять руководство, его же не зря написали.
Страницы: 1 2 3 4 5 След.
Наверх