Я про хардварную проблему, при которой кнопка мыши срабатывает иногда два раза (и более) на одно нажатие. Количество кликов, которые можно услышать, при этом всё равно 1.
В QUIK в Lua инты 64 бита. Данные по тикам в документации к CreateDataSource:
Цитата
Время свечи возвращается с точностью до миллисекунд в виде таблицы с полями: {year, month, day, week_day, hour, min, sec, ms, count} Где: • count – количество тиковых интервалов в секунду. Может принимать значения от «1» до «10000» включительно.
Используя Lua функцию os.time из таблицы, полученной от T(номер свечи), можно получить секунды от эпохи (какой именно - поставьте эксперимент и напишите результат). А из полей ms и count - количество миллисекунд и десятых миллисекунд. Для перевода из виндовой эпохи в никсовую гуглите "SECS_BETWEEN_1601_AND_1970_EPOCHS"
Ну я же говорил, глючная тёмная тема) Создайте отдельный багрепорт без привычного Вам спама сообщениями внутри темы, в духе "поставил новейшую версию, включил тёмную тему, сделал то-то и то-то, получил странные иконки", ТП рано или поздно обратит внимание на тему (чем меньше спама, тем быстрее), запросит архив (м.б. с дампом), если не воспроизведёт самостоятельно. До запроса архива ничего в этой установке квика делать не надо, чтобы не влияло на анализ архива.
Для исключения dll попробуйте посмотреть через ProcessMonitor (захват должен стартовать до старта квика и продолжаться до проявления бага). QUIK в теории может грузить dll сам, например, при поиске индикаторов (при старте программы или при открытии окна добавления индикатора) или вообще все dll из папки запуска на старте, или ещё из папки, соседней к квику (quik\. .\lib\lua\5.*\). Но если нигде близко к папке квика Ваших лишних файлов dll нет, то проблема не в загрузке левых dll.
Serge123 написал: Эти иконки появляются, когда работает мой скрипт чисто на Луа, без загрузки посторонних модулей.
Учитывая Ваши ошибки с cpath и удивлением про именование модулей, я бы не был так уверен, что никаких dll не загружено. Техподдержка в явном виде мне отвечала, что именно такие проблемы могут быть именно от dll, как я и писал выше. Совет заменить тему на менее бажную уже от меня, не от техподдержки. Чисто посмотреть, проявится ли баг.
Serge123, Вы же за скорость радеете, почему тогда используете тёмную тему? Известно, что она тормозит. Глядишь, без неё и баги с иконками уйдут.
Я предполагаю, что проблема с иконками имеет ту же природу, что мой репорт про работу меню в английской версии. Однако у меня на русской версии и стандартной теме при многих загруженных dll никаких заметных проблем с иконками нет.
Единственная строка, на которой интерпретатор может тут выдать такую ошибку, это та, что начинается с "if order_info.sec_code", и единственная причина может быть в том, что order_info было nil т.к. getItem("orders", f) вернул nil. А вернуть он nil мог потому, что в другом потоке таблица orders поменялась. Потокобезопасно таблицы можно обходить с помощью SearchItems.
Скорее всего формат котировок немного поменялся (их можно вручную перенести, формат хоть и секретный, но очевидный), иначе нет смысла его затирать. Конечно перед апдейтом надо было бэкап делать. 11 версия уже есть. Название файла локализации менялось от версии к версии, подчерк убирался. Долгая загрузка часто значит, что много ошибок пишется в окно сообщений (см. размер tmsg.dat), почему-то это долгая операция.
Я понятия не имею, в какой момент фильтрация происходит. Эта настройка может быть вообще только для стаканов (т.е. после получения getQuoteLevel2), никогда не использовал. Так что или разрабы ответят, или свои эксперименты. Я бы с двух счетов (и двух квиков, подключённых к одному и тому же серверу, с настройками, отличающимися только указанной опцией) запустил и смотрел.
Andrey Golik написал: СергейК, Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Рассматривали ли вы как компания вариант реализации отдельных запрашиваемых юзерами фич именно как публичных скриптов на Lua (пусть и с подключаемыми DLL), а не встраивания их в код?
Юрий написал: В том и дело, что надо посмотреть ГО только на фьючерсах ФОРТС. У брокера Финам оно отображается в Тек.Чистых. У брокера БКС квик иногда создает специальное окно с названием ГО , а иногда не создает. Как вызвать это окно или создать самому?
Юрий.
У БКС в папке с квиком прилагается файл go.lua, можете исправить как Вам угодно. Он же есть в списке скриптов, ЕМНИП. Окно показывается только если была активность на фортс, например, выставлялась заявка.
Andrey Golik, если полнотекстовый поиск sec_code инструмента (например, BRG4) по info.wnd не даёт результатов, значит ли это, что инструмент был заменён корректно?
Илья, это Вам ещё везёт, что свечи номера не меняют от прохода к проходу, как тут Так-то стандартная идиома получается приводить индикатор к дефолтному состоянию при I == 1, но индексировать ничего по номеру свечи нельзя, если несколько инструментов на одном графике (поэтому я использую время)
Как минимум в БКС например биржевой сбор иногда транслируется неправильно после сделки (на одну копейку меньше или больше), что подтверждалось Мосбиржей в переписке. Этому багу как минимум год.
У мосбиржи есть апи для получения этих комиссий в течение сессии (но не после сессии!). Я к экселю прикрутил.
Зарелизился сабж 0.9.2 Качать Писать багрепорты здесь, примеры тут
Из нового, помимо новых контролов, их свойств, и обновления версии Lazarus:
По моей просьбе появилась поддержка виндовой кодировки (надо написать VCL.setCPWin(true) после стандартной инициализации, которая показана в примерах по ссылке выше). Реализована она конвертацией в UTF8 и обратно для всех строк, идущих внутрь GUI.
Форма нормально работает в main(), то есть не в главном потоке. Надо просто создавать форму в main() и потом в цикле делать VCL.Application():ProcessMessages(). Вроде раньше с этим были проблемы.
Я так понял, что изменилось создание меню. Пример. Действия заворачиваются внутрь Action вместе с иконкой и горячей клавишей.
Также обновляется GUI утилита для создания форм прямо на Lua (т.е. без установки Free Pascal) и сохранения формы в JSON. Сохраняется в UTF8, но если файл пересохранить в CP1251, загрузить в скрипте в квике и использовать пункт 1 списка, то русский язык должен быть на месте. Из минусов, утилита поддерживает не все доступные в VCLua контролы, и не все их свойства позволяет редактировать. В частности, пока нельзя задать иконки, картинки. Я утилиту запускаю через интерпретатор, перейдя в папку vt-form\vt-form\dist54\ и выполняю там команду путь-до-луа\qlua\bin\lua54.exe vt-form.lua
Автор сейчас активен на github и жаждет багрепортов.
Кстати, настройки индикаторов в каком-то смысле сохраняются. Я настроил 6 экземпляров Moving average на графике, сохранил как шаблон. Применил шаблон к новому графику, конечно же никаких Moving average не добавилось, но если начать вручную добавлять шесть штук Moving average, то они добавляются с моими настройками по очереди.
Andrey Golik, из-за невозможности отмены закрытия окон (не только графиков!!) мне приходится помимо закрепления тех графиков, которые я не двигаю и не клонирую часто, все 10 вкладок регулярно сохранять. Конечно пользователям было бы удобнее иметь возможность отменить закрытие любого окна. Зарегистрируйте такое пожелание, пожалуйста.
Такая организация позволяет не возиться с package.path, package.cpath, не иметь лишних dll в корневой папке квика и потенциально юзать в разных установках квика скрипты из одной папки.
Serge123 написал: 4. В аналогичном скрипте на Луа я накапливаю информацию в переменной-строке о сделках и стаканах и после достижения, скажем, 10 Мб дописываю её в файл и потом присваиваю этой переменной пустую строку. При этом каждый раз память для неё освобождается сборщиком мусора и затем выделяется и довыделяется много раз при её заполнении информацией. А выделение памяти не быстрый процесс. На си такой проблемы нет. Можно ли на Луа работу с этим буфером вывода сделать быстрее?
Накапливайте строки в таблице. Перед дампом делайте table.concat. Реализация table.concat в исходниках lua такова, что там одно выделение памяти на сумму длин строк в таблице. Но в Lua я не парюсь и юзаю PrintDbgStr + DebugView++.
Цитата
Serge123 написал: 5. В своём аналогичном скрипте на Луа при выводе содержимого стакана в переменную я беру текущее время через os.sysdate, она даёт даже мкс, откуда у неё такая точность?
Serge123 написал: 1. Скрипт, который работает с этой длл, начинается так:
У меня такой код никогда не приводил к описанной ошибке, пока lua_share.dll была в папке со скриптом:
Код
package.cpath = getScriptPath() .. "/?.dll"
sh = require "lua_share"
Но в результате мне больше нравится положить все dll'ки в одну папку так:
Код
c:\QUIK_installs\
lib\
lib\lua\
lib\lua\5.3\ тут dll для 5.3
lib\lua\5.3\vcl\ и тут тоже
lib\lua\5.4\ а тут для 5.4
lib\lua\5.4\vcl\ и тут
QUIK_BCS\
QUIK_BCS\info.exe квик тут
QUIK_BCS\lua\ скрипты тут и в подпапках юзают правильную версию dll из lib/5.* без возни с package.cpath, и умеют require "name" для правильных версий share/5.*/name.lua
QUIK_BCS\lua\lua_share_examples_5.4\
QUIK_BCS\lua\MA server\
QUIK_BCS\lua\MA server\share\
QUIK_BCS\lua\История позиций\
QUIK_BCS\LuaIndicators\
QUIK_megabroker\
QUIK_megabroker\info.exe а тут другая установка квика, но я так не пробовал ещё, поэтому и другие скрипты не перенёс изнутри первой установки квика
...
share\
share\lua\
share\lua\5.3\ тут общедоступные lua модули для 5.3
share\lua\5.4\ тут общедоступные lua модули для 5.4
nikolz написал: как решаете обмен данными между скриптами?
конкретно эти два не требуют обмена между собой. Для отрисовки результатов каждого из них написал индикатор, туда передаю из скриптов данные через lua_share.
Для более новой пары скрипт+индикатор уже всё пишу в одной dll на плюсах, там boost::lockfree::queue для сообщений индикатора в сервер (требующих синхронизации и долгой обработки), и std::atomic переменные для использования в индикаторе данных из сервера, типа atomic<MyData*>, чтобы знать, есть уже данные или нет, и atomic<std::size_t> size_of_shared_data , чтобы индикатор не лез в данные, которые сервер начал, но не закончил, писать, или atomic<double> price для цен других инструментов (берутся в сервере через update callback). В ситуации реконнекта приходится всё-таки юзать один mutex (в скрипте в OnConnected и в while (is_run), не индикаторе), вырубать все 28 экземпляров индикатора, перезаказывать данные, обновлять все указатели, и только потом разрешать индикаторам работать.
nikolz написал: Немного о новом языке Terra на основе Lua --------------------- Мы используем популярный скриптовый язык Lua для поэтапного выполнения нового низкоуровневого языка Terra. Пользователи могут реализовать оптимизацию на языке высокого уровня и использовать встроенные конструкции для генерации и выполнения высокопроизводительного кода Terra. Для упрощения метапрограммирования Lua и Terra используют одну и ту же лексическую среду, но для обеспечения производительности код Terra может выполняться независимо от среды выполнения Lua. Мы оцениваем наш дизайн, полностью переосмысливая существующие многоязычные системы в Terra. Наш автонастройщик на базе Terra для подпрограмм BLAS выполняет в пределах 20% от ATLAS, а наш DSL для трафаретных вычислений выполняется в 2,3 раза быстрее, чем рукописный C. ------------------------- Мы представляем экзотипы, определяемые пользователем типы, которые сочетают гибкость метаобъектных протоколов в динамически типизированных языках с контролем производительности языков низкого уровня. Подобно объектам в динамических языках, экзотипы определяются программно во время выполнения, позволяя вести себя на основе внешних данных, таких как схема базы данных. Для достижения высокой производительности мы используем поэтапное программирование для определения поведения экзотипа на этапе компиляции во время выполнения и реализуем экзотипы на Terra, низкоуровневом поэтапном языке программирования. Мы покажем, как конструкторы exotype создают и используют exotypes для реализации высокопроизводительных библиотек для сериализации, динамической сборки, автоматического дифференцирования и вероятностного программирования. Каждый экзотип обеспечивает выразительность, аналогичную библиотекам, написанным на языках с динамической типизацией, но реализует оптимизации, к оторые превосходят производительность существующих библиотек, написанных на низкоуровневых языках со статической типизацией. Хотя каждая реализация значительно короче, наша библиотека сериализации в 11 раз быстрее, чем Kryo, а наш динамический ассемблер в 3-20 раз быстрее, чем ассемблер Chrome от Google.
Это перевод абстракта статьи 2014 года. Хотя релизы есть и сейчас, до продакшна ещё далеко. Описанное ускорение стандартно для multi-staged programming, неважно на каком языке. Но тема с управлением компиляцией HL языком интересная.
Serge123, уже говорил, но повторю, что я юзаю библиотеку sol3 , чтобы писать на C++ вместо Lua и почти полностью забыть о стеке и Lua API. Библиотек под Lua маловато, критика в цитате обоснована. А python, да, медленный и изначально не параллельный.
Сергей написал: Однако способа, как получить тело ответа без cl:setopt_writefunction я не нашел. Может вы знаете?
в коде есть такое для Multi:
Код
-- reset callbacks to all easy handles
local function reset_easy(self)
if not self._easy_mark then -- that means we have some new easy handles
for h, e in pairs(self._easy) do if h ~= 'n' then
e:setopt_writefunction (function(str) buffers:append(e, "data", str) end)
e:setopt_headerfunction(function(str) buffers:append(e, "header", str) end)
то есть вроде бы там всё есть для принятия данных в lua таблицы и для Easy.
Цитата
ExpE написал: Объясните, пожалуйста, подробнее, что нужно сделать. Я скомпилировал с помощью luarocks файл lcurl.dll (Lua-cURLv3).
В папке с luarocks где-то есть lua54.dll и lua54.lib, или есть config*.lua, который содержит нужные пути, что-то типа такого:
Нужно заменить include файлы на правильную версию (если ещё не сделано), заменить lua54.dll из lib папки на квиковский, и lua54.lib из lib папки на аналогичный, полученный из квиковской lua54.dll по инструкции в интернете на тему create lib from dll, например этой, и перекомпилить, динамически подключая lua54.dll (а не статически, как сейчас). После чего lcurl.dll по идее станет совместим с квиком (но, видимо, перестанет быть совместимым с обычным интерпретатором).
Отличия lua5*.dll среди прочего в том, что есть код синхронизации, lua_lock и lua_unlock, вместо пустой заглушки в стандартном интерпретаторе.
Поможет ли это - хз :) для проверки попытайтесь не пользоваться квиковскими функциями внутри колбэка, передаваемого в setopt_writefunction. Создайте файл встроенными средствами lua и печатайте туда. Если сработает, то дело может быть в недоступности PrintDbgStr внутри lcurl.dll, и вероятность решения проблемы от процедуры выше повысится.
Рисунки не синхронизировать в квике. Задачу реально решить только через индикаторы, и то нетривиально (каждую линию вручную задавать, организовывать совместный доступ к данным из разных экземпляров индикатора)
Указанные dat файлы лежат в папке archive внутри папки квика. Из названий файлов понятно, какому инструменту и какому таймфрейму они соответствуют. Конечно же, можно удалить один из них, а не все, и перезапустить квик.
nikolz написал: Плaтфopмa ничего не считает сама , а покупают дaнныe с биpж и у пocтaвщикoв дaнныx (вне биржевых, например, FOREX).
Специально для Вас ссылка на FAQ TradingView про TVC:
Цитата
Этот префикс не является признаком какой-либо биржи: TVC расшифровывается как «TradingView Charts» и означает, что данные рассчитываются TradingView. Мы берём их из комбинированного потока данных, который получаем из разных источников. После обработки, полученные данные отображаются на графиках в режиме реального времени и любой желающий может использовать их бесплатно.
Последовательность поступления индексов в callback для источника данных (выбор архитектуры скрипта), Поступают в строгом порядке или это не гарантируется?
У меня I в колбэках всегда формировали неубывающую последовательность, покуда не происходит новый коннект к серверу, тогда I становилась равна 1 на первой свече обновлённого из-за реконнекта датасорса и далее росла заново.
Время свечей при этом не всегда формирует неубывающую последовательность, т.к. в archive/*.dat файлах, которые формируют историческую часть датасорса, могут быть свечи с одинаковым временем. Но это зависит от брокера и того, как он формирует эти архивные файлы. Я такое только на индикативных данных видел, которые транслируются с иностранных бирж.
nikolz написал: Правильно я понял, что свечи с таймом меньше дня считаются одинаково.Проблема только с дневными свечами. Верно?
В моём комменте было только про дневные, но индикативные курсы в квике транслируются иногда неверно и по минутным таймфреймам, т.к. какой-нибудь апдейт для, например, брента придёт не в 12:04:59, как должен был, а в 12:05:00 (так как внешние источники не идеально синхронны по времени с сервером брокера, который предоставляет эти индикативные курсы), из-за чего цена закрытия 12:04 1М и 12:00 5М свечек будет неправильной (в сравнении с другими источниками данных). Но это не часто бывает, и иногда исправляется после, как в квике, так и в альтернативных источниках данных. Часовики тоже по-разному строятся, т.к. расчёт SPX идёт от 16:30, и часовики на TradingView будут 16:30-17:30-18:30 и так далее, а в квике, finamtrade и Investing.com первая часовая свечки будет 16:30-17:00, и далее обычные часовики. Так что ещё вопрос, где свечки "настоящие". --------"TradingView -- вообще ничего не рассчитывает - это Веб агрегатор." Во-первых, там есть источник "TVC:", который как раз рассчитывает свечи, хитро усредняя из других источников, а не просто копируя выхлоп какого-то стороннего сервиса. Во-вторых, если бы они только предоставляли чужие данные, откуда бы они взяли такие дневки по срочному рынку мосбиржи? 05.10.2023 свеча CRZ3 открытие 13.907 на TradingView и 13.9 в квике и на сайте мосбиржи. Да, сессия на фьючах начинается с 19:05, но даже на сайте мосбиржи дневки фьючей строятся по календарному дню.
Я пока что думаю, что дневки TradingView сама строит из младших свечек.
nikolz написал: Не знал что свечи можно формировать по разным алгоритмам Всегда считал что свеча - это 5 индикаторов, алгоритмы которых настолько примитивны. --------------- Ну если разработчики Квика умудрились изобрести новый алгоритм формирования свечей, то хотелось бы увидеть его. Или это тайна?
К сожалению, можно. Например, дневные свечи срочного рынка на TradingView начинаются от 19:05, а в квике от 9:00. Или, скажем, дневные свечки акций СПб биржи в квике строятся по часовому поясу мосбиржи, хотя ясное дело нужно строить по часовому поясу биржи, где торгуется исходная акция. Это влияет на цену закрытия дневки, т.к. реальное закрытие переносится на следующий день (в 0:59) в зимнее время США.
Валентина Волгоград написал: При торговле фьючерсами нефти, золота и газа важно использовать их споты для анализа и прогнозов. Возможно ли внести спот нефти BRENT, WTI, золота и натурального газа в доступные инструменты?
Зависит от брокера, у БКС есть, например, базовые фьючи на брент и газ, в квике. В Финаме в квике нету, только в транзаке.