Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
TGB, я ассерт на копии значений поставил в функцию инвертирования таблицы, но не упомянул. Так как нужно это только для дебага ручных операций, то не стал заморачиваться с такими вещами как вторичная инвертированная таблица для проверки уникальности по месту.
Генерировать сериализированные файлы в формате исполняемого кода это что называется все фломастеры на вкус разные. Вывод всё равно получается кашеобразный и нечитаемый.
Два последних можно делать такими же как два предыдущих, а не использовать QTABLE_DEFAULT_COLOR.
Код
SetColor ( tab, y, x, bgcol, txtcol, bgcol, txtcol )
Зато понятно почему мой генератор такой ошибки не встретил - там не использовалось ни QTABLE_NO_INDEX ни QTABLE_DEFAULT_COLOR, все значения были указаны явно.
Источник проблемы найден - не прошло и полгода, но потребовался сторонний эксперт т.к. ТС сам разбираться отказывается. Теперь можно с одной стороны передать багрепорт, а с другой стороны не вызывать функцию SetColor если первые три аргумента равны -1.
Сгенерировал большой объем табличных данных методом Перлина, никаких ошибок не заметил. Значения ячеек устанавливаются нормально, никакого шаманства не требуется. При вызове слишком высокого количества SetCell и т.п. в секунду, прорисовка таблицы начинает лагать, что в целом и ожидается - можно обновления засовывать в очередь и постепенно данные кормить в таблицу. На моей машине 40х40 ячеек с периодичностью обновления 100 мсек немного лагает но в целом справляется. Если периодичность увеличить до 10 мсек то таблица так лагает что даже сама не прорисовывается и надо кликать, но данные никуда не пропадают и ошибок не возникает.
У вас код так скажем "не без помарок" и "ошибка" совпадает с получением новых данных и соответственно отрисовкой таблицы, с учётом этого самый вероятный вариант это что просто у вас где-то в коде происходит потеря данных, вот они и из таблицы исчезают.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
По поводу метаметодов еще. Метаметод __pairs может препятсвовать правильной выгрузке, так что "pairs ( t )" надо заменить на "next, t". Метаметод __metatable может скрывать истиную метатаблицу так что getmetatable and setmetatable надо заменить на debug.getmetatable и debug.setmetatable.
Также rawset не принимает невалидные ключи, так что надо добавить барьер.
Код
if kcurr ~= nil and kcurr == kcurr then rawset ( tcurr, kcurr, v ) end
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
TGB, в Lua имеется встроенный компилятор который производит бинарный байткод, который может выполняться в виртуальной машине Lua. В него можно отправлять целые файлы или отдельные фукнции. Байткод потом можно загрузить в виде исполняемого кода. Никаких преимуществ по сравнению с использованием обычных текстовых исходников не даёт - Lua и так перед началом работы внутренне производит этот байткод и его потом исполняет.
Так что технически есть возможность сбрасывать и загружать чистые Lua-функици. Но поскольку нужно будет еще и сбрасывать C-функции, что невозможно, то лучше и Lua-функции не поддерживать. Перед вызовом сериализаторов просто затолкайте нужные функции в таблицу алиасов, и они подцепятся. Классы кстати тоже туда нужно заталкивать, иначе при загрузке будут воспроизводиться копии объектов-классов а не использоваться созданные в программе.
Артем написал: Не надо объяснять злым умыслом то что можно объяснить некомпетентностью.
В предыдущих версиях этого не было.
Это называется "регрессия". Где-то что-то исправили, в итоге в другом месте где-то что-то сломалось. В больших проектах это нормальная ситуация - зависимостей в коде много и часть из них весьма неочевидны. Варианта действий тут всего три: откатить все изменения и выбросить на помойку всю проделанную работу и делать заново, либо сидеть дебажить пока не починится (не факт что что-то еще не сломается в процессе ремонта) и откладывать обновления, либо выпустить как есть и заниматься исправлением багов в обычном режиме - по мере фиксации. Шизики не принимающие таблетки берут первый пункт, мамкины перфекционисты комнатные берут второй, бизнесмены берут третий.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Я понял в чём проблема с метатаблицами: возможны ситуации, когда метатаблица загружается до того, как исползующий ей стол, тогда метаметоды будут активны сразу. Метаметоды можно обойти через rawset.
Код
if vt == 'table' then tlist[ v ] = tlist[ v ] or alias[ v ] or { }; v = tlist[ v ]
elseif vt == 'number' then v = alias[ v ] or tonumber ( v ) or 0/0
elseif vt == 'string' then v = alias[ v ] or unescape ( v )
else v = alias[ v ]
end
rawset ( tcurr, kcurr, v )
Не уверен стоит ли добавлять строку для обработки булевых значений явно вместо простого добавления алиасов. Это освободит имена "true" и "false" но их по-хорошему нельзя ни для чего другого использовать в любом случае. Плюс сериалайзеры всё равно смотрят в таблицу алиасов первым шагом. Для читабельности кода разве что?
Код
elseif kt == 'boolean' then kcurr = alias[ k ] or k == 'true'
elseif kv == 'boolean' then v = alias[ v ] or v == 'true'
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
elseif kt == 'boolean' then kcurr = alias[ k ] or k
elseif vt == 'boolean' then tcurr [ kcurr ] = alias[ v ] or v
переменные k и v здесь строкового типа со значениями "true" или "false" текстом, таблицы с булевыми значениями загрузятся неправильно.
С алиасингом булевых значений в глубоких таблицах действительно была ошибка которую надо исправить, хотя в целом некритичная - булы они и в африке булы, под каким именно алиасом они сидели это неважно.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
local s = dumpstr ( { charpattern = utf8.charpattern } )
local t = loadstr ( s )
print ( t.charpattern == utf8.charpattern )
> true
for i = 1, math.max ( string.length ( t.charpattern ), string.length ( utf8.charpattern ) ) do
print ( string.byte ( t.charpattern, i ), string.byte ( utf8.charpattern, i ) )
end
> 91 91 / 0 0 / 45 45 / 127 127 / 194 149 ...
Может в терминале вывод тестировали и он на нулевых байтах обрывал вывод?
С метатейблами тоже мне не понятно в чём затруднение - тут и так сначала заполняется исходная таблица а потом её содержимое влючая метатаблицу, просто за счёт того в каком порядке данные сбрасываются: никакой дополнительной программной обработки не требуется. Метаметоды конечно должны быть в таблице алиасов - программный код не может быть сброшен и загружен. При желании можно с байткодом конечно шаманить но с функциями на С это всё равно не работает, так что ради единообразности и Lua функции тоже не поддерживаются.
С булевыми значениями действительно просчёт, но решается он так же как с математическими константами: добавлением алиасов.
Наличие такого поля позволит оценить актуальность значения параметра. Параметры работающие в реальном времени (такие как статус торговли) стали бы "обновляться" в момент вызова функции а не в момент фактического изменения.
Незнайка, тут подразумевается что пользователь имеет достаточно высокий урвень айсикью, чтобы не ждать заполнения таблиц которые однозначно будут пустыми.
Забыл добавить что про форматы даты/числа это только к фильтрам и автоформатированию. Сортировка работает при использовании любого формата чисел, главное чтобы число текущего момента было выше чем число предыдущего.
Тут судя по всему в инструкции неверный термин использован - если "ключ" использовать как "порядковый номер в таблице" то работает без нареканий - удаление, добавление, сортировка, всё остальное. Сортировка работает по просто числовому полю value, у QTABLE_DATE_TYPE число должно быть восьмизначное формата YYYYMMDD, у QTABLE_TIME_TYPE шестизначное формата HHMMSS. С типом QTABLE_DATETIME_TYPE не разобрался, но вариации и комбинации двух предыдущих типов не работают.
swerg, тут видимо суть в том, чтобы работало по принципу "пропущена запятая - отказ", чтобы надёжно - с реальными деньгами таки дело идёт, так что мало ли. Благо дело при создании формы программным путём, сделать её идальной это невелика проблема.
Код
function TradePriceFormat ( value, accuracy )
return string.format ( string.format ( "%%.%df", accuracy ), value )
end
Тут конечно с неявным округлением последнего знака, но кашу после него всё равно надо как-то округлять в любом случае.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, Lua работает с ошибками но такой же результат кода на С это другое. То С лучший язык то С++ на самом деле получше. С меня достаточно этого маразма. Жаль тут функции игнора нет, придётся силу воли задействовать.
Алексей, бинарный плагин для Lua можно сделать и его подцепить. Только используйте С, меньше геморроя будет. У Lua есть специальный API для работы из С и для запуска бинарных библиотек. Еще можно просто обычную библиотеку на С написать и загрузить её в Lua с помощью alien (установить через luarocks).
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, использовать в тысячу раз более тяжеловесный и в целом несовместимый язык ради однострочных комментариев - ну-ну. Это при том что в изначальном собственно языке они тоже доступны, надо только инструкцию прочитать.
Артем написал: Можно проверять объём строк в таблицах и спать пока он равен нулевому.
Так во многих таблицах количество строк и будет нулевым, пока вы спите. Откуда, например, взяться заявкам, сделкам, позициям по фьючерсам etc., если вы спите?
Дык в main-треде спать? Он отдельно от главного треда, асинхронно выполняется. Пока в нём спишь, данные с сервера приходят и обрабатываются.
Roman Azarov написал: Вызов OnParam происходит при изменении параметра(ов) и, в текущей реализации, функции действительно неизвестно, значение каких конкретно параметров было изменено.
1) с сервера приходят полные данные об обновлении 2) движок QUIK их обрабатывает и обновляет таблицы 3) движок Lua API вызывает глобальную функцию OnParam с двумя аргументами class_code и sec_code Где-то между шагами 2 и 3 одна из функций забывает передать часть данных дальше по цепочке. Это не нереализованный функционал а просто ошибка программиста. Главное чтобы не по логике а-ля "я точно знаю что это никому не потребуется ведь я умнее всех и мне виднее" - знавал таких ведущих разработчиков, геморройно с такими общаться: даже если носом ткнуть то всё равно неправоту не признают месяцами и не то что не исправляют, а еще и подчинённым препятствуют исправлять.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
local i = -999
for i = 1, 100 do
if math.random ( 0, 9 ) == 0 then
print ( i )
break
end
end
print ( i )
Код
#include "stdio.h"
#include "stdlib.h"
int main ( int argc, char ** argv )
{
int i = 0;
for ( int i = 1; i < 100; i++ )
{
if ( rand ( ) % 10 == 0 )
{
printf ( "%d\n", i );
break;
}
}
printf ( "%d", i );
return 0;
}
Можете начинать аргументировать почему С это плохой язык.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, Я на иностранных форумах как-то байку слышал, что там программистов за 35 на работу не берут, особенно в таких местах как Сан-Франциско. Видимо по причине вот такого подхода к делу у ветеранов программирования. Я программирую уже 15 лет, видимо мне осталось где-то еще 15-25 пока катушка не съехала.
Владимир, тут по аналогии с предсказанием погоды - точность математических погодных моделей посредственная в лучшем случае, но при наличии миллионов точек данных с погодных зондов можно составить статистическую модель у которой довольно высокая точность. Данные со временем только накапливаются, точность улучшается.
Владимир, если у алгоритма выше точность в 0.05 раз, то это хороший алгоритм. А то что затрата вычислительных ресурсов больше в 50 раз, то это издержки производства - можно потратить время/деньги а можно выбрать алгоритм похуже но "подешевле".
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, про область видимости переменных в университете не проходили? Или вы уроки лекции прогуливали? Лекции о форматирование кода и именовании переменных тоже видимо мимо вас прошли.
А собственно: инструкция "Интерпретатор языка Lua", раздел 3.11 "Функции для работы с заявками", пункт 1 функция "sendTransaction", примечание жирным текстом:
Цитата
ВАЖНО! Для корректной обработки данных числовые значения (цена, количество, идентификатор транзакции и т.д.) должны передаваться в виде строковых значений.
Тут собственно ваша ошибка/лень. Протокол - строковый, конвертируйте ваши значения в строки.
Вопрос к разработчикам ровно один и простой: неужели до сих пор нельзя сделать так, чтобы параметр Transaction["PRICE"] можно было задавать числом, а не строкой?!
Вроде в инструкции указано что все параметры транзакции - строковые.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир написал: К нейросетям я всегда относился полунасмешливо
Зря. GPT-3 уже может писать книги, программировать на декларативных языках, и делать арифметику в уме (т.е. без использования программы-калькулятора) до пятизначных слагаемых. GPT-4 не за горами, и он возможно сам сможет написать GPT-5.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, буду надеяться что нейросеть будет работать как описано - извлекать скрытые и неизвестные зависимости в голом потоке данных и воспроизводить их. На друих задачах итоговая точность обычно составляет от 85% до 99% - для фондового рынка я пологаю что величина будет значительно ниже. Однако базовый анализ авторегрессором показывает значительную корреляцию, так что резонно пологать что итоговая точность будет значительно выше 50%, чего будет достаточно для торговли в плюс. В такой ситуации вам не останется выбора, кроме как признать мою авторитетность в этом поле деятельности.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, в поисках плохих языков далеко ходить не надо - C++, Java, Rust - мы все о них слышали. Lua это один из хороших языков, рядом с C и Python.
Легко наверное жить когда уровень ЧСВ еще выше чем уровень IQ. Когда нейронный робот запустится, я с вами поделюсь данными о монетарной производительности.
Владимир, тут по аналогии с астрономией - в каталог занесены миллиарды звёзд, и при проверке новой гипотезы все их надо проверять на предмет корреляции. Обычно с этой целью арендуют время на суперкомпьютерах за государственные деньги, ну или за свои если толщина кошелька позволяет. Но это разовые исследования, проще оплатить аренду чем покупать свою аппаратуру - а обработка таких данных на торговой площадке должна происходить постоянно, выявлять новые корреляции графиков нужно на ежедневной основе. Так что тут выбор между тремя стульями: либо использовать неполный набор данных и получить низкокачественный результат, либо обрабатывать данные раз в неделю/месяц/квартал в фоне по мощностям компьютера, либо докупить аппаратуры чтобы можно было использовать весь набор данных и обработать его между закрытием вечерней сессии и открытием утренней.
Старатель, ну тут кто хелловорлды пишет а кто гигабайтами данных ворочает - два ядра два гига с механической памятью кому-то хватит, а у кого-то программа с миллионами свечек в обработке начнет лезть в своп и без того скудная скорость скатывается в ноль. Все фломастеры на вкус разные.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, спасибо за торговую информацию. Я начинал писать робота без надежды на прибыль, считая что точность технического анализа будет приближаться к броску монетки в силу турбулентности рынка. Но видя что алгоритмический робот может надёжно торговать в плюс, мне теперь кажется что и мой нейронный робот тоже будет хорошо справляться.
По поводу экспертизы я уже сказал - кто не знает языка в полной мере тот не эксперт как ни крути. Это примерно как Вася-токарь с опытом 40 лет, который вручную точит хорошие детали, но так и не умеет пользоваться блоком ЧПУ и особо ядрёные чертежи ему не по зубам, хотя станок справился бы.