Bitmex должен будет купить лицензию QUIK, установить сервер и транслировать данные - тогда можно будет через терминал к нему подключиться.
Что бы это значило?
Пользователь
Сообщений: Регистрация: 03.02.2021
22.03.2021 23:27:51
Опять писатели инструкций говна в дупу залили, ну что-ж такое-то, сколько можно?!
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
22.03.2021 14:39:34
TGB, я ассерт на копии значений поставил в функцию инвертирования таблицы, но не упомянул. Так как нужно это только для дебага ручных операций, то не стал заморачиваться с такими вещами как вторичная инвертированная таблица для проверки уникальности по месту.
Генерировать сериализированные файлы в формате исполняемого кода это что называется все фломастеры на вкус разные. Вывод всё равно получается кашеобразный и нечитаемый.
Что бы это значило?
Пользователь
Сообщений: Регистрация: 03.02.2021
22.03.2021 11:11:27
Два последних можно делать такими же как два предыдущих, а не использовать QTABLE_DEFAULT_COLOR.
Код
SetColor ( tab, y, x, bgcol, txtcol, bgcol, txtcol )
Зато понятно почему мой генератор такой ошибки не встретил - там не использовалось ни QTABLE_NO_INDEX ни QTABLE_DEFAULT_COLOR, все значения были указаны явно.
Что бы это значило?
Пользователь
Сообщений: Регистрация: 03.02.2021
22.03.2021 10:41:45
Источник проблемы найден - не прошло и полгода, но потребовался сторонний эксперт т.к. ТС сам разбираться отказывается. Теперь можно с одной стороны передать багрепорт, а с другой стороны не вызывать функцию SetColor если первые три аргумента равны -1.
Что бы это значило?
Пользователь
Сообщений: Регистрация: 03.02.2021
21.03.2021 13:13:17
Сгенерировал большой объем табличных данных методом Перлина, никаких ошибок не заметил. Значения ячеек устанавливаются нормально, никакого шаманства не требуется. При вызове слишком высокого количества SetCell и т.п. в секунду, прорисовка таблицы начинает лагать, что в целом и ожидается - можно обновления засовывать в очередь и постепенно данные кормить в таблицу. На моей машине 40х40 ячеек с периодичностью обновления 100 мсек немного лагает но в целом справляется. Если периодичность увеличить до 10 мсек то таблица так лагает что даже сама не прорисовывается и надо кликать, но данные никуда не пропадают и ошибок не возникает.
У вас код так скажем "не без помарок" и "ошибка" совпадает с получением новых данных и соответственно отрисовкой таблицы, с учётом этого самый вероятный вариант это что просто у вас где-то в коде происходит потеря данных, вот они и из таблицы исчезают.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
21.03.2021 08:46:25
По поводу метаметодов еще. Метаметод __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. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
21.03.2021 08:43:16
TGB, в Lua имеется встроенный компилятор который производит бинарный байткод, который может выполняться в виртуальной машине Lua. В него можно отправлять целые файлы или отдельные фукнции. Байткод потом можно загрузить в виде исполняемого кода. Никаких преимуществ по сравнению с использованием обычных текстовых исходников не даёт - Lua и так перед началом работы внутренне производит этот байткод и его потом исполняет.
Так что технически есть возможность сбрасывать и загружать чистые Lua-функици. Но поскольку нужно будет еще и сбрасывать C-функции, что невозможно, то лучше и Lua-функции не поддерживать. Перед вызовом сериализаторов просто затолкайте нужные функции в таблицу алиасов, и они подцепятся. Классы кстати тоже туда нужно заталкивать, иначе при загрузке будут воспроизводиться копии объектов-классов а не использоваться созданные в программе.
написал: Не надо объяснять злым умыслом то что можно объяснить некомпетентностью.
В предыдущих версиях этого не было.
Это называется "регрессия". Где-то что-то исправили, в итоге в другом месте где-то что-то сломалось. В больших проектах это нормальная ситуация - зависимостей в коде много и часть из них весьма неочевидны. Варианта действий тут всего три: откатить все изменения и выбросить на помойку всю проделанную работу и делать заново, либо сидеть дебажить пока не починится (не факт что что-то еще не сломается в процессе ремонта) и откладывать обновления, либо выпустить как есть и заниматься исправлением багов в обычном режиме - по мере фиксации. Шизики не принимающие таблетки берут первый пункт, мамкины перфекционисты комнатные берут второй, бизнесмены берут третий.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
21.03.2021 02:10:45
Я понял в чём проблема с метатаблицами: возможны ситуации, когда метатаблица загружается до того, как исползующий ей стол, тогда метаметоды будут активны сразу. Метаметоды можно обойти через 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 функции тоже не поддерживаются.
С булевыми значениями действительно просчёт, но решается он так же как с математическими константами: добавлением алиасов.
Не надо объяснять злым умыслом то что можно объяснить некомпетентностью.
Добавить в вывод GetParamEx() поле с указанием времени последнего обновления
Пользователь
Сообщений: Регистрация: 03.02.2021
19.03.2021 11:07:34
Незнайка, на усмотрение разработчиков. Нужно только чтобы был часовой ориентир, относительно чего он установлен это неважно.
Добавить в вывод GetParamEx() поле с указанием времени последнего обновления
Пользователь
Сообщений: Регистрация: 03.02.2021
18.03.2021 23:11:05
Наличие такого поля позволит оценить актуальность значения параметра. Параметры работающие в реальном времени (такие как статус торговли) стали бы "обновляться" в момент вызова функции а не в момент фактического изменения.
Событие получения данных всех таблиц и графиков после подключения к серверу
Пользователь
Сообщений: Регистрация: 03.02.2021
18.03.2021 21:11:27
Nikolay,это уже реализовано - OnParam и т.п. При ответе сервера приходит колбек. Нет ответа - нет и колбека.
как вставить системное время в ячейку таблицы
Пользователь
Сообщений: Регистрация: 03.02.2021
18.03.2021 09:50:43
Ячейка может быть пустой если в поле value были переданы битые данные, если вы адресуете несуществующую ячейку.
Событие получения данных всех таблиц и графиков после подключения к серверу
Пользователь
Сообщений: Регистрация: 03.02.2021
18.03.2021 09:45:44
Незнайка, есть определённый список таблиц, без данных из которых невозможно начать автоматическую торговлю. Вот их и ждём.
Событие получения данных всех таблиц и графиков после подключения к серверу
Пользователь
Сообщений: Регистрация: 03.02.2021
18.03.2021 09:02:04
Незнайка, тут подразумевается что пользователь имеет достаточно высокий урвень айсикью, чтобы не ждать заполнения таблиц которые однозначно будут пустыми.
недокументированные события QTABLE при нажатии мышки
Пользователь
Сообщений: Регистрация: 03.02.2021
18.03.2021 08:55:51
Забыл добавить что про форматы даты/числа это только к фильтрам и автоформатированию. Сортировка работает при использовании любого формата чисел, главное чтобы число текущего момента было выше чем число предыдущего.
недокументированные события QTABLE при нажатии мышки
Пользователь
Сообщений: Регистрация: 03.02.2021
18.03.2021 08:53:37
Тут судя по всему в инструкции неверный термин использован - если "ключ" использовать как "порядковый номер в таблице" то работает без нареканий - удаление, добавление, сортировка, всё остальное. Сортировка работает по просто числовому полю value, у QTABLE_DATE_TYPE число должно быть восьмизначное формата YYYYMMDD, у QTABLE_TIME_TYPE шестизначное формата HHMMSS. С типом QTABLE_DATETIME_TYPE не разобрался, но вариации и комбинации двух предыдущих типов не работают.
Снимать активные заявки одной понятной клавишей, в таблице заявок, В талице заявок
Пользователь
Сообщений: Регистрация: 03.02.2021
18.03.2021 07:54:19
A.T., в терминале QUIK имеется редактор горячих клавиш. Можете там поставить любую клавишу на любое действие.
Событие получения данных всех таблиц и графиков после подключения к серверу
Пользователь
Сообщений: Регистрация: 03.02.2021
18.03.2021 00:21:03
Незнайка,когда таблицы заполнятся, очевидно же. Да и как вы торговать собрались не имея никаких данных, в любом случае?
QUIK не отправляет заявку, в которой цена представлена переменной
Пользователь
Сообщений: Регистрация: 03.02.2021
17.03.2021 21:39:06
swerg, тут видимо суть в том, чтобы работало по принципу "пропущена запятая - отказ", чтобы надёжно - с реальными деньгами таки дело идёт, так что мало ли. Благо дело при создании формы программным путём, сделать её идальной это невелика проблема.
Код
function TradePriceFormat ( value, accuracy )
return string.format ( string.format ( "%%.%df", accuracy ), value )
end
Тут конечно с неявным округлением последнего знака, но кашу после него всё равно надо как-то округлять в любом случае.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
17.03.2021 21:16:37
Владимир, Lua работает с ошибками но такой же результат кода на С это другое. То С лучший язык то С++ на самом деле получше. С меня достаточно этого маразма. Жаль тут функции игнора нет, придётся силу воли задействовать.
Алексей, бинарный плагин для Lua можно сделать и его подцепить. Только используйте С, меньше геморроя будет. У Lua есть специальный API для работы из С и для запуска бинарных библиотек. Еще можно просто обычную библиотеку на С написать и загрузить её в Lua с помощью alien (установить через luarocks).
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
17.03.2021 19:26:43
Владимир, использовать в тысячу раз более тяжеловесный и в целом несовместимый язык ради однострочных комментариев - ну-ну. Это при том что в изначальном собственно языке они тоже доступны, надо только инструкцию прочитать.
На пенсию, товарищ.
недокументированные события QTABLE при нажатии мышки
написал: Можно проверять объём строк в таблицах и спать пока он равен нулевому.
Так во многих таблицах количество строк и будет нулевым, пока вы спите. Откуда, например, взяться заявкам, сделкам, позициям по фьючерсам etc., если вы спите?
Дык в main-треде спать? Он отдельно от главного треда, асинхронно выполняется. Пока в нём спишь, данные с сервера приходят и обрабатываются.
Добавить аргумент param в колбек OnParam
Пользователь
Сообщений: Регистрация: 03.02.2021
17.03.2021 18:42:33
Цитата
Roman Azarov написал: Вызов OnParam происходит при изменении параметра(ов) и, в текущей реализации, функции действительно неизвестно, значение каких конкретно параметров было изменено.
1) с сервера приходят полные данные об обновлении 2) движок QUIK их обрабатывает и обновляет таблицы 3) движок Lua API вызывает глобальную функцию OnParam с двумя аргументами class_code и sec_code Где-то между шагами 2 и 3 одна из функций забывает передать часть данных дальше по цепочке. Это не нереализованный функционал а просто ошибка программиста. Главное чтобы не по логике а-ля "я точно знаю что это никому не потребуется ведь я умнее всех и мне виднее" - знавал таких ведущих разработчиков, геморройно с такими общаться: даже если носом ткнуть то всё равно неправоту не признают месяцами и не то что не исправляют, а еще и подчинённым препятствуют исправлять.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
17.03.2021 18:28:12
Владимир, у вас этот код на С не компилируется что ли, что вы его С++ обзываете? Был бы С++ я бы писал void main ( ) и #include <cstdlib>.
Средства разработки многопоточных скриптов в 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. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
17.03.2021 00:23:52
Владимир, Я на иностранных форумах как-то байку слышал, что там программистов за 35 на работу не берут, особенно в таких местах как Сан-Франциско. Видимо по причине вот такого подхода к делу у ветеранов программирования. Я программирую уже 15 лет, видимо мне осталось где-то еще 15-25 пока катушка не съехала.
getCandlesByIndex опа опа а что это у нас тут, getCandlesByIndex опа опа а что это у нас тут
Пользователь
Сообщений: Регистрация: 03.02.2021
17.03.2021 00:18:45
Владимир, тут по аналогии с предсказанием погоды - точность математических погодных моделей посредственная в лучшем случае, но при наличии миллионов точек данных с погодных зондов можно составить статистическую модель у которой довольно высокая точность. Данные со временем только накапливаются, точность улучшается.
getCandlesByIndex опа опа а что это у нас тут, getCandlesByIndex опа опа а что это у нас тут
Пользователь
Сообщений: Регистрация: 03.02.2021
16.03.2021 22:45:40
Владимир, если у алгоритма выше точность в 0.05 раз, то это хороший алгоритм. А то что затрата вычислительных ресурсов больше в 50 раз, то это издержки производства - можно потратить время/деньги а можно выбрать алгоритм похуже но "подешевле".
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
16.03.2021 22:42:27
Владимир, маразм это у вас в голове, если вы задокументированную функцию языка принимаете за ошибку. На пенсию пора.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
16.03.2021 22:34:56
Владимир, про область видимости переменных в университете не проходили? Или вы уроки лекции прогуливали? Лекции о форматирование кода и именовании переменных тоже видимо мимо вас прошли.
getCandlesByIndex опа опа а что это у нас тут, getCandlesByIndex опа опа а что это у нас тут
Пользователь
Сообщений: Регистрация: 03.02.2021
16.03.2021 22:26:51
Владимир, все так делают, но свечки они и в африке свечки. Если по алгоритму окно требуется большое, то и свечек загрузить надо будет очень много.
Событие получения данных всех таблиц и графиков после подключения к серверу
Пользователь
Сообщений: Регистрация: 03.02.2021
16.03.2021 22:25:28
Можно проверять объём строк в таблицах и спать пока он равен нулевому.
QUIK не отправляет заявку, в которой цена представлена переменной
Пользователь
Сообщений: Регистрация: 03.02.2021
16.03.2021 22:20:21
А собственно: инструкция "Интерпретатор языка Lua", раздел 3.11 "Функции для работы с заявками", пункт 1 функция "sendTransaction", примечание жирным текстом:
Цитата
ВАЖНО! Для корректной обработки данных числовые значения (цена, количество, идентификатор транзакции и т.д.) должны передаваться в виде строковых значений.
Тут собственно ваша ошибка/лень. Протокол - строковый, конвертируйте ваши значения в строки.
QUIK не отправляет заявку, в которой цена представлена переменной
Вопрос к разработчикам ровно один и простой: неужели до сих пор нельзя сделать так, чтобы параметр Transaction["PRICE"] можно было задавать числом, а не строкой?!
Вроде в инструкции указано что все параметры транзакции - строковые.
В коллбек OnParam приходит набор измененных параметров, а не какой-то один конкретный параметр.
В колбек OnParam приходит только код класса и интрумента, больше туда ничего не приходит, в частности набор измененных параметров.
Если значений имеется несколько а не одно, то значит надо использовать массив вместо простой переменной. Отмазка не засчитана.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
16.03.2021 00:59:07
Владимир, знаете о нейросетях в районе ничерта, а заявления делаете громкие. Непрофессионально.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 23:53:26
Цитата
Владимир написал: К нейросетям я всегда относился полунасмешливо
Зря. GPT-3 уже может писать книги, программировать на декларативных языках, и делать арифметику в уме (т.е. без использования программы-калькулятора) до пятизначных слагаемых. GPT-4 не за горами, и он возможно сам сможет написать GPT-5.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 21:20:27
Владимир, буду надеяться что нейросеть будет работать как описано - извлекать скрытые и неизвестные зависимости в голом потоке данных и воспроизводить их. На друих задачах итоговая точность обычно составляет от 85% до 99% - для фондового рынка я пологаю что величина будет значительно ниже. Однако базовый анализ авторегрессором показывает значительную корреляцию, так что резонно пологать что итоговая точность будет значительно выше 50%, чего будет достаточно для торговли в плюс. В такой ситуации вам не останется выбора, кроме как признать мою авторитетность в этом поле деятельности.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 20:55:29
Владимир, в поисках плохих языков далеко ходить не надо - C++, Java, Rust - мы все о них слышали. Lua это один из хороших языков, рядом с C и Python.
Легко наверное жить когда уровень ЧСВ еще выше чем уровень IQ. Когда нейронный робот запустится, я с вами поделюсь данными о монетарной производительности.
getCandlesByIndex опа опа а что это у нас тут, getCandlesByIndex опа опа а что это у нас тут
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 20:44:37
Владимир, тут по аналогии с астрономией - в каталог занесены миллиарды звёзд, и при проверке новой гипотезы все их надо проверять на предмет корреляции. Обычно с этой целью арендуют время на суперкомпьютерах за государственные деньги, ну или за свои если толщина кошелька позволяет. Но это разовые исследования, проще оплатить аренду чем покупать свою аппаратуру - а обработка таких данных на торговой площадке должна происходить постоянно, выявлять новые корреляции графиков нужно на ежедневной основе. Так что тут выбор между тремя стульями: либо использовать неполный набор данных и получить низкокачественный результат, либо обрабатывать данные раз в неделю/месяц/квартал в фоне по мощностям компьютера, либо докупить аппаратуры чтобы можно было использовать весь набор данных и обработать его между закрытием вечерней сессии и открытием утренней.
getCandlesByIndex опа опа а что это у нас тут, getCandlesByIndex опа опа а что это у нас тут
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 20:27:52
Старатель, ну тут кто хелловорлды пишет а кто гигабайтами данных ворочает - два ядра два гига с механической памятью кому-то хватит, а у кого-то программа с миллионами свечек в обработке начнет лезть в своп и без того скудная скорость скатывается в ноль. Все фломастеры на вкус разные.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 19:43:38
Владимир, спасибо за торговую информацию. Я начинал писать робота без надежды на прибыль, считая что точность технического анализа будет приближаться к броску монетки в силу турбулентности рынка. Но видя что алгоритмический робот может надёжно торговать в плюс, мне теперь кажется что и мой нейронный робот тоже будет хорошо справляться.
По поводу экспертизы я уже сказал - кто не знает языка в полной мере тот не эксперт как ни крути. Это примерно как Вася-токарь с опытом 40 лет, который вручную точит хорошие детали, но так и не умеет пользоваться блоком ЧПУ и особо ядрёные чертежи ему не по зубам, хотя станок справился бы.