Дмитрий написал: ,а что не так? Бумаги маржинальные, соответственно, и покупка больше, чем на 300 тыс. Откройте таблицу Купить/Продать и сравните
На учебном сервере плечо 2. Т е максимум 600 тысяч, но не 1 млн.759тыс982. Даже, если предположить, что плечо максимальное (для квалифицированных инвесторов, которым я являюсь, плечо 5 ) , то все равно не выходит каменная чаша.
Чудно считает CalcBuySell
Пользователь
Сообщений: Регистрация: 30.01.2015
28.03.2022 15:26:29
Добрый день, -------------- Вопрос к знатокам: ----------------------------- Вычисляю функцией CalcBuySell сколько акций можно купить.
фрагмент кода: local qty1,comis1=CalcBuySell(clas, sec,"1737","NL0011100043",price, true,false); ------------------------- Поясняю, что ожидаю: ------------------ На учебном сервере денежных средств 300 тысяч рублей. ---------------- Данная функция должна считать комиссию и число лотов для покупки по указанной цене. Полагаю, что коммиссия должна быть примерно одинаковой (сумма денег одна) А число акций умноженное на цену одной и на количество их в лоте должна составлять примерно 300 тыс рублей ------------------- Для проверки, считаю количество и комиссию по формуле. -------------------------- В результате обозначено: ------------------- qt1,comis1 - расчет функции qt,comis - расчет формулы m - сумма денег исходная m1- расчет суммы денег по результатам функции ----------------------- результат вычисления: ============= акции, для которых результат функции и по формуле примерно одинаковый: ------------------ TATNP,m=299983, lotsize=1., qty1=937, m1=299881, qty=935, comis1=229.26, comis=749, price=319.8 ROSN,m=299983, lotsize=1., qty1=844, m1=299887, qty=842, comis1=225.54, comis=749, price=355.05 ------------- "чудеса в решете": -------------------- CHMF,m=299983, lotsize=1., qty1=1530, m1=1759940, qty=260, comis1=746.54, comis=749, price=1149.8 ---------- при цене 1150 рублей по формуле можно купить 260 акций, что вполне похоже на правду. ----------------------------- функция считает, что можно купить 1530 акций, при этом комиссия примерно одинаковая, что указывает что затрачено примено 300 тыс рубг ---------------------- следующее чудо: SBER,m=299983, lotsize=10., qty1=1349, m1=1759982, qty=229, comis1=751.81, comis=749, price=130.41 ----------- Сбербанк акция 130 рублей по формуле можно купить 229 лотов или 2290 акций, что правда. функция считает, что можно купить 1349 лотов, на сумму 1млн759 тыс 982 рублей Величина комиссии указывает что ее считали с суммы 300 тысяч. --------------------- еще один прикол: AFLT,m=299983, lotsize=10., qty1=6567, m1=1760716, qty=1116, comis1=760.2, comis=749, price=26.8 ================== Кто сие может объяснить? Спасибо
написал: вычисления без этой функции можно ускорить, если запомнить размер лота и не извлекать его из хранилища а также не извлекать размер свободных денежных средств а рассчитывать их при совершении сделки и иногда сверять с портфелем.
Чтобы поделить количество свободных денежных средств на цену действительно не нужна никакая функция. Но существует такая вещь, как маржинальная торговля. Есть бумаги разного типа: маржинальные/не маржинальные, принимаемые и не принимаемые в в обеспечение маржинального кредита и пр. Почитайте, узнаете много интересного.
Я это знаю, но торгую лишь ликвидом, которые принимают. Поэтому такой проблемы нет. При расчете количества учитываю плечо. -------------------- Обратил внимание, что эта функция в некоторых случаях дает завышенные результаты. Как это объяснить не знаю.
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
27.03.2022 20:54:16
Цитата
Старатель написал: Теперь напишите функцию CalcBuySell, чтобы время её выполнения составляло единицы (на худой конец - десятки) микросекунд, а то у Арки не получается.
вычисления без этой функции можно ускорить, если запомнить размер лота и не извлекать его из хранилища а также не извлекать размер свободных денежных средств а рассчитывать их при совершении сделки и иногда сверять с портфелем. ----------------- результат теста для этого варианта позволяет укорить рассчеты примерно в 10..20 раз. AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)39.7 DSKY,money=299983,lot=10,qty=399,price=74.88,comis=749,,time(мкс)38.8 PHOR,money=299983,lot=1,qty=43,price=6900.0,comis=749,,time(мкс)12.7 SBER,money=299983,lot=10,qty=227,price=131.43,comis=749,,time(мкс)38.7 AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)20.3 LKOH,money=299983,lot=1,qty=56,price=5332.5,comis=749,,time(мкс)17.3 RUAL,money=299983,lot=10,qty=449,price=66.5,comis=749,,time(мкс)17.5 TATN,money=299983,lot=1,qty=706,price=423.5,comis=749,,time(мкс)14.5 AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)14.8 LKOH,money=299983,lot=1,qty=56,price=5320.5,comis=749,,time(мкс)13.7 SBER,money=299983,lot=10,qty=227,price=131.43,comis=749,,time(мкс)20.9 AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)84.9 LKOH,money=299983,lot=1,qty=56,price=5320.5,comis=749,,time(мкс)81.3 ROSN,money=299983,lot=1,qty=831,price=360.0,comis=749,,time(мкс)22.5 SBER,money=299983,lot=10,qty=227,price=131.43,comis=749,,time(мкс)27.2
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
27.03.2022 20:42:54
Цитата
Старатель написал: Теперь напишите функцию CalcBuySell, чтобы время её выполнения составляло единицы (на худой конец - десятки) микросекунд, а то у Арки не получается.
если вместо CalcBuySell считать по параметрам портфеля и инструмента, то получится примерно в 2 раза быстрее. результат теста: AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)213.1 GAZP,money=299983,lot=10,qty=124,price=240.2,comis=749,,time(мкс)174.3 MOEX,money=299983,lot=10,qty=309,price=96.68,comis=749,,time(мкс)124.6 SBER,money=299983,lot=10,qty=227,price=131.35,comis=749,,time(мкс)171.2 AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)384.6 GAZP,money=299983,lot=10,qty=124,price=240.08,comis=749,,time(мкс)144.3 NVTK,money=299983,lot=1,qty=221,price=1349.0,comis=749,,time(мкс)139.0 ROSN,money=299983,lot=1,qty=832,price=359.5,comis=749,,time(мкс)101.5 SBER,money=299983,lot=10,qty=227,price=131.35,comis=749,,time(мкс)136.4 AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)294.6 LKOH,money=299983,lot=1,qty=55,price=5370.0,comis=749,,time(мкс)195.8 MOEX,money=299983,lot=10,qty=309,price=96.68,comis=749,,time(мкс)198.0 SBER,money=299983,lot=10,qty=227,price=131.36,comis=749,,time(мкс)186.5 AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)239.0 IRAO,money=299983,lot=100,qty=1306,price=2.2895,comis=749,,time(мкс)116.6 MAGN,money=299983,lot=10,qty=650,price=46.0,comis=749,,time(мкс)150.9 SBER,money=299983,lot=10,qty=227,price=131.4,comis=749,,time(мкс)117.3
Старатель написал: Теперь напишите функцию CalcBuySell, чтобы время её выполнения составляло единицы (на худой конец - десятки) микросекунд, а то у Арки не получается.
сделал тест (фрагмент)
Код
local is_buy=true;
local is_market=true;
nklib.startA();
local qty,comis=CalcBuySell(clas, sec,"1737","NL0011100043", 0, is_buy, is_market);
x1=nklib.stopA();
Log:write(tostring(sec)..",qty="..tostring(qty)..",comis="..tostring(comis)..","..",time(мкс)"..tostring(0.1*x1).."\n");Log:flush()
на демо сервере получилось: время расчета не более 0.0005 сек. т е не более 500 микросекунд при расчете по рынку. ----------------------------------------- AFLT,qty=4309,comis=487.23,,time(мкс)412.3 MOEX,qty=277,comis=203.15,,time(мкс)259.2 SBER,qty=876,comis=490.81,,time(мкс)333.9 AFLT,qty=4309,comis=487.23,,time(мкс)542.0 ROSN,qty=786,comis=207.33,,time(мкс)468.0 AFLT,qty=4309,comis=487.23,,time(мкс)459.4 AFLT,qty=4309,comis=487.23,,time(мкс)418.2 ROSN,qty=786,comis=207.33,,time(мкс)321.3 AFLT,qty=4309,comis=487.23,,time(мкс)344.7 AFLT,qty=4309,comis=487.23,,time(мкс)314.1 NVTK,qty=206,comis=204.82,,time(мкс)206.1 TATN,qty=648,comis=208.2,,time(мкс)188.9 AFLT,qty=4309,comis=487.23,,time(мкс)240.8 AFLT,qty=4309,comis=487.23,,time(мкс)515.5 LKOH,qty=210,comis=483.08,,time(мкс)434.5 AFLT,qty=4309,comis=487.23,,time(мкс)435.4 VTBR,qty=1558,comis=207.15,,time(мкс)562.9 AFKS,qty=528,comis=394.79,,time(мкс)296.8 MGNT,qty=80,comis=203.1,,time(мкс)206.1 ROSN,qty=786,comis=207.33,,time(мкс)204.5 AFLT,qty=4309,comis=487.23,,time(мкс)237.7 AFKS,qty=528,comis=394.79,,time(мкс)364.7 LKOH,qty=210,comis=483.08,,time(мкс)290.4 ROSN,qty=786,comis=207.33,,time(мкс)264.4 AFLT,qty=4309,comis=487.23,,time(мкс)288.6
sleep
Пользователь
Сообщений: Регистрация: 30.01.2015
27.03.2022 16:25:12
Цитата
Старатель написал: sleep с отрицательным числом, видимо длится бесконечно долго. Скрытый текст То, что в sleep попало отрицательное число - моя ошибка. Но реализация слипа - ошибка ваша.
Читаем документацию у майкрософт на функцию sleep Значение INFINITE указывает, что время ожидания приостановки не должно истекать. INFINITE =-1 предположу, что любое отрицательное число даст тоже самое т е время ожидания - вечность.
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 18:05:11
сделал тестовый скрипт:
Код
name="main";
paths = "D:/QUIK_SCRIPT/"
function cb(i)
O=ds:O(i); H=ds:H(i); L=ds:L(i); C=ds:C(i); V=ds:V(i) Ti=ds:T(i)
Log:write("ds "..tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."\n");Log:flush()
end
function cb1(i)
O=ds1:O(i); H=ds1:H(i); L=ds1:L(i); C=ds1:C(i); V=ds1:V(i) Ti=ds1:T(i)
Log:write("ds1 "..tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."\n");Log:flush()
end
function main()
while true do
sleep(10);
if ds==nil then ds=CreateDataSource("QJSIM","SBER",INTERVAL_M1)
Log:write("ds="..tostring(ds).."\n");Log:flush()
ds: SetUpdateCallback (cb)
end
if ds1==nil then ds1=CreateDataSource("QJSIM","SBER",INTERVAL_M1,"Last")
Log:write("ds1="..tostring(ds1).."\n");Log:flush()
ds1: SetUpdateCallback (cb1)
end
if ds~=nil then local count=ds:Size();
local i=count; O=ds:O(i); H=ds:H(i); L=ds:L(i); C=ds:C(i); V=ds:V(i) Ti=ds:T(i)
Log:write("ds:count="..count..","..tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."/"..tostring(i).."\n");Log:flush()
end
if ds1~=nil then local count=ds1:Size();
local i=count O=ds1:O(i); H=ds1:H(i); L=ds1:L(i); C=ds1:C(i); V=ds1:V(i) Ti=ds1:T(i) i=i+1;
Log:write("ds1:coint="..count..","..O..","..H..","..L..","..C.."/"..i.."\n");Log:flush()
end
end
end
--------------
function OnInit(pfile)
Log=io.open(paths..name..".log","w")
end
В тесте открываются два источника: ds - это свечи обычные d1- это свечи "Last" тест пускаем на демо сервере. ----------------- Результаты ниже. Поясню что там. сначала смотрим ds и ds1 - они есть значит подписались ------------------ потом смотрим результат обычные свечи - есть а свечи last - нет ---------------------------- ds=table: 00000119201F8290 ds1=table: 00000119201F8BD0 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ds1:coint=0,0.0,0.0,0.0,0.0/1 ds:count=823,132.0,132.0,132.0,132.0/823 ------------------------
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 17:17:26
Цитата
написал: nikolz,
терминал на графике может нарисовать как свечи котировок, так и свечи параметров. Для получения свечей параметров необходимо в качестве источника указать один из параметров инструментов при построении графика. Вы можете это сами попробовать и (наверное) вы сможете это сделать.
функция createdatasource при указании названия параметра инструмента выводит не свечи котировок инструмента, а свечи истории этого параметра.
формат возвращаемых данных тот же самый и вы его правильно скопировали из документации.
таким образом, вы можете получать историю параметров в том же самом виде и формате, как и историю котировок.
спорить не стоит, но если потребуется помощь, спрашивайте.
правильно Вас понял, что без рисования принять параметры невозможно? -------------- и еще вопрос. При прорисовке параметров на графиках КВИК создает файл хранения истории данного параметра. Как правило это огромный файл на диске. Верно?
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 17:12:45
К вопросу о скорости передачи по DDE ---------------------- Переписал сервер DDE для LUA 5.4. ---------------------- Время передачи обезличенных сделок 16385 сделок по 8 параметров составляет 750 мкс. =============== Переписал программу обращения к источнику данных ds. Работает на 30% быстрее, чем исходная QLUA, но не быстрее DDE. ------------------------------ Время передачи 6 параметров свечи составляет 3 мкс, ===================== Время передачи по DDE 6 сделок по 8 параметров составляет 0.3 мкс.
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 16:59:55
смотрим документацию: Функция CreateDataSource возвращает таблицу Lua с параметрами:
т е в таблице нет каких либо других функций. Возможно функция возвращает параметры, но читать их очевидно надо этими функциями. Попытка вызвать с параметром Last на демо сервере дает нули, а свечи выдает нормально.
Параметр
Тип
Описание
SetUpdateCallback
function
Позволяет задать пользователю функцию обратного вызова для обработки изменившихся свечек
O
function
Получить значение Open для указанной свечи
H
function
Получить значение High для указанной свечи
L
function
Получить значение Low для указанной свечи
C
function
Получить значение Close для указанной свечи
V
function
Получить значение Volume для указанной свечи
T
function
Получить значение Time для указанной свечи
Size
function
Возвращает текущий размер (количество свечек в источнике данных)
Close
function
Удаляет источник данных, отписывается от получения данных
SetEmptyCallback
function
Позволяет получать данные с сервера без указания функции обратного вызова
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 16:54:32
Цитата
написал: У функции createdatasource есть последний параметр.
если вы его не указываете, функция возвращает свечи котировок инструмента. Если укажете ("bid" например), то будут свечи истории параметров инструментов.
таблица обезличенных сделок тут не при чем
Вопрос был, как прочитать то, что получили. Пример приведите.
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
Пользователь
Сообщений: Регистрация: 30.01.2015
26.03.2022 15:34:54
Цитата
BENDER написал: Здравствуйте. Только начал изучать LUA. Есть функция CreateDataSource (class_code, sec_code, interval , param); В описании говорится param - (STRING) необязательный параметр. Если параметр не задан, то заказываются данные на основании таблицы всех сделок.
Есть список param для акций
"LOTSIZE" -- Размер лота "BID" -- Лучшая цена спроса "BIDDEPTH" -- Спрос по лучшей цене "BIDDEPTHT" -- Суммарный спрос "NUMBIDS" -- Количество заявок на покупку "OFFER" -- Лучшая цена предложения "OFFERDEPTH" -- Предложение по лучшей цене "OFFERDEPTHT" -- Суммарное предложение "NUMOFFERS" -- Количество заявок на продажу "OPEN" -- Цена открытия "HIGH" -- Максимальная цена сделки "LOW" -- Минимальная цена сделки "LAST" -- Цена последней сделки "CHANGE" -- Разница цены последней
данные из секции Open, High, Low,Close,Time получаю без проблем. Даже миллисекунды выдаёт.
Код
for i = 1 , Size , 1 do
ds:T(i).ms
end ;
Но вот как мне из ds получить значения параметров для акций, к примеру "LAST" ?
функция CreateDataSource посволяет получить данные либо свечей либо из таблицы обезличенных сделок. Она создает таблицу ds функция CИ: T,function: C,function: H,function: V,function: SetEmptyCallback,function: _DataSource,_dataline_data_metatablegc: L,function: Size,function: SetUpdateCallback,function: Close,function: O,function: ------------------------- Поэтому , читать данные Вы можете лишь обращаясь к этим функциям, вне зависимости от заказанного параметра. =============== В таблице обезличенных сделок нет параметра "BID" -- Лучшая цена спроса "BIDDEPTH" -- Спрос по лучшей цене "BIDDEPTHT" -- Суммарный спрос "NUMBIDS" -- Количество заявок на покупку "OFFER" -- Лучшая цена предложения "OFFERDEPTH" -- Предложение по лучшей цене "OFFERDEPTHT" -- Суммарное предложение "NUMOFFERS" -- Количество заявок на продажу поэтому их Вы этой функцией не получите. ------------------------ Параметр Last - это close последней свечи.
лишний элемент или так задумано?
Пользователь
Сообщений: Регистрация: 30.01.2015
20.03.2022 15:08:15
Делаем список фирм и список счетов
Код
local s=""; for i=0,getNumberOf("firms")-1 do local x=getItem("firms",i); s=s.." "..x.firmid; end; message(s);
s="" for i=0,getNumberOf("trade_accounts")-1 do local x=getItem("trade_accounts",i); s=s.." "..x.firmid.."/"..x.trdaccid; end message(s);
результат: SMS_FIRM NC0014500000 MB1000100000 ALGO NC0011100000/NL0011100043 SPBFUT000000/SPBFUT001qm ====================== Вопросы к разработчикам: ------------------------ 1) Почему в таблице фирм отсутствуют фирмы, которые есть в таблице торговых счетов? -------------------------------- 2) Если так задумано, то где об этом написано. ------------------- 3) Зачем в таблице фирм указаны фирмы,у которых нет торговых счетов? Где об этом написано . ------------------------ Спасибо
лишний элемент или так задумано?
Пользователь
Сообщений: Регистрация: 30.01.2015
20.03.2022 14:02:02
Добрый день На учебном сервере версия 9.4 l------------------- читаем код клиента
Код
message("всего=.. getNumberOf("client_codes") );
for i=0,getNumberOf("client_codes")-1 do
local x=getItem("client_codes",i);
message("i="..i..",cod="..tostring(x) );
end
получаем результат: всего=2 i=0,cod=1737 i=1,cod= -------------------- если я правильно понял, то должен быть всего один код клиента. и действительно код i=0,cod= 1737 но почему-то их два, i=1, cod=пусто. ------------------------ Что не так я делаю? Какой в этом пустом коде тайный смысл? ======================================= Огласите весь список, п..жалуста, в каких еще таблицах так сделано. Спасибо.
Самое слабое место QLUA
Пользователь
Сообщений: Регистрация: 30.01.2015
19.03.2022 19:27:39
Цитата
написал: Nikolz, используйте классы в луа стиле. Все получится само собой.
Полагаю Вы либо не поняли, либо ошибаетесь. --------------- поясню на примере. В функции main делаем цикл чтения свечей и замеряем время . примерно так:
Код
nklib.startA();
while count>=i do
nklib.startB();
O=ds:O(i); H=ds:H(i); L=ds:L(i); C=ds:C(i); V=ds:V(i) Ti=ds:T(i)
x=nklib.stopB();
i=i+1;
m1=m1+1;
tx[i]={O,H,L,C,V,Ti}
end
x2=nklib.stopA();
Log:write(tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."/"..tostring(m1)..","..tostring(0.1*x2).." "..tsoc[m].."\n");Log:flush() --
В колбеке oпParam ставим цикл записи данных в таблицу примерно так:
Код
function OnParam (c,s) for m=1,10000 do t_[14]={c,s}; end
ncb=14; ESet(event); end -- изменение текущих параметров
После этого делаем три пуска программы. 1. без цикла 2. с циклом до 10 и 3. с циклом до 10000 ------------------- Что мы ожидаем получить: Если колбеки не влияют на функцию main то время получения свечей должно быть примерно одинаковым для одинакового числа свечей. ===================== Вот что получили 1.136.34,136.34,136.31,136.31/828,2511.1 SBER 2.136.3,136.3,136.29,136.29/829,6201.2 GAZP 3.136.27,136.27,136.26,136.26/830,27710.4 GAZP ============= Как видно время работы колбека влияет на время потока MAIN . без цикла = 2511 с циклом 10 = 6200 с циклом 10000= 27710 ================== Никакие пляски с бубном в написании классов Вам ничего не дадут. так как классы это всего-навсего массив в котором есть указатели на функции и данные. ============== а данная проблема связана с блокировкой глобального стека виртуальной машины луа. об этом я и рассказал ранее в этой теме.
Самое слабое место QLUA
Пользователь
Сообщений: Регистрация: 30.01.2015
18.03.2022 22:02:00
Известно, что колбеки в QLUA блокируют основной поток терминала QUIK. Решение изначально было спорное, но в ту пору попытка переубедить разработчиков в их ошибке была безрезультатна. ----------------------- Как мера, якобы устраняющая данную проблему, по задумке разработчика QLUA был введен еще один поток для функции main. ----------------------- Поэтому Всем известна рекомендация разработчиков делать минимальные вычисления в колбеках и выполнять основные расчеты в функции main. ================== Однако, это кажущееся ускорение вычислений легко можно свести к нулю, что уверен и делается большинством программистов роботов на QLUA. =================== Рассказываю в чем фишка. ================ Экспериментируя с реализацией пула потоков, обнаружил, что потоки, использующие область глобальных переменных, а также функция main на самом деле не работают независимо от колбеков, а тоже останавливаются на время их работы. Очевидно, это связано с блокировкой области глобальных переменных при работе колбеков. ==================== В итоге, если у Вас в функции main используются глобальные переменные, а это, в том числе , источники данных, то параллельная работа функции main не получится. ------------------ В итоге поток Main будет останавливаться вместе с основным потоком терминала и Ваш робот на QLUA будет фактически работать в одном потоке с остановками на каждом колбеке. ========================== Прикольно, но есть решение, которое позволяет: во-первых, полностью убрать из QLUA эти монстры-колбеки, останавливающие основной поток и функцию main в указанных выше случаях. во-вторых, не останавливать основной поток вообще для передачи данных в другие потоки, которых может быть любое число. ========================= я сомневаюсь, что разработчики когда-нибудь решат это сделать, так как им платят брокеры, а брокерам это до лампочки. ---------------------------- Поэтому могу лишь рекомендовать писателям роботов свести к минимуму использование глобальных переменных в функции main.
Отладка QUIK 9.3
Пользователь
Сообщений: Регистрация: 30.01.2015
18.03.2022 14:10:47
тестил версию 9.4 на демо сервере и отлаживал на ней софт для работы с потоками. ----------------- Версия понравилась. ------------------------- странно, но работает быстрее , чем 8.3. ------------------------ правда последняя - это на боевом сервере у Сбербанка. ---------------------- может сбербанк мышей не ловит? ------------------------------- кто бы их бы пнул под зад, чтобы движение у них вперед началось
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
18.03.2022 14:01:01
и еще... любая задача в потоке имеет доступ ко всем глобальным параметрам основного потока и основной функции MAIN. Время обращения к этой информации такое же.
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
18.03.2022 13:56:28
Добрый день,Всем! Предлагаю вашему вниманию сравнение быстродействия различных способов получения параметров свечи. ------------------------ фрагменты тестируемых скриптов: --------------------по документации-----------
Код
local tx=candel[m]; if tx==nil then tx={} candel[m]=tx; i=1; else i=#tx; end --таблица сделок по инструменту
local m1=0;
if tsoc[m]=="SBER" then
nklib.startA();
while count>=i do
nklib.start();
Ti=ds:T(i) O=ds:O(i); H=ds:H(ind); L=ds:L(i); C=ds:C(i); V=ds:V(i)
x=nklib.stop();
tx[i]={O,H,L,C,V,Ti}; i=i+1; m1=m1+1;
end
x1=nklib.stopA();
----------------передача в пул потоков--------------------
Код
local ev=nkevent.wait(event_Sber,0);
if ev==0 then
nklib.start();
nkevent.Res(event_Sber);
z=nkini.VMLua(pVMSber,"main",t,count);
x2=nklib.stop();
end
--фрагмент из скрипта отдельного потока
Код
nklib.startB();
local m=#candel; if m==0 then m=1 end
local m1=0;
while count>=m do
if PData==nil then PData,j=nkini.IniPData("ds"); end
O,H,L,C,V,T,x=nkini.GetData(m,PData);
candel[m]={O,H,L,C,V,T};
m=m+1;
m1=m1+1
end
======результат расчета в main ===================== count=484,x1=1948.1,x2=70.1 count=1,x1=239.1,x2=7.3 count=1,x1=66.5,x2=7.5 count=1,x1=59.6,x2=4.0 =======результат расчета в main потока ================ Sber,count=484,x1=1931.1 Sber,count=1,x1=146.6 Sber,count=1,x1=119.5 Sber,count=1,x1=9.5, =============================== итоги: в первой сточке указано время для получения 484 свечей x1- время затраченное на 484 свечи (~2 ms) x2 -время затраченное на передачу задачи в поток(0.07 ms) ------------ Далее обработка одной новой свечи x1=0.2 ms, x2=0.007 ms ======= Из результатов теста видно, что время передачи задачи в поток примерно в 20 раз меньше, чем время расчета в функции MAIN. --------------------------- Это время не зависит от сложности задачи. --------------------------- т е чтобы запустить алгоритм любой сложности в потоке для любого инструмента потребуется не более 0.0001 секунды. ------------------------ При этом колбеки не дублируются и выполняют минимум работы - устанавливают событие и передают свои данные в MAIN MAIN определяет текущую задачу и передает ее в свободный в пуле поток. -----------------------
написал: Теоретически справедливая цена фьючерса рассчитывается по следующей формуле Pфьючерс = Pспот * (1+R*(T/365) , где Pфьючерс – цена контракта Pспот – цена актива на спот-рынке R – безрисковая процентная ставка T – срок до истечения контракта в днях
Предлагаю посчитать. Базовым активом для фьючерсов Si является USDRUB_TOM Безрисковая процентная ставка наверное около 20% годовых (ставка ЦБ на текущий день?).
Дата 17 марта 2022 г., время около 12:30 мск - экспирация SiH2, можно сказать 1 день до экспирации. Теор.цена SiH2 по данным Quik: 104504 BID стакана БА: 104.7 ASK стакана БА: 104.65
Дата 17 марта 2022 г., время около 12:30 мск - до экспирации SiM2 91 день. Теор.цена SiM2 по данным Quik: 110412 BID стакана БА: 104.6550 AKS стакана БА: 104.6512
Вот конкретно у меня не сходятся цифры даже близко.
Если есть возможность, то посмотрите алгоритм расчета на бирже. Видел его там раньше. Сейчас у меня сайт биржи не открывается.
подключение библиотеки qlua.dll к скриптам в новых потоках
Пользователь
Сообщений: Регистрация: 30.01.2015
17.03.2022 11:16:45
всем спасибо, что молчали. Разобрался, тема закрыта. --------------- В итоге на каждый инструмент работает свой поток. --------------- Свободные потоки не закрываются, а ждут в пуле. -------------- Колбеки не дублируются. ---------------- Все скрипты запускаются одним кликом. --------------------------- И Вам того же желаю.
Сбербанк не позволяет скачать со своего сайта Quik 8
Пользователь
Сообщений: Регистрация: 30.01.2015
17.03.2022 07:06:14
Цитата
Автоном написал: Позвонил в службу техподдержки Сбера, ответили: действительно есть такая проблема, над ней работают, попробуйте другой браузер. Прошло 12 часов, Квик не скачивается ни Edge, ни Chrome. Предполагаю, что это дискриминация программы Quik, чтобы навязать пользователям приложение для торговли от Сбера. Что делать?
скачивается:
подключение библиотеки qlua.dll к скриптам в новых потоках
Пользователь
Сообщений: Регистрация: 30.01.2015
16.03.2022 19:33:20
Добрый день, ------------- Вопрос к разработчикам QUIK или к тем, кто это решил. ------------- версия QUIK 9.4. -------------------- Возникла следующая проблема. =========== Написал библиотеку запуска произвольных скриптов Луа по событиям в отдельных потоках из пула потоков. ============ Все работает замечательно. ============= Решил в скрипте, запущенном в моем потоке, обратиться к функциям из библиотеки QLUA. ============ Например, подключиться к источнику данных: ----------------------- if ds==nil then ds=CreateDataSource("QJSIM","SBER",INTERVAL_M1) end -------------------- Мой скрипт имеет функцию main и запускается из функции main Вашего скрипта. ---------------- В вашей main все работает, а в моей - пишет ds=nil.
Попытка подключить через require "qlua" дает ошибку: ---------------- D:/lua-5.4.2/lua54.exe: error loading module 'qlua' from file 'D:/QUIK_SCRIPT/qlua.dll': Не найдена указанная процедура. ---------------------- Проверяю зависимости - Все находит. ------------------------- Что делаю не так? Спасибо.
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
14.03.2022 07:03:41
Зачем же измерять время реакции робота на приход информации и знать время запаздывания этой информации спросите Вы? ----------------------- Поясняю, для тех, кому интересно.
Торговый робот - это система реального времени. Что это означает? Это означает то, что такая система должна успеть обработать пришедшие данные до момента прихода новых. Если робот не успевает их обработать, то данные либо теряются, либо Вы должны их накапливать для отложенной обработки. ----------------- Выше я показал время прихода информации Таблицы текущих параметров. Чаще всего именно по этой информации определяется изменение цены инструмента. Из данных выше следует что для демо сервера, информация об этом изменении может запаздывать до 1 секунды, а значения из пакета данных могут передаваться в колбек через 10 мкс. --------------- Ну и что? Это означает, что при задержке данных в 1 секунду не надо мечтать о создании HFT робота. ---------------- А получение данных из пакета с интервалом в 10 мкс может привести к тому, что Вы пропустите сильное изменение цены инструмента и узнаете об это по сливу вашего депозита на данном инструменте или с большим опозданием войдете в тренд.
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
13.03.2022 11:32:46
Продолжим тестировать скорость исполнения скриптов. версия квика 9.4. ------------ Посмотрим, как влияет на скорость выполнения колбека чтение каких либо параметров . ------------------ Сначала колбеки запишем так: function OnParam (clas, sec)-- изменение текущих параметров ncb=14; nkevent.Set(event); -- событие end function OnQuote (clas, sec)-- изменение стакана котировок ncb=15; nkevent.Set(event); -- событие end ------------------- т е в колбеках ничего не делаем. получаем: ============= 111746 1124068.5;14;0 111746 1.8;14;0 111746 1.3;14;0 111746 21.7;14;0 111746 1.7;14;0 111746 20.9;14;0 111746 21.1;14;0 111746 21.2;14;0 111746 1.5;14;0 111746 1.2;14;0 111746 6688.0;15;0 =========== Получаем пакета onParam один раз в секунду и вывод его в колбек onParam время примерно от 2 до 20 мкс. А колбек OnQuote исполняется аж 6688 мкс. =============== Теперь добавим в колбеки что-нибудь: Например так: function OnParam (clas, sec)-- изменение текущих параметров ncb=14; --local clas=class_code; local sec=sec_code; LAST=getParamEx(clas, sec,"LAST").param_value; nkevent.Set(event); end function OnQuote (clas, sec)-- изменение стакана котировок ncb=15; ql2 = getQuoteLevel2(clas, sec); nkevent.Set(event); end ---------------------- получаем: ============ 111942 1077168.6;14;0 111942 23.5;14;0 111942 77.2;14;0 111942 23.4;14;0 111942 40.1;14;0 111942 23.3;14;0 111942 40.2;14;0 111942 13.4;14;0 111942 47.4;14;0 111942 54.4;14;0 111942 40.6;14;0 111942 7207.1;15;0 ================== Как видим, теперь время колбека onParam составляет от 20 до 80 мкс Время колбека OnQuote стало 7200 мкс. Т е , чтобы прочитать один стакан затратили 7200-6700=500 мкс. ---------------- Очевидно, что колбек стакана очень тяжелый, так как на него затрачено в 100 раз больше времени чем на onParam. ====================== Обращаю Ваше внимание, что разбор пакета параметров происходит очень быстро время от 2 до 80 мкс. Поэтому если Вы поставите в main sleep , то main будет обрабатывать каждый чих колбека через интервалы сна. Вы не сможете установить слип меньше 3 мс т е 3000 мкс. А интервал кобеков в 1000 раз меньше. -------------------------- Поэтому sleep не применяю вообще, а использую системные EVENT.
не все то золото, что блестит
Пользователь
Сообщений: Регистрация: 30.01.2015
12.03.2022 17:38:55
информация к размышлению. Вопрос: Какую информацию мы получаем в реальности?. Для этого написал тест, который измеряет время реакции колбека относительно времени сервера. так как реальные торги сейчас не проводятся, то тестируем тестовый сервер. В итоге получаем следующий результат: Первое число -это время сервера, когда тот послал нам последнюю порцию данных. Например 17:16:22. Далее указано время , которое прошло с момента срабатывания последнего колбека QLUA например 723174.2 мкс, Т е прошло 0.7 секунды далее указан номер колбека например 15 - это колбек OnParam Обратите внимание на то, что далее время сервера не изменяется еще 9 значений. При этом время вызова колбека составляет не более 100 мкс, т е 0.0001 сек ---------------------------- что же это означает. Это означает, что данные мы получаем не чаще чем один раз в 0.7 секунды в виде пакета, Потом этот пакет пересылается нам в колбеки. В итоге вам кажется, что вы получаете данные в реальном времени, а в действительности с задержкой на 0.7 секунды. В реальных торгах задержка возможно и меньше, но передачу пакетом никто не отменял.
написал: на сайте биржи есть алгоритм. но у меня сайт биржи не открывается.
Если вы используете VPN то по рекомендации роскомпозора все иностранные ip адреса заблокированы, вернитесь на российский
у Вас эта ссылка работает:
?
getParamEx актуальный список param_name
Пользователь
Сообщений: Регистрация: 30.01.2015
11.03.2022 09:17:59
"param_name" для любой таблицы QUIK можно получить в терминале QUIK через экспорт таблицы по DDE в Excel. -------------------------------------- см. Руководство пользователя Раздел 6.
Теоретическая цена фьючерсов в опционном модуле
Пользователь
Сообщений: Регистрация: 30.01.2015
11.03.2022 08:55:01
на сайте биржи есть алгоритм. но у меня сайт биржи не открывается.
Теоретическая цена фьючерсов в опционном модуле
Пользователь
Сообщений: Регистрация: 30.01.2015
10.03.2022 16:38:26
Теоретически справедливая цена фьючерса рассчитывается по следующей формуле
Pфьючерс = Pспот * (1+R*(T/365)
, где Pфьючерс – цена контракта
Pспот – цена актива на спот-рынке
R – безрисковая процентная ставка
T – срок до истечения контракта в днях
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
написал: , если не трудно , дайте ссылку на пакет Alglib , который содержит методы машинного обучения. и перечислите, какие методы обучения в этой библиотеке есть. Спасибо.
- я запихал лес из Alglib в Java и Python. И в QLua конвертировать не проблема. Я использую ВСЕ языки программирования одновременно.
Это только у Вас объединение QLua с Python и C++ вызывает боль и гордое повторение мантры "яжпрограммист".
- всё к QLua можно прикрепить. Там и К-Кластер, простой perceptron, случайный лес и много чего ещё...
Вы, очевидно, меня с кем-то путаете. я никогда не писал, что у меня есть сложности с языками программирования. Пишу на любом. ----------------------------- Ранее написал, что не называю себя программистом, так как в моем понимании это переводчик готового текста со словарем. Этому сейчас учат в начальной школе. ---------------------------------------------- Я давно уже пишу собственные тексты и перевожу их на любой язык без словаря, так как давно закончил и школу и ВУЗ и защитил диссертацию по ИИ.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 30.01.2015
05.03.2022 07:00:55
Цитата
Nikolay написал: Справедливости ради, знание современных систем хранения версий - это ни в коем времени не характеризует кого-то как программиста. Я когда начинал, мы учились на бумаге. В первую очередь просто алгоритмы. Потом код на бумаге. И ничего, абстрактное мышление хорошо развивает. То что сейчас без знаний Git не считают кого-то полноценным программистом, то это сюр, т.к. это знание ничего не дает.
Nikolay, напишите как называется Ваша специальность в дипломе.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 30.01.2015
05.03.2022 06:56:22
Цитата
nikolz написал: , если не трудно , дайте ссылку на пакет Alglib , который содержит методы машинного обучения. и перечислите, какие методы обучения в этой библиотеке есть. Спасибо.
Спасибо, нашел. Теперь хотелось бы увидеть Ваше решение задачи об утопленниках на луа c помощью этой библиотеки. Ждемс.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 30.01.2015
05.03.2022 06:53:36
, если не трудно , дайте ссылку на пакет Alglib , который содержит методы машинного обучения. и перечислите, какие методы обучения в этой библиотеке есть. Спасибо.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
написал: Ваша ссылка на сайт - это сайт для чайников по обучению МО на питоне. Вы научились собирать из готовых кубиков на питоне программу, которая, как "черный ящик", ищет решение регрессионной задачи. Прекрасно. ------------------------------------- Но, если для Вас парсинг и МО - одно и тоже , тогда покажите Ваши результаты машинного обучения в LUA, на указанных Вами CSV файлах. ------------------------ или хотя бы разверните TORCH на Lua для начала.
Для меня нет трудностей в использовании Alglib на LUA. Но я скорей всего Python к QLua полностью прикручу, когда Биржа очухается.
И если у тебя из МО получается "черный ящик"... ну... посмотри его код хотябы...
Ну, во-первых, не у тебя, а у Вас. Полагаю, Вы не заразитесь манерой общения от Владимира. --------------------------- Во вторых, Вы полагаю не поняли термин "черный ящик". Но это не повод обижаться. Этот термин широко применяется в науке. ----------------------------- В- третьих, если трудностей не, то покажите на Вашей задаче ее решение на луа.
Проблема с запуском терминала на ноутбуке после отключения монитора
Пользователь
Сообщений: Регистрация: 30.01.2015
04.03.2022 09:53:05
Цитата
Роман написал: Поняли правильно. Такой возможности нет, так как при отсутствуии подключенных доп мониторов текущий и так является основным.
Удалось вернуть ермиал на текущий дисплей, переключив ориентацию экрана в книжную и обратно.
Надо в винде указать, что у Вас один монитор.
Что надо знать о LUA, чтобы не было мучительно больно.
Пользователь
Сообщений: Регистрация: 30.01.2015
04.03.2022 09:48:59
продолжаю тему , для интересующихся. -------------------------- Чтобы понять механизм хэширования, который используется в таблицах луа, предлагаю статью на китайском:
Гугл поможет без проблем. -------------------- если кто-то не осилит, то здесь ее перевод:
Что надо знать о LUA, чтобы не было мучительно больно.
Пользователь
Сообщений: Регистрация: 30.01.2015
04.03.2022 09:45:58
, Если нечего сказать по-существу вопроса, то просьба не засирать тему. я пишу не для Вас. Спите спокойно.
Что надо знать о LUA, чтобы не было мучительно больно.
Пользователь
Сообщений: Регистрация: 30.01.2015
04.03.2022 07:03:58
Добрый день, В данной теме предлагаю Вашему вниманию информацию о том, что у VM LUA (виртуальная машина луа) внутри. ------------------------------- Полагаю, что данный материал будет особенно полезным тем начинающим, которые буратино на фондовом рынке и чайники в программировании. ---------------------------- Основа VMLua - это таблицы. ------------------------------ Полагаю, что многие просто не представляют сложность реализации таблиц в VM Lua. ---------------------- Даю ссылку на статью. В ней речь идет о LuaJit - это более быстрый вариант VMLua, чем просто Lua 5.3 или 5.4. Но принцип организации работы с таблицами тот же. ------------------- Прошу:
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
написал: странное у Вас предложение. Вы предлагаете соревнование на питоне. Если очень Вам неймется, то тогда предлагайте на LUA. Форум-то про КВИК, а в нем лишь LUA.
CSV можно парсить только на Питоне?
Парсить - это всего навсего грамматический разбор информации. проще сказать выделение из набора слов частей грамматики(подлежащее, сказуемое и т д) ------------------------- Для машинного обучения на основе текстов это возможно и надо, но до машинного обучения это так же далеко, как от Вас до Луны. ---------------------------------------- Ваша ссылка на сайт - это сайт для чайников по обучению МО на питоне. Вы научились собирать из готовых кубиков на питоне программу, которая, как "черный ящик", ищет решение регрессионной задачи. Прекрасно. ------------------------------------- Но, если для Вас парсинг и МО - одно и тоже , тогда покажите Ваши результаты машинного обучения в LUA, на указанных Вами CSV файлах. ------------------------ или хотя бы разверните TORCH на Lua для начала.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 30.01.2015
03.03.2022 12:29:37
Цитата
Roffild написал: Я фанат современного программирования, который рос на , споря с программистами медицинского оборудования и с создателями . Я исходный код воспринимаю быстрее обычного текста.
И тут явился , который БЕЗ ДОКАЗАТЕЛЬНО наплёл, что он крут и Я ему неровня! Чтож... отвертеться у него не получится!
Задача начального уровня для МО: train.csv - данные для обучении модели test.csv с gender_submission.csv - тестовые данные с результатом
Нужно для train.csv получить свой "gender_submission.csv" и отправить в Kaggle на автоматическую проверку.
Мой результат с 77.99% на простой 4-х слойной сетке. Точную ссылку дам только после .
, отказ и увиливание от решения этой задачи будет расценено, как полная капитуляция и потеря права хоть чё-то вякать про программирование!
Проверочный файл можешь закачать куда-нибудь (админы этого форума додумались ZIP запретить) или сразу на . И исходники решения тоже выложи, если твоя модель больше 80% выдаст.
, странное у Вас предложение. Вы предлагаете соревнование на питоне. Если очень Вам неймется, то тогда предлагайте на LUA. Форум-то про КВИК, а в нем лишь LUA.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 30.01.2015
03.03.2022 12:17:08
, Правильно я Вас понял, что "алгоритмом МО" вы называете "алгоритм машинного обучения", а не алгоритм МО, указанного мною выше.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
написал: и еще... TORCH (факел) программа машинного обучения содержащая практически все, что из этого сейчас модно. --------------------- Гугл взял пакет TORCH7 для луа и сделал оболочку для питона. ----------------- разработчики TORCH7 взяли пакет программ для научных исследований на Фортране и сделали оболочку для CИ. ------------------- Прикольно.
Нет. Pytorch -
Caffe использует библиотеку и LAPACK , а это и есть то самое на фортране, для которых сделана обертка на СИ, для которой сделана обертка на питоне.
Как влияет кол-во неиспользуемых функций в файле индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
02.03.2022 09:56:28
В качестве совета начинающим. --------------------------- В луа вызов функций самая тяжелая операция (в смысле затрат времени процессора). --------------------- Поэтому, если очень хотите экономить время, то вставляйте код функции там, где хотите вызвать функцию. -------------------- Безусловно это приведет к затратам памяти. ------------------------ На самом деле, все не так уж и страшно. --------------------------- Если Вы начинающий, то у Вас будут существенно большие затраты и памяти и времени процессора из-за неоптимальности вашего алгоритма и выбираемых Вами методов.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 30.01.2015
02.03.2022 07:46:52
пардон, ошибся не ГУГЛ, а фейсбук.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 30.01.2015
02.03.2022 07:44:42
и еще... TORCH (факел) программа машинного обучения содержащая практически все, что из этого сейчас модно. --------------------- Гугл взял пакет TORCH7 для луа и сделал оболочку для питона. ----------------- разработчики TORCH7 взяли пакет программ для научных исследований на Фортране и сделали оболочку для CИ. ------------------- Прикольно.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
написал: ...Нет, лапуль, про Машинное Обучение я тоже не в курсе. Зато я в курсе, что обучение тоже УГРОБЛЕНО! ...И как, при работе этого самого "МО" комп успевает-таки отслеживать нажатие клавиш? Чо, УСПЕВАЕТ?! Большой успех молодого спортсмена! ::
Да поняли мы уже, что бот для шахмат - это достижение для тебя. Считаешь, что алгоритмы не создаются...
Чувак, всё современное МО строится на алгоритмах, недоступных компам до 2000-х. "Градиентный спуск" может распознать тебя в московском метро и предсказать цену акций. "Случайный лес" строит цепочку условий. МО - это то, что обыграет Каспарова. Но ты до сих пор можешь сидеть в своей пещерке. Хотя в твоём возрасте уже сложно разбираться в алгоритмах МО...
для справки: -------------------------- алгоритм "градиентный спуск" в обед -50 лет. см. Корн Г., Корн Т. Справочник по математике для научных работников и инженеров. — М.: Наука, 1970. — С. 575-576. ---------------- алгоритм "случайный лес" почти 30 лет. Основная идея заключается в использовании большого , каждое из которых само по себе даёт очень невысокое качество классификации, но за счёт их большого количества результат получается хорошим. По сраным обстоятельствам он схож с алгоритмом к-ближайших соседей, которому более 50 лет. -------------- Алгоритм глубокого обучения официально 15 лет. Но по сраным обстоятельствам этот алгоритм очень похож на МГУА , которому в обед 50 лет. ------------------ Алгоритм Мо - это вообще-то не алгоритм в узком смысле, а общая идея. Он применим к следующему классу задач: "Дается массив Arr длиной N и Q запросов. Каждый запрос представлен двумя числами L и R,и он просит вас вычислить некоторую функцию Func с под массивом Arr[L..R] в качестве аргумента." Алгоритм Мо (кит. 莫隊算法) был популяризован китайским спортивным программистом Мо Тао (莫涛) в конце нулевых годов. ----------------------- 50 лет - это тот срок, через который методы, известные в науке, доходят до массового потребления. ----------------------------- Причем, те, кто продвигает "новые" алгоритмы в массы , забывают сказать у кого они их взяли.
Как влияет кол-во неиспользуемых функций в файле индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
01.03.2022 19:10:49
поясняю: Смотрим API вызов функций: ---------------------- lua_getglobal(L, "f"); /* вызываемая функция */ lua_pushliteral(L, "как"); /* 1-й аргумент */ ------------------- lua_getglobal(L, "t"); /* таблица для индексирования */ --------------------- итд --------------------- Во всех случаях мы указываем имя функции и(или) имена переменных как строки. ------------------- Смотрим исходный код например LUA 5.3 (особой разници нет так как это у всех версий луа одинаково) если хорошо искать, то найдет функцию которая создаст кэш нашей строки и проверит новая это строка или нет =============== *luaS_new ( *L, const char *str) { unsigned int i = (str) % ; /* hash */ int j; **p = (L)->strcache[i]; for (j = 0; j < ; j++) { if (strcmp(str, (p[j])) == 0) return p[j]; } for (j = - 1; j > 0; j--) p[j] = p[j - 1]; p[0] = (L, str, strlen(str)); return p[0]; } Не сложно увидеть в этой функции циклы по глобальной таблице. Кроме того, второй цикл занимается перемещением элементов. ---------------------- Очевидно чем больше таблица и дальше по ней наша строка, тем дольше поиск. ------------------------ В итоге, по-моему мнению, число функций, как и число переменных, влияет не только на затраты памяти, но и на производительность т е загрузку процессора. -----------------