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

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

Страницы: Пред. 1 ... 9 10 11 12 13 14 15 16 17 18 19 След.
Createsource и смена сессии
 
Цитата
Sergey Gorokhov написал:
Если же говорить про архивные данные, то Вы и так уже сейчас можете определить что "все архивные данные загружены" без каких-либо доработок
Это какая методика мне позволит узнать, что все исторические данные загружены? При заказе размер 0. И сколько в итоге мы не знаем, пока не загрузим.
Createsource и смена сессии
 
Мы же сейчас говорим не про аналоговое телевидение, а про асинхронную передачу дискретного потока данных.
В момент заказа данных есть историчесике данные, это все что есть до этого момента времени. Это срез данных на момент времени. Он один.
Мы начинаем отдавать этот массив. Да, параллельно появляются новые данные. Но в какой-то момент времени мы будем в окрестности границы множества, и в этот момент вы отдаете остаток исторических данных и пришедшее новое (с момента начала передачи) до конца выборки всего массива данных. Опять, это момент, срез времени, с точки зрения наблюдателя он один. Пока не посмотрим на новые данные для наблюдателя их еще нет.

Если Вы говорите, что именно в этот момент пришли новые данных и как-бы данные уже не все, то это как раз не проблема, т.к. это будет уже колбек по новым данным, истрия уже загружена.
Createsource и смена сессии
 
Т.е. невозможно дать сигнал когда выбрана вся выборка? Вот у меня на сервере есть массив. Я отдаю его прциями через канал связи. В последней порции идет флаг, что это последний пакет.
Терминал видит оный и после загрузки этого пакета дает колбек. У вас же есть колбек для получения новых данных по барам - это он и есть, т.к. он вызывается для каждой последней сделки, читай порции данных. Только в случае отсутвия сделок у нас колбека нет и приходится гадать получены ли все пакеты.

В вашем примере - это не будет проблема, т.к. появление нового бара всего лишь дать мне результат Size() = 101, а не 100. Но я уверен, что это уже послений бар. Его номер не столь важен, пока не все получено.
Createsource и смена сессии
 
Тогда уже добавьте метод проверки: все данные загружены. Или сделать подписку на колбек: при пролучении всех данных.
В конкретный момент времени данные либо еще загружаются из-за большого объема или слабый канал связи, либо уже все получено.
Это бы позволило избавиться от вских безумных задержек, проверок по времени и т.д.

По идее, у всех методов заказа данных с сервера, должен быть колбек по получению всего объема этих данных. Как никак клиент-серверная архитектура.
Обновление пользовательской таблицы/окна
 
Забыл добавить, что в версии 8.4 все работает корректно в светлой теме.
Обновление пользовательской таблицы/окна
 
Подниму страую тему.

На версии 8.6 в темной теме обновление окна скрипта происходит корректно при задержке 55 мс. и выше.
А в вот в светлой теме не помогает даже задержка 100 мс и выше. Окно обновлется только если его "подергать".

Приходится сидеть на темной теме, что некомфортно.
Индикатор Squeeze Momentum Indicator, Прошу помощи по перекодировки индикатора в луа для Квик
 
Ага, надо было просто найти первоисточник. Это же просто TTM Squeeze от John Carter.

Кельтнер канал и полосы болинджера. Так себе...
Но ради коллекции можно сделать, конечно.
Индикатор Squeeze Momentum Indicator, Прошу помощи по перекодировки индикатора в луа для Квик
 
Ради интереса посмотрел на индикатор. Проблема в том, что везде разный код. А первоистчника нет.
В одном месте линейная регрессия одна, в другом другая.
В третьем вижу, что выводят линейную регрессию как гистограмму, что нонсенс, т.к. это прямая.
Enter Trade 0.1 - Торговый привод для терминала Quik с открытым исходным кодом
 
Ну а форма подачи Вашего произведения говорит больше о рекламе, а не о разработке.
Поэтому была озвучена рекомендация о GitHub. Я бы хотел бысто взглянуть на код не продираясь сквозь посторонюю информацию.
Тем более, что код открытый, как никак.
Скачивать с неизвестного сайта архивы... Это было опасно уже в 1994 году.
Enter Trade 0.1 - Торговый привод для терминала Quik с открытым исходным кодом
 
Это часть форума посвященная разработке как таковой. Пожелания по развитию теринала в другой части форума, просмотрев которую, Вы увидете все и даже больше из пожеланий. Терминалу уже 20 лет. Пожеланиям столько же.
Разыскивается luacom для Quik 8
 
Собрать не сложно. Да и делали уже. https://forum.quik.ru/messages/forum10/message42821/topic4609/#message42821

Но падает. Тем более, что надо бы подождать выхода из бетты терминала и собрать уже под lua 5.3 с правкой исходного кода библиотеки.
Createsource и смена сессии
 
Т.е. вот это обращение таки будет принято как ошибка:
https://forum.quik.ru/messages/forum10/message40946/topic4190/#message40946
Enter Trade 0.1 - Торговый привод для терминала Quik с открытым исходным кодом
 
Такого добра полно на просторах. Кто не писал логгинг и журналы сделок, скринеры, роботы и т.д...
Только не стоит сюда выносить. На СмартЛабе или любой социальной ... будет самое то...

Здесь же хотелось бы обсуждать технические вопросы, не более.

(PS. Заведите аккаунт на GitHub, поменьше используейте dofile, глобальные переменные и функции, ну и callback не место для сложных действий и точно не для совершения транзакций)
Как узнать, будут ли завтра или в другую дату торги по фъючерсу, Автоматическая замена кодов фъючерсов
 
Зачем ломать... У бумаг есть такой параметр как MAT_DATE. Дата погашения в виде числа.
А также есть параметр DAYS_TO_MAT_DATE - сколько осталось дней.
lua 5.3 не открывает заявки...
 
Правильно.

lua 5.3 числа вида float форматирует как "1000.0".
Необходимо применить форматирвание или перегрузить глобальную функцию tostring.
Это уже обсуждалось https://forum.quik.ru/forum10/topic5319/
lua 5.3 не открывает заявки...
 
Вы бы хоть ошибку ответа транзакции привели.

Скорее всего некоректное форматирование цены в функции priceForMarketOrder( vol )

Для RI это строка целого числа.
Автостоп
 
Цитата
Михаил В написал:
Добрый день.
Пишу автостоп. Возникло несколько вопросов.
1. Как при закрытии окна скрипта "по крестику" остановить его работу? Функция OnStop не помогает, скрипт  остается запущенным, только без окна.
2. Не могу придумать логику уменьшения позиции в стоповой заявке при частичном закрытии позиции. При наборе позиции сравниваю текущую с предыдущей позицией и если она больше, то удаляю и выставляю стоп со связанной заявкой по новой с новым лотом. Работает как положено. Размер позиции получаю из getNumberOf("FUTURES_CLIENT_HOLDING").
Но при уменьшении позиции (частичном закрытии) все сложней. Нужно различать частичное закрытие вручную по рынку от закрытия по достижению тейк-профита. При ручном частичном закрытии нужно удалять и переустанавливать стоп-заявку, а при закрытии об тейк-профит ничего не делать, чтобы избежать при "быстром" рынке и тормозах у брокера переворачивания позиции (что наблюдается у некоторых бесплатных автостопов из интернета). Экспериментировать на реальном счету нет желания, а на демо бесполезно.
По первому вопросу уже ответили - у Вас флаг работы скрипта должен быь. Сбросьте его в OnStop, закройте таблицы через Destroy.

По второму - у Вас стоп на всю позицю или частично? Если на всю, то какая разница. Если после сработавшего профита, позиция стала 0, то и стоп нао убрать. Если стала 3, а стоп стоит на 5, то тоже надо переставить. Т.е. условие для Вас это когда размер стопа стал отличаться от размера позиции.
Индикатор не появляется в Окне добавления графика
 
Сама среда разработки не дает хорошей проверки ошибок. Это дает линтер или language-server в виде плагина для редактора. Notepad++, если я правльно помню, сам по себе только подстветку кода делает. Для VS Code это разные плагины lua (я предпочитаю этот плагин: lua by sumneko https://github.com/sumneko/lua-language-server) + luacheck как линтер. Вместе они дадут проверку почти всех синтаксических ошибок. Даже часть проверок многие отключают, т.к. привычка написания кода другая.
Индикатор не появляется в Окне добавления графика
 
Добавьте индикатор в доступные скрипты в самом Квике и запустите. Он покажет ошибку компиляции.

Но лучше поставить среду разработки типа Notepad++, Sublime Text, VisualStudio Code (и др.) и добавить плагины для lua. И к ним прикрутить линтер luacheck. Я VS Code предпочитаю, т.к. у него лучшая интеграция с GitHub.
Тогда он покажет банальнейшие ошибки. Правда придется переосмыслить методику написания кода, т.к. любой линтер будет считать за ошибку хаотичное опредение глобальных переменнных и функций без использования оных по месту.

Что касается отладки, то есть один - decoda, но я не проверял будет работать на lua 5.3 x64. Но и с 7-ой версией Квика он работает не очень стабильно.
Индикатор не появляется в Окне добавления графика
 
return 300 400

Запятую забыли.
Компилятор под 8,5
 
Можете самим Квиком через string.dump компилировать. Правда ломается легко.
Лучше luac.exe -o file.luac file.lua использовать. Выше по ссылке есть бинарники.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
 
У меня в 8.* версиях индикаторы не работают, если в них есть require. Приходится через load грузить. Но с dll так не пройдет.
Расчёт ГО
 
Цитата
Незнайка написал:
Nikolay,
Я вам просто хочу донести, что result == "1" не гарантирует, что параметр включен в поток данных.
Если же result ~= "1", то вы не найдёте его в списках доступных параметров.
Да, это так. Но я свои скрипты пишу из расчета, что включена настройка независимого получения данных, что отмечаю в описании и инструкции.
Расчёт ГО
 
По расчету ГО советую еще ознакомится с древней темой на форуме биржи https://forum.moex.com/viewtopic.asp?t=30919
Расчёт ГО
 
Цитата
Незнайка написал:
Цитата
Nikolay написал:
getParamEx возвращает строку "1" если параметр получен и строку "0" если нет.
Проведите небольшой эксперимент: включите галку «С учетом настроек, выбранных пользователем вручную через пункт меню Система/Заказ данных/Поток котировок» и попробуйте получить значение параметра, который не добавлен в списки получаемых параметров (Заказ данных/Поток котировок...)
getParamEx вернёт таблицу с result == "1", но без значения самого параметра.
Такой варинт настроек не самый удачный для использования скриптов. Нельзя гаратнтировать, что пользователь не сменит (закроет) таблицу и поток данных исчезнет.
Поэтому есть процедуры: ParamRequest, CancelParamRequest.
Расчёт ГО
 
Впрочем, Вы правы. Я выдернул часть расчета из другой части кода и не увидел, что здесь перевод в деньги от цены, не от пунктов.
Т.к. большинство фьючерсов имеют цену как целое число, то это не влияло на результат.
Да, надо убрать приведение цены к целому значению.

Я писал это основываясь на этой статье: https://iwtkl.livejournal.com/21873.html
Расчёт ГО
 
В расчете L2 нет ошибки. Он ведется в пунктах (т.к. далее пункты переводятся в рубли, через умножение на priceKoeff), поэтому и умножается на размерность инструмента.
Проверьте, что передаете правильные значения по направлению. Если покупка, то БГО покупателя и наоборот. Значения же разные.

getParamEx возвращает строку "1" если параметр получен и строку "0" если нет. Если не ошиблись с написание параметра (а этом можно сделать организовав словарь), то возврат "0" или не равно "1" - это значит параметр не транслируется.
Как отследить событие - перерыв в торгах на фортс
 
Ах да, для клиринга есть параметр CLSTATE. Посмотрите в описание параметров таблицы "Текущие торги"
Как отследить событие - перерыв в торгах на фортс
 
Для этого используют TRADINGSTATUS
Quik 8.6 Critical error ACCESS_VIOLATION
 
Т.к. данные приходят с сервера (а мгновенно это никто гарантировать не может), то надо ждать загрузки всех данных (всех баров).
Да, ошибка бывает когда обращаешься к пустому Size. Правда падать, вроде как, не должен.

Проблема ожидания не только в том, что надо ждать, а в том, что интерфейс не дает возможности понять: а все ли данные приехали. Этот ds:Size() - это уже точно все или мы еще в процессе. Бывало не раз когда Size() уже не 0, но и не последний.
Я для себя сделал процедуру, сравнивающую время последней сделк и время последнего бара, чтобы понимать, что уже все загружено.
Но и здесь проблема - нету у нас даты последней сделки, есть только время (уже поднимал этот вопрос). Вот и получается, что для "дырявых" малоликвидных инструментов возможны проблемы определения состояния загружены все данные или нет.
Quik 8.6 Critical error ACCESS_VIOLATION
 
А зачем Вы каждый раз создаете источник данных? Он же память будет отъедать.
Расчёт ГО
 
Попробуйте что-то типа такого.
Передается базовое текущее ГО по направлению сделки, цена сделки.
Код
---@param Sec table
---@param go number
---@param deal_price number
---@param Type string SELL|BUY
local function CalcPriceGO(Sec, go, deal_price, Type)

    if type(Sec) ~= 'table' then  error(("bad argument Sec (table expected, got %s)"):format(type(Sec)),2) end
    if type(go) ~= 'number' then  error(("bad argument go (number expected, got %s)"):format(type(go)),2) end
    if type(deal_price) ~= 'number' then  error(("bad argument deal_price (number expected, got %s)"):format(type(deal_price)),2) end
    if Type ~= 'BUY' and Type ~= 'SELL' then  error(("bad argument Type (string 'SELL' or 'BUY' expected, got %s)"):format(tostring(Type)),2) end
    local status, res = pcall(function()
        if getParamEx(Sec.CLASS_CODE, Sec.SEC_CODE, "CLPRICE").result ~= '1' then
            log.warn([[ Для точного расчета ГО необходимо включить в поток данных параметр "Котировка последнего клиринга".
                                      Сейчас он не включен. Будет взято базовое ГО]])
            return go
        end
        if getParamEx(Sec.CLASS_CODE, Sec.SEC_CODE, "PRICEMAX").result ~= '1' then
            log.warn([[ Для точного расчета ГО необходимо включить в поток данных параметр "Максимально возможная цена". Сейчас он не включен.
                                    Сейчас он не включен. Будет взято базовое ГО]])
            return go
        end
        if getParamEx(Sec.CLASS_CODE, Sec.SEC_CODE, "PRICEMIN").result ~= '1' then
            log.warn([[ Для точного расчета ГО необходимо включить в поток данных параметр "Минимально возможная цена". Сейчас он не включен.
                                    Сейчас он не включен. Будет взято базовое ГО]])
            return go
        end
        local priceKoeff         = Sec.STEPPRICE/Sec.SEC_PRICE_STEP
        local cl_price           = tonumber(getParamEx(Sec.CLASS_CODE,Sec.SEC_CODE,'CLPRICE').param_value) or 0
        local max_price          = tonumber(getParamEx(Sec.CLASS_CODE,Sec.SEC_CODE,'PRICEMAX').param_value) or 0
        local min_price          = tonumber(getParamEx(Sec.CLASS_CODE,Sec.SEC_CODE,'PRICEMIN').param_value) or 0
        if cl_price==0 or max_price == 0 or min_price == 0 then return go end
        local L2                 = (max_price-min_price)*math_pow(10, Sec.SCALE)
        local R                  = (go/(L2*priceKoeff) - 1)*100
        local sign               = Type == 'BUY' and -1 or 1
        return                   go + sign*(cl_price - deal_price)*priceKoeff*(1 + R/100)
    end)
    if not status then
        log.error('Error CalcPriceGO: '..tostring(res))
        return go
    end
    return res
end

Как выполнить команду от имени серверной консоли через lua файл?, Как выполнить команду от имени серверной консоли через lua файл?
 
Это Вам надо писать в сообщество игоровой платформы, где Вы пишете скрипт.
Здесь обсуждают реализацию lua в рамках торгвого терминала Квик.
quik 8.5 + lua 5.3 = ошибка
 
На оффициальном сайте LUA - есть все изменения в языке по версиям. Для примера https://lua.org.ru/contents_ru.html#8
Также по вот этому коду: https://github.com/keplerproject/lua-compat-5.3
можно понять, что пришлось напсать для обеспечения совместимости 5.1 и 5.3. Это рекомендуется делать, т.к. не ясно где будет запущен скрипт - в строй версии Квика или в новой.
Получение параметров из таблиц в переменные
 
Нет, в отличии от getParamEx, эти функции возращают таблицы. Данные в них будут, т.к. это данные по счету, данные по позициям и т.д.
надо только проверять, что получен вообще результат и он корректен.
http://luaq.ru/getDepoEx.html
Получение параметров из таблиц в переменные
 
Вместо проверок на nil достаточно написать
local tblAsk =          getParamEx(CLASS_CODE,  SEC_CODE, "OFFER") or 0

Но, по хорошему, надо проверить есть ли данный параметр в потоке данных. Иначе будет не ясно - это ошибка получения данных с сервера или они просто не заказаны.
Проверить можо так:
getParamEx(CLASS_CODE, SEC_CODE, info_string).result == '1'
как решить проблему в новом квике 8.5, когда tostring (целое число) выдает дробь?
 
Это уже обсуждалось https://forum.quik.ru/forum10/topic5319/

Это не ошибка, это особенность lua 5.3. При переходе на 5.3 надо соблюдать специикации языка. Там много тонких особенностей. Большинство не будут важны для многих, а часть может просто сломать логику скриптов. Как, например, функция table.insert.
Вечерняя сессия на фондовом рынке., Вечерняя сессия на фондовом рынке.
 
В связи с началом торгов в вечернюю сессию на фондовом рынке, возникает вопрос: какие параметры будут транслироваться для списка бумаг допущенных к торгам?
В частности: TRADINGSTSTUS, ENDTIME, EVNSTARTTIME, EVNENDTIME.
Будут ли числовые значения статуса отличаться меджду основной сессией и вечерней?
Темная тема
 
Данная настройка не влияет особо на нагрузку. Так что не стоит...
Темная тема
 
Подтверждаю.

На светлой теме Квик работает с меньшей нагрузкой на графический адаптер. Загрузка центрального процессора примерно одинаковая.
Ресурсы жрут два процесса: csrss.exe (Процесс исполнения клиент-сервер) и dwm.exe (Диспетчер окон рабочего стола).

Нагрузка именно на GPU.

Стоит свернуть окно, сразу падает нагрузка. Тоже самое и при отключении соединения с сервером - нагрузка падает.

Я даже сначала подумал, что это вирус майнер (очень похоже поведение), но выключив Квик, нагрузка по этим процессам упала до 0.
Передача массива в функцию - теряется последовательность ключей
 
Цитата
Иван написал:
Мне хотелось бы в функцию передавать именно массив в таком виде (хэш-таблице).
Но как тогда сохранить порядок ключей что передается?
Вы можете создать метамод для такой таблицы, чтобы при вставке происходила сортировка по представлению ключа и сохранялась в внутренний отсортированный массив.
Плюс надо создать итератор класса по внутренней таблице, выводящий значения. Но это сложная структура и удвоение памяти.

Для хранения проще всего создать отдельный массив ключей в нужном порядке. А уже перебирая его, получать значения в постоянном порядке.  
quik 8.5 + lua 5.3 = ошибка
 
Попробуйте что-то типа такого
Код
-- Получение цены в правильном представленнии для выставления транзакции
---@param price number
---@param SCALE number|nil
local function format_to_scale(price, SCALE)
    if type(price) ~= 'number' then  error(("bad argument price (number expected, got %s)"):format(type(price)),2) end

    local status,res = pcall(function()

        SCALE = SCALE or 0
        price = tostring(price):gsub(',', '.')
        -- Ищет в числе позицию точки
        local dot_pos   = price:find('%.')

        if SCALE > 0 then
            -- Если передано целое число
            if dot_pos == nil then
                -- Добавляет к числу '.' и необходимое количество нулей и возвращает результат
                price = price..'.'..string_rep('0', SCALE)
            else -- передано вещественное число
                local remain = price:sub(dot_pos+1, -1)
                local scale  = remain:len()
                if scale ~= SCALE then
                    price = price:sub(1, dot_pos)..remain:sub(1, math_min(scale, SCALE))
                    price = price..(SCALE > scale and string_rep('0', SCALE - scale) or '')
                end
            end
        elseif dot_pos ~= nil and SCALE == 0 then
            price = price:sub(1, dot_pos-1)
        end
        return price
    end)
    if not status then
        log.error('Error format_to_scale: '..tostring(res))
        return price
    end
    return res
end
quik 8.5 ошибка
 
Добрый день.

Т.к. теперь lua 5.3, то многих может расстроить работа функции table.(s)insert.

В lua 5.3 появилась провкерка границ при вставке элементов. Поэтому у многих сломается ранее работающий код, кода вставка была за границей последнего элемента. Для примера, вставка в таблицу по номеру транзакции и т.п.

В lua 5.3 функция:

79 static int tinsert (lua_State *L) {
80   lua_Integer e = aux_getn(L, 1, TAB_RW) + 1;  /* first empty element */
81   lua_Integer pos;  /* where to insert new element */
82   switch (lua_gettop(L)) {
83     case 2: {  /* called with only 2 arguments */
84       pos = e;  /* insert new element at the end */
85       break;
86     }
87     case 3: {
88       lua_Integer i;
89       pos = luaL_checkinteger(L, 2);  /* 2nd argument is the position */
90       luaL_argcheck(L, 1 <= pos && pos <= e, 2, "position out of bounds");
91       for (i = e; i > pos; i--) {  /* move up elements */
92         lua_geti(L, 1, i - 1);
93         lua_seti(L, 1, i);  /* t[i] = t[i - 1] */
94       }
95       break;
96     }
97     default: {
98       return luaL_error(L, "wrong number of arguments to 'insert'");
99     }
100   }
101   lua_seti(L, 1, pos);  /* t[pos] = v */
102   return 0;
103 }

В lua 5.1:

90 static int tinsert (lua_State *L) {
91   int e = aux_getn(L, 1) + 1;  /* first empty element */
92   int pos;  /* where to insert new element */
93   switch (lua_gettop(L)) {
94     case 2: {  /* called with only 2 arguments */
95       pos = e;  /* insert new element at the end */
96       break;
97     }
98     case 3: {
99       int i;
100       pos = luaL_checkint(L, 2);  /* 2nd argument is the position */
101       if (pos > e) e = pos;  /* `grow' array if necessary */
102       for (i = e; i > pos; i--) {  /* move up elements */
103         lua_rawgeti(L, 1, i-1);
104         lua_rawseti(L, 1, i);  /* t[i] = t[i-1] */
105       }
106       break;
107     }
108     default: {
109       return luaL_error(L, "wrong number of arguments to " LUA_QL("insert"));
110     }
111   }
112   luaL_setn(L, 1, e);  /* new size */
113   lua_rawseti(L, 1, pos);  /* t[pos] = v */
114   return 0;
115 }

Видно, что в lua 5.1 есть строка:
101       if (pos > e) e = pos;  /* `grow' array if necessary */

Рассмотрите возможность реализации схожего поведения table.insert. Или хотя бы вашей table.sinsert. Сейчас же такая вставка дает ошибку "position out of bounds":
90       luaL_argcheck(L, 1 <= pos && pos <= e, 2, "position out of bounds");
QUIK 8.0
 
Я уже точно не помню. Но, кажется, сначала запускам Квик, чтобы был активный процесс info.exe. А потом запускаем fordump с указанным ключами.

C:\ForDump\procdump.exe -e -ma -accepteula -w info.exe .\
QUIK 8.0
 
Цитата
Александр Волфовиц написал:
Nikolay, файлы *,dmp могут расшифровать только в ARQA? Самостоятельно понять причину невозможно?
Думаю что да. Я их отправлял на адрес тех. поддержки.
QUIK 8.0
 
Цитата
Александр Волфовиц написал:
Nikolay,эта утилита - ForDump - публичная? Или нужно персонально обращаться в компанию?

И ещё: причину "падения" вы так и не нашли? А как работал ваш драйвер на 32bit?
Наверно публичная, раз она есть на ftp: ftp://ftp.quik.ru/public/ForDump.7z

Запустить файл procdump.exe с ключом -e -ma -accepteula -w info.exe .\

Сделать это можно через командную строку, введя команды

cd <путь к каталогу ForDump>
(например: cd C:\ForDump)

procdump.exe -e -ma -accepteula -w info.exe .\

Вы также можете создать ярлык файла procdump.exe и в его свойства в поле "Объект" в конце строки через пробел добавить -e -ma -accepteula -w info.exe .\

Пример:
Объект: C:\ForDump\procdump.exe -e -ma -accepteula -w info.exe .\

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

В 32 бита, конечно, все работало. Я когда собирал для 64 бита типы переменных менял на соответствующие из ODBC 64 бита. Они другие должны быть. Правда в 64 бита отвалилась часть функциональности из библиотеки. В частности fetch. cur:fetch({}, "a") - в x86 работает, а в x64 - нет. Пришлось переписать на обход курсора через итератор.

Так что здесь что-то действительно из области взаимодействия. Т.к. при отладке через VS тоже Квик не падал. Когда появлялось окно ошибки, я запускал отладку VS, пропускал ошибки - Квик продолжает работать и даже выводит данные из базы.

Я решил отложить пока отладку всеx библиотек. Пусть сначала выйдет что-то стабильное.
QUIK 8.0
 
Цитата
Александр Волфовиц написал:
Пытаюсь постепенно переходить на 64bit QUIK ))  Имеется сложный фреймворк, связка lua с .dll , памяти занимает много, но выделение памяти контролируется.

Ранее .dll под 32bit компилировал в VS2013, работало всё на последней 32bit версии QUIK на слабом ноуте с 4ГБ памяти с процессором Intel (так же всё работало и на выделенном сервере)

Под 64bit компилируется на VS2017, версия QUIK 8.3.2.4 , работает на достаточно мощном ноуте, 12ГБ памяти, но с процессором AMD.

32bit вариант мог работать неделями, не закрывая квик, и работало зараз по 5-6 роботов, проблем не было совершенно.

64bit запустил одного робота, работает около часа, потом QUIK внезапно слетает, даже приблизительную причину аварийной остановки определить невозможно, т.к. не остаётся ни дампов , ни каких-то записей в моём логгере, т.е. причина останова, по всей видимости, очень серьёзная.

Вопрос1: была у кого-нибудь такая ситуация?

Вопрос2: может это быть как-то связано с особенностями процессоров AMD?

Я еще для 8.0 версии собирал ODBC драйвер. Падал почти сразу. Но... После общения с тех. поддержкой ARQA я попробовал записать дамп падения.
Мне прислали утилиту, дающую возможность снять дамп при работе Квика - ForDump.

Так вот дальше стало все интерснее, при запуске этой утилиты Квик не падал. Без нее падает. Т.е. дамп не сделать - не падает ведь. А без утилиты дампа нет.
Т.е. на лицо некая особенность обмена через стек при запущенной утилите.

Похоже без оптимизации библиотек под Квик x64 не обойтись.
Удаление элемента из массива, который прошёл проверку
 
Эту задачу можно решить разными способами.

1. Усложняете таблицу элементов. Вместо элементов - вложенные таблицы, с полями  sec_code и checked. После проверки ставите checked = true. Далее по условию проверяете, что элемент уже не трубует проверки.
   Недостаток - более сложная струтуруа, постоянно занятая памаять полной таблицей.
2. Вводите новую таблицу, уже проверенных элементов, и по условию вхождения в эту таблицу проверяете, что элемент уже не трубует проверки.
   Недостаток - рост занятой памяти, т.к. надо вводить новую сущность.
3. Как уже написали выше - ввести временную таблицу с нужными элементами, а в конце перейти на эту таблицу.
4. Перебор через while, удаление через table.sremove. Именно, через потокбезопасную функцию, хоть у Вас в коде и нет второго потока, использующего эту таблицу.
Почему через for делать нельзя ни в коем случае. Потому что цикл for вычисляет свои значения один раз перед стартом цикла. Поэтому он будет помнить число элементов в таблице, что было изначально - это его инвариантное состояние.
Поэтому while. И аккуратно сдвигать счетчик текущего элемента. Этот вариант самый нежелательный, хоть и рабочий.
Передача данных из скрипта в индикатор
 
Она же будет не обязательна к использованию. Кто мешает просто использовать драйвер и работать напрямую как сейчас.
Я хотел бы видеть что-то типа - ODBC RecordSet и просто с ним работать.
Передача данных из скрипта в индикатор
 
Квик это не позволяет.

Вопрос решается внешней библиотекой staticvar.dll, написанной Swerg https://quik2dde.ru/viewtopic.php?id=61
Либо аналогичной, которую можно найти на том же ресурсе.

Второй вариант - это испольовать in_memory database. Для примера SQLite. Для нее есть прямой драйвер или luasql. Но в свете перехода на x64, этот вариант может быть не таким простым в реализации, т.к. надо пересобирать драйвера.

В этом плане очень бы хотелось встроенной в Квик сущности, доступной из Lua, для подключения к внешним базам данных.
Страницы: Пред. 1 ... 9 10 11 12 13 14 15 16 17 18 19 След.
Наверх