Добрый день, Тестил скорость питона, луа и jit и решил посмотреть, как ускорит Lua5.4 по сравнению 5.3. -------------------- Раньше было быстрее, да и интернет говорит об этом же. Выкладывал тест на форуме. ------------ Но получился прикол. На этом тесте оказалось наоборот Вот этот testSM.lua
Код
local V={}
local t=os.clock();
local N=256;
local y=0.;
local A=100.
local P=128
local W=2*3.14/N
for i=1,10000000 do
y=A*math.sin(W*i);
end
local t1=os.clock()
print("time="..t1-t,"y="..y);
Добрый день, Эта тема в основном для начинающих строителей роботов. -------------------------- На вопрос как сохранить или как передать данные в другой скрипт и приложение, я рекомендую начать с обмена через файлы. -------------------- Как правило в ответ получаю - через файлы - это медленно. На вопрос -откуда Вы это знаете -обычно ответа нет. ---------------- Аналогичный вопрос возникает при попытке передать данные из одного приложения в другое. --------------- Тем кто, знает С for Lua, рекомендую mapping files, как самый универсальный и быстрый способ обмена, если Вас не устраивает обычный обмен через файлы. --------------- В этой теме я покажу как "медленно" реализуется обмен через файлы. =============== Тест обмена через файлы в одном приложении. ------------------- Написал вот такой тест:
Код
pD ="D:/QUIK_SCRIPT/nk_bot/Data/"
fn=pD..name..".log"; Log=io.open(fn,"w");
pDA ="D:/QUIK_SCRIPT/nk_bot/DataA/"
fnA=pDA..name..".log"; LogA=io.open(fnA,"w");
--------------------
local nF=nkevent.ccf(fn);
local nFA=nkevent.ccf(fnA);
local _,_,dHMS1=nkvm.D();
for j=1,100 do
local _,_,dHMS=nkvm.D(); d=(1000000.*(dHMS-dHMS1))//1;
Log:write(j..","..dHMS..","..d.."\n");Log:flush();
while true do
if nkevent.wcf(nF) then dHMS1=dHMS; local C=Log; Log=LogA; LogA=C; local x=nF; nF=nFA; nFA=x break; end
end
end
Что он делает? Создаем на диске два каталога Data и DataA до запуска скрипта. Скрипт открывает в каждом из каталогов файл test.log. ------------------- Далее в цикле 100 раз производится запись с нечетным j в файл в Каталоге Data. При обнаружении записи в файл , производим запись в файл в каталоге DataA по четным значениям j. ------------------ Таким образом, в файл каталога Data записываются ответы на запись в файл каталога DataA и наоборот. --------------------- Каждая запись содержит значения j, текущее время и задержку обнаружения записи в очередной файл.
Самое смешное то , что задержка измеряется в мкс и составляет в среднем не более 10 . т.е. 0.000001 сек. ------------------------- Это медленно?
Запаздывание тиков
Пользователь
Сообщений: Регистрация: 30.01.2015
12.01.2024 08:39:27
Добрый день, Вопрос к разработчикам. Можете объяснить, почему на учебном сервере тики приходят с запаздыванием от 500 до 1700 ms. При этом задержка обмена по интернет не более 30 ms. Задержка обработка колбека не более 0.1 ms Вот результаты теста строки с первым числом 2 - это обработка колбека onAllTrade. Последнее число в строке(zT) - это задержка в ms Я понимаю, что это учебный сервер, но у всего есть причина. Хотелось бы понять и простить.
выкладываю для общего пользования свой тест измерения времени подключения источников данных. Так как ранее использовался очень большой скрипт, то пришлось написать специально тест для общего пользования. ------------------- В тесте используется два таймера. Один - мой на основе высокоточного счетчика OC на СИ. Выкладывал его на форуме. Его квант 0.1мкс. Второй - на основе socket. Для исключения сомнения в измерениях. Его квант 1 мс. ------------------- Начинающие писатели роботов, можете позаимствовать мое решение организации очереди.
Код
--тест скорости подключения источников данных -автор nikolz
name="testnk"
paths = "D:/nkarray/"
package.cpath =paths.."?.dll";
require "nkarray"
p2 = "D:/luasocket/"
package.cpath =package.cpath ..";"..p2.."?.dll";
package.path =package.path..p2.."?.lua;"
socket = require("socket")
path = "D:\\QUIK_SCRIPT\\nk_bot\\"
Log=io.open(path..name..".log","w")
Ntp=0; tp={}
local ds_int={INTERVAL_M1,INTERVAL_M5,INTERVAL_M30,INTERVAL_TICK};
function main()
local t,int,tms,t1;
while true do
while Ntp>0 do
t=tp[Ntp]; Ntp=Ntp-1 clas=t[1] sec=t[2]
for i=1,#ds_int do ds={}
t2=socket.gettime()*1000.
nklib.startB();
int=ds_int[i];
local d,err; while d==nil do d,err=CreateDataSource(clas,sec,int); end
d:SetEmptyCallback();
t1=0.01*nklib.stopB();
tms=(socket.gettime()*1000.-t2)//1
Log:write("interval="..int..",sec="..tostring(sec)..",tnk="..t1.."мкс, tsocet="..(tms).."мc\n");Log:flush();
end
end
sleep(1);
end
end
function OnInit(pfile) fconnect=isConnected(); end
function OnParam(c,s) Ntp=Ntp+1; tp[Ntp]={c,s}; end
Время подключения источников с интервалом 1,5,30 минут составляет 30 мкс. Время подключения тиков 12900 мкс. замедление в 400 раз. ================== Демо сервер КВИК. версия КВИК 11.1.0.45
Lua таблицу в файл и обратно
Пользователь
Сообщений: Регистрация: 30.01.2015
10.01.2024 15:00:47
Преобразование таблицы Lua в строку, запись в файл и загрузка таблицы из файла в скрипт.
Код
function value2text(t,s) --преобразование таблицы в скрипт
local s1=""; --новое значение
local n=string.len(s); local z=string.sub(s,n);
local m= type(t);
if m=="string" then
s1='"'..tostring(t)..'"'; elseif m=="number" then s1=tonumber(t); elseif t==nil then s1="nil";
elseif m=="table" then local f;
for j,v in pairs(t) do
local x=v;
if f then s1=s1.."," end f=1;
if type(j)~="number" then s1=s1..'\n["'..tostring(j)..'"]='; end
s1=value2text(x,s1);
end
if z=='}' then s1='\n{'..s1..'}'; else s1='{'..s1..'}' end
end
return s..s1;
end
-------------------- это пример вывода и загрузки с распечаткой значений из таблиц
local t2={6,7,8,9}
local t={1,2,3,4,5,"asd",t2} -- это таблица которую выводим в файл
----------вывод в файл
local fn=p3.."test999.lua"
fLog=io.open(fn,"w"); fLog:write("t1="..value2text(t,"").."\n");fLog:flush()
fLog:close();
-----------ввод из файла
dofile(fn);
----------------прочитали таблицу из файла в таблицу t1
--теперь печатаем из введенной таблицы значения и сравниваем их со значениями в t2 и t
local t3=t1[7]
local s1=t1[6];
print(t1[1],s1,t3[3])
результат: это содержимое файла test999.lua:
Код
t1={1,2,3,4,5,"asd",{6,7,8,9}}
это печать значений
Код
1 asd 8
Тормоз подключения тиков
Пользователь
Сообщений: Регистрация: 30.01.2015
06.01.2024 10:29:34
Добрый день, Вопрос к разработчикам. Можете объяснить, почему выполнение функции CreateDataSource для тиков выполняется в 700 раз медленнее (у меня за 189000 мкс) чем для других интервалов (у меня за 270 мкс)
Мой робот
Пользователь
Сообщений: Регистрация: 30.01.2015
30.12.2023 10:35:45
Добрый день, Решил замутить тему о том, как я строю робота. ------------------- В данной теме, если не лень, буду описывать основные блоки нового робота, которого сейчас пишу. -------------- Данный робот обрабатывает информацию по всем инструментам, на которые мы подписываемся в терминале QUIK. --------------------- В этом роботе, назовем его для определенности Петя (Вася у меня был 10 лет назад), выделяю два основных блока(мозга)- спинной и головной. ----------------- Спинной блок отвечает за обработку , которую необходимо выполнять для получения и отправки информации на биржу или брокеру. К этому блоку относится обработка информации о сделках и заявках. Спинной блок занимается рутинной работой, без которой невозможно торговать. --------------- Головной блок занимается управлением торговлей. Он осуществляет прогноз движения рынка и формирование сигналов покупки/продажи. Головной блок - это творческая часть робота, которая собственно либо сливает депозит, либо его увеличивает. ========== Спинной блок. Здесь реализуется следующие блоки обработки: 1. OnTransReply - транзакций 2. OnStopOrder - информации о выставленных стоп-заявках 3. OnOrder - информации о выставленных заявок 4. OnTrade - информации о совершенных своих сделках 5. OnParam -информации об изменении состояния подписанных в терминале QUIK инструментов -------------- OnParam Пример реализации функции:
Код
function OnParam(c,s)
if TLL and c~="SPBFUT" and c~="CETS" then
local Lev=tonumber(getParamEx(c,s,"LISTLEVEL").param_value);
if Lev>0 then
local i=1; while #TLL>=i do if Lev==TLL[i] then break; end i=i+1 end
if i>#TLL then return; end
end
end
local t={14,c,s}; tprm[#tprm+1]=t;--if 2>#tprm then nkevent.Set(event);
end
Это основная функция, которая создает события event при изменении параметров любого из инструментов. Эти события обрабатываются в функции main, которая выполняется в отдельном потоке. -------------------------- В данной реализации OnParam добавлено условие (оператор if) фильтрации инструментов по листингу. -------------------- Можно добавить и другие фильтры. Например, можно задать список торгуемых инструментов из числа всех подписанных. В этом случае робот будет торговать и отслеживать лишь списочные инструменты. ----------------- В роботе реализованы три механизма событий, которые вызывают функцию main. событие №1 OnParam. По этому событию выполняется регистрация параметров инструмента и подписка на свечи или тики для данного инструмента. Кроме того, по этому сигналу обрабатываются стоп-заявки и заявки. ----------------------------------- событие №2 таймер интервала свечей. Например, если головной блок использует свечи с интервалом 1 минута, то таймер выдает сигнал каждую минуту и по этому сигналу запускается для каждого торгуемого инструмента отдельный поток из пула потоков, в котором работает головной блок. ---------------------------------- событие №3 . Так называемый Watchdog -"сторожевой пес". Таймер, который выдает сигнал, если нет события №1 например в течении 30 секунд. Это событие означает, что что-то не так и надо предпринимать соответствующие меры. ================== Продолжение следует...
Ошибка:Не хватило памяти под объекты...
Пользователь
Сообщений: Регистрация: 30.01.2015
27.12.2023 17:45:43
Добрый день, Вопрос к разработчикам версия 11.0.1.3 После экспериментов с открытием множества потоков На демо сервере при очередном запуске QUIK получаем это: и после этого QUIK выгружается. Есть ли способ исправить и запустить QUIK без установки заново?
Сравнение языков программирования
Пользователь
Сообщений: Регистрация: 30.01.2015
14.12.2023 06:59:03
Вдруг откуда ни возьмись, появилась ...Проблема с индикатором
Пользователь
Сообщений: Регистрация: 30.01.2015
01.12.2023 08:36:12
Добрый день Вопрос разработчикам. --------------- Версия 8.7 Рабочая ----------------- При очередном запуске QUIK на графике исчезли все данные индикатора( отображалось 38 параметров), который установлен в квике почти год назад и работал до сегодня. -------------------- При открытии редактирования, индикатор в окне редактирования есть . ------------------------------ В таблице "Добавить индикатор" - индикатора нет. ------------------------------- При запуске QUIK никаких сообщений об ошибке в индикаторе нет. -------------------- Каким образом обнаружить причину отсутствия индикатора на графике и в таблице "Добавить индикатор"
Программирование скриптов
Пользователь
Сообщений: Регистрация: 30.01.2015
29.11.2023 14:40:20
Добрый день, Реализовал для себя, предлагаю реализовать в QUIK для все пользователей. ----------------- 1) Запуск произвольного количества скриптов, каждый в отдельном потоке. -------------------------- 2) Реализацию скриптов вне зависимости от версии Lua, а также на языках LuaJit,Terra, Julia. ----------------------- 3) Очереди к потокам ------------------------- 4) Передача данных между скриптами.
ПростоПример
Пользователь
Сообщений: Регистрация: 30.01.2015
18.10.2023 16:32:38
Робот в октябре. ---------------------- Последний график - это прибыль и убытки. белая линия - итого. зеленая -лонг синяя -шорт штриховая - текущая, не зафиксированная --------------- На первом графике профит нарастающий за месяц на втором профит за каждый день
Для писателей роботов
Пользователь
Сообщений: Регистрация: 30.01.2015
11.09.2023 08:24:46
Рекомендую ознакомиться :
примеры колбеков
Пользователь
Сообщений: Регистрация: 30.01.2015
11.07.2023 09:42:39
Написал изучающим Lua примеры вариантов колбеков сделок, заявок и стоп-заявок. ---------------------- Примеры написаны специально для форума и не тестировались, а лишь проверены на синтаксис. --------------------------- Поэтому, если есть желающие тестить и найдете ошибки, то пишите, исправим вместе. -------------- В этих колбеках сделки, активные заявки и активные стоп заявки размещаются в соответствующие инструментам рабочие таблицы. --------------------------------
Код
--таблицы
TRADE={}; -- индексы сделок по инструментам
ORDER={}; -- индексы активных заявок по инструментам
STOP={}; -- индексы активных стоп-заявок по инструментам
function OnTrade(tr)
local n,m;local sec=tr.sec_code;
local t=TRADE[sec]; --таблица номеров строк сделок в таблице QUIK инструмента sec
if t then
m=TRADE[0]; n=t[0];
else --создание таблицы инструмента
m=getNumberOf("trades"); n=0;
t=SearchItems("trades",n,m-1, function(p1) if p1==sec then return true;end return false; end,"sec_code")
TRADE[sec]=t;
end
if m>t[n] then n=n+1; t[n]=m; t[0]=n; TRADE[0]=m+1; end
end
local function fOrder(tr,T,s) --функция обработки для колбеков orders и stop_orders
local n,m,x;local sec=tr.sec_code; local t=T[sec]; --таблица номеров строк в таблице QUIK активных ордеров или стоп_ордеров инструмента sec
local flag=tr.flags&1; local num=tr.order_num;
if t then
m=T[0]; n=t[0];
for i=1,n do x=getItem(s,i-1);
if x.num_order==num then
if flag==0 then n=n-1;if n>0 then t[i]=t[n]; end break; else return; end
end
end
else --создание таблицы инструмента
m=getNumberOf(s); n=0;
t=SearchItems(s,n,m-1, function(p1,p2) if p1==sec and p2&1==1 then return true;end return false; end,"sec_code,flags")
T[sec]=t;
end
if flags==1 then n=n+1; t[0]=n; t[n]=m; T[0]=m+1; end
end
function OnOrder(t) fOrder(t,ORDER,"orders"); end
function OnStopOrder(t) fOrder(t,ORDER,"stop_orders"); end
Равнение на "Яндекс"!!!
Пользователь
Сообщений: Регистрация: 30.01.2015
22.06.2023 11:55:46
«Яндекс» увеличил фонд своей программы багбаунти «» в 2023 году в 2 раза до 100 млн рублей. В 2022 году компания выплатила белым хакерам 39,7 млн рублей за нахождение уязвимостей и багов в своих сервисах и службах.
Синхронизация QUIK с NTP
Пользователь
Сообщений: Регистрация: 30.01.2015
02.05.2023 06:57:48
Добрый день, Для контроля реального времени прихода сделок с биржи синхронизирую компьютер с сервером точного времени. Не удается получить погрешность менее 20 ms.
Майкрософт декларирует возможность 1 ms. ---------------- Если кому-то это удалось, подскажите как Вы это достигли.
Тест. Данные в другое приложение.
Пользователь
Сообщений: Регистрация: 30.01.2015
30.04.2023 13:15:55
Добрый день, Неоднократно на форуме интересовались передачей данных из QUIK в другое приложение(процесс). Есть много способов. Наиболее универсальным является file mapping Этот метод позволяет обмениваться данными практически любого объема. Использую этот метод не только для QUIK ------------------ В названии метода есть слово файл. Уверен, что многие скривятся и скажут, что метод медленно работает. А вот и нет. . --------------------------------- Что нам рассказывает об этом методе Майкрософт: -------------------------- Это объединение содержимого файла с частью виртуального адресного пространства процесса. Система создает объект сопоставления файлов (также известный как объект раздела) для поддержания этой связи. Просмотр файла - это часть виртуального адресного пространства, которую процесс использует для доступа к содержимому файла. Сопоставление файлов позволяет процессу использовать как случайный ввод-вывод (I / O), так и последовательный ввод-вывод. Это также позволяет процессу эффективно работать с большим файлом данных, таким как база данных, без необходимости отображать весь файл в памяти. Несколько процессов также могут использовать файлы, сопоставленные с памятью, для обмена данными.
Процессы считывают данные и записывают в файловое представление, используя указатели, точно так же, как они делали бы с динамически выделяемой памятью.
Использование данного метода повышает эффективность, поскольку файл находится на диске, а представление файла - в памяти.
===========================
Тест для измерения задержки передачи данных из скрипта QUIK в приложение.
скрипт Теста в SciTe:
Код
paths = "D:/nkarray/"
package.cpath =paths.."?.dll;"
require"nkthread"
----------------------
local T=0; while true do local T1,dt,hms,s,num,HMS,ss=nkmx.gsm(0,T); if T1 then T=T1; print(0.1*dt,hms,s,num,HMS,ss); end end
фрагмент скрипта в QUIK:
Код
function OnAllTrade(t)
local c,s=t.class_code,t.sec_code; local z=ds[c..s]; local num=t.trade_num;
if z then local d=z[1]; local n=z[2]; local f=z[3];
local Ti=t.datetime; local HMS=(60*(60*Ti.hour+Ti.min)+Ti.sec)+0.001*Ti.ms;
local D=os.date("*t"); local hms=60*(60*(D.hour-shH)+D.min)+D.sec-shS;
local dt= hms-HMS+n;
local size=d:Size();
local T1=d:T(size); local HMS1=(60*(60*T1.hour+T1.min)+T1.sec)+0.001*T1.ms;
if HMS==HMS1 and z[4]~=num then
local dt1=0.01*math.floor(100*dt); if 0>dt then dt=0 end count=count+1; count1=count1+1;
local m=math.floor(dt)+1;
local ss=tostring(hms)..","..tostring(s)..",num="..tostring(num)..",size="..tostring(size)..",HMS="..tostring(HMS)..",dt="..tostring(dt1)..",n="..tostring(n)..",m="..tostring(m)..",clock="..(os.clock()-clockOS);
nkmx.ssm(0,hms,s,num,HMS,ss); -- Log:write(ss.."\n"); Log:flush();
if sts[m] then sts[m]=sts[m]+1; else sts[m]=1 end
end
z[4]=num;
end
end
первое число в стоке - задержка передачи параметров из QUIK в приложение в мкс. -------------------- Резюме: задержка передачи методом file mapping параметров из QUIK в другое приложение составляет 0.0000001 сек.
Пример
Пользователь
Сообщений: Регистрация: 30.01.2015
26.04.2023 11:20:44
Добрый день, по просьбе трудящихся выкладываю пример на QPILE
Код
PORTFOLIO_EX TEST;
DESCRIPTION TEST;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST FIRM_ID;
USE_CASE_SENSITIVE_CONSTANTS;
PROGRAM
NEW_GLOBAL("count",0)
NEW_GLOBAL("CLAS","CETS")
NEW_GLOBAL("List","USD000000TOD,EURUSD000TOD,EUR_RUB__TOD")
NEW_GLOBAL("com",0.000445)
i=1
dif=0
e=1-3*com
f=create_map()
z=create_map()
FOR SEC IN List
s=get_param_ex(CLAS,SEC,"SHORTNAME")
n=get_value(s,"PARAM_IMAGE")
s=get_param_ex(CLAS,SEC,"LAST")
p=get_value(s,"PARAM_IMAGE")+0
s=get_param_ex(CLAS,SEC,"OFFER")
po=get_value(s,"PARAM_IMAGE")+0
s=get_param_ex(CLAS,SEC,"BID")
pb=get_value(s,"PARAM_IMAGE")+0
s=get_param_ex(CLAS,SEC,"LOTSIZE")
q=get_value(s,"PARAM_IMAGE")+0
z=set_value(z,"Name",n)
z=set_value(z,"last",p)
z=set_value(z,"bid",pb)
z=set_value(z,"offer",po)
z=set_value(z,"lotsize",q)
IF count=0
add_item(i,z)
ELSE
MODIFY_ITEM(i,z)
END IF
IF i==3
IF pb>0
dif=e/pb-1
f=set_value(f,"lotsize",dif)
END IF
ELSE
e=e*po
END IF
i=i+1
END FOR
IF count=0
add_item(4,f)
ELSE
MODIFY_ITEM(4,f)
END IF
count=1
END_PROGRAM
PARAMETER Name;
PARAMETER_TITLE Name;
PARAMETER_DESCRIPTION here is Name;
PARAMETER_TYPE STRING(15);
END
PARAMETER last;
PARAMETER_TITLE last;
PARAMETER_DESCRIPTION good;
PARAMETER_TYPE STRING(10);
END
PARAMETER bid;
PARAMETER_TITLE bid;
PARAMETER_DESCRIPTION good;
PARAMETER_TYPE STRING(10);
END
PARAMETER offer;
PARAMETER_TITLE offer;
PARAMETER_DESCRIPTION good;
PARAMETER_TYPE STRING(10);
END
PARAMETER LOTSIZE;
PARAMETER_TITLE lotsize;
PARAMETER_DESCRIPTION good;
PARAMETER_TYPE STRING(10);
END
END_PORTFOLIO_EX
Кто сможет объяснить необъяснимое?
Пользователь
Сообщений: Регистрация: 30.01.2015
19.04.2023 16:14:33
Ув, разработчики Просьба объяснить следующий феномен работы системы QUIK ----------------------- На реальном рынке вычисляю функцию распределения запаздывания времени прихода обезличенных сделок в терминал QUIK на моем компе с сервера брокера сбербанк. ---------------------- Алгоритм расчета следующий Вычисляем разницу текущего времени компа и времени обезличенной сделки и в добавляем 1 в ячейку массива с индексом равным разности. В результата по 24 000 обезличенных сделок получаем следующий график распределения запаздывания
Что получилось: 80% пришло с задержкой не более 1 секунды это при пинге до сервера 0.03 сек. 12% с задержкой от 1 до 2 секунд 8% с задержкой более 2 секунд 1% с задержкой 17 секунд 0.5% с задержкой 30 секунд --------------------- Что не так c сервером QUIK у брокера Сбербанк.
Запаздывание свечей. Что не так.?
Пользователь
Сообщений: Регистрация: 30.01.2015
14.04.2023 11:53:45
Добрый день, Сделал тест получения свечей с интервалом 1 5 и 30 мин для всех инструментов, которые определены у меня в ТТП В лог файл выводим время открытия новой свечи и время свечей ------------------ Тест исполняем на реальных торгах Брокер Сбербанк. ================= вот результаты в лог файле время местное на 1 час сдвинуто относительно биржевого
Обращаю внимание на следующее: ---------------------- Для инструмента в 1 ой строке минутная свеча сформирована 01 секунду ---------------------------------- Fri Apr 14 12:36:01 2023,sec=MAGN ,T30=123000.0,T5=123500.0,T1=123600.0 ------------------------- а для инструмента в последней строке через 55 секунд после первой. Fri Apr 14 12:36:55 2023,sec=SNGS ,T30=123000.0,T5=123500.0,T1=123600.0 ----------------------------- Чем дальше в таблице инструмент от первой строки тем больше запаздывание. -------------------------------- Что не так?
Вам такое не снилось!!!, LUA5.3 LUAJIT MQL5
Пользователь
Сообщений: Регистрация: 30.01.2015
27.03.2023 12:36:48
Сравни LUA5.3 и LUAJIT в QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
27.03.2023 11:30:47
Добрый день, Ранее сообщал, что сделал возможность запуска скриптов QUIL в отдельных потоках в LUAJIT. ---------------- кратко это работает так. В колбек OnParam приходят сделки инструментов, которые передаются в функцию main() ----------------------- В main - это LUA 5.3 по каждому инструменту запускается скрипт алгоритма робота в отдельном потоке из пула потоков под LUAJIT. ====================== На просторах интернета нашел тесты по которым разработчики сравнивали MT5 сравнивали MQL5 и LUA в QUIK. --------------------- вот сами тесты:
Код
-- TestQuickSort
local array={}
local function QuickSort(arr,left,right)
local i=left
local j=right
local center=arr[math.floor((i+j)/2)]
while i<=j do
while(arr[i]<center and i<right) do i=i+1 end
while(arr[j]>center and j>left) do j=j-1 end
if i<=j then local x=arr[i] arr[i]=arr[j] arr[j]=x i=i+1 j=j-1 end
end
if left<j then QuickSort(arr,left,j) end
if right>i then QuickSort(arr,i,right) end
end
local function Start1()
for i=0,MAX_SIZE-1 do array[i]=i%100 end
start=os.clock()
QuickSort(array,0,MAX_SIZE-1)
res=(os.clock()-start)*1000
print("TestQuickSort SIZE="..MAX_SIZE..", time=" .. res .. " ms")
for i=1,MAX_SIZE-1 do
if array[i]<array[i-1] then print("Array not sorted"); break;
end
end
end
local str=""
local a={}
local function PiCalculate(digits)
local d = 0
local c = (math.floor(digits/4)+1)*14
local f = 10000
for i=0,c do a[i]=20000000 end
c=c-14
b=c
while b>0 do
e=d%f
d=e
while b-1>0 do
b=b-1
d = d * b + a[b]
g = (b * 2) - 1
a[b]=(d%g)*f
d=math.floor(d/g)
end
r=e+math.floor(d/f)
if r<1000 then
if(r>99) then
str=str .. "0"
else
if(r > 9) then
str=str .. "00"
else
str=str .. "000"
end
end
end
str=str .. string.format("%d",r)
c=c-14
b=c
end
end
function Start2()
start=os.clock()
PiCalculate(MAX_SIZE)
res=(os.clock()-start)*1000
print("TestPiCalculated SIZE="..MAX_SIZE..", time=" .. res .." ms Pi="..string.sub(str,1,16))
end
-- TestFibo
local fib={}
local function TestFibo(n)
if n<2 then return 1 else return TestFibo(n-2)+TestFibo(n-1) end
end
local function Start3()
start=os.clock()
for i=0,MAX_SIZE-1 do fib[i]=TestFibo(i) end
res=(os.clock()-start)*1000
print("TestFibo SIZE="..MAX_SIZE..", time="..res.." ms Fibo[39]="..fib[39])
end
-- TestArrays
local function Start4()
local x={} local y={}
local start=os.clock()
for i=1,MAX_SIZE,1 do x[i]=i y[i]=0 end
y[MAX_SIZE]=0
for k=1,MAX_SIZE,1 do
for i=MAX_SIZE, 1,-1 do y[i]=y[i]+x[i] end
end
local res=(os.clock()-start)*1000
local check=0
for k=1,MAX_SIZE,1 do check=check+y[k] end
print("Test Arrays SIZE="..MAX_SIZE..", Time = "..res.." ms check=".. check)
end
local function Ackermann(m,n)
if(m==0) then return(n+1) end
if(n==0) then return(Ackermann(m-1,1)) end
return(Ackermann(m-1,Ackermann(m,(n-1))))
end
-- TestAckermann
local function Start5()
local check=0
local start=os.clock()
for i=1,MAX_SIZE do check=check+Ackermann(1+i%3,1+i%5); end
local finish=os.clock()
local res=(finish-start)*1000
print("TestAckermann SIZE="..MAX_SIZE..",time=".. string.format("%.0f",res).." ms check="..check)
end
-- TestFloat
local f0=0.0
local f1=123.456789
local f2=98765.12345678998765432
local f3=12345678943.98
function TestFloat(MAX_SIZE)
MAX_SIZE=MAX_SIZE-1
for i=0, MAX_SIZE do
for j=0, MAX_SIZE do
f0=f0+(f1/(i+1))-f2+(f3*i);
end
end
end
function Start6()
local t=os.clock()
TestFloat(MAX_SIZE)
local res=(os.clock()-t)*1000
local check=f0
print("TestFloat SIZE="..MAX_SIZE..", time=" ..res.." ms check="..tostring(check));
end
MAX_SIZE=35000; Start6()
MAX_SIZE=120000; Start5()
MAX_SIZE=32000; Start4()
MAX_SIZE=40; Start3()
MAX_SIZE=22000; Start2()
MAX_SIZE=16000000; Start1()
=================== На этих тестах я провел тест LUA 5.3 и LUAJIT. ================== Результаты говорят сами за себя: Когда подключу MT5 к QUIK, то сделаю тест и для него. ----------------------- Следите за новостями.
Вызов функций С из DLL в скрипте Lua QUIK, информация к размышлению
Пользователь
Сообщений: Регистрация: 30.01.2015
22.03.2023 18:55:51
Добрый день, Всем известно, что есть библиотека ffi
Библиотека FFI позволяет вызывать внешние функции C и использовать структуры данных C из чистого кода Lua. Библиотека FFI в значительной степени устраняет необходимость написания утомительных ручных привязок Lua / C на C. Нет необходимости изучать отдельный язык привязки — он анализирует простые объявления C! Они могут быть вырезаны и вставлены из заголовочных файлов C или справочных руководств. Это задача связывания больших библиотек без необходимости иметь дело с хрупкими генераторами привязки. --------------------- Все казалось прекрасно, но... Библиотека FFI тесно интегрирована в LuaJIT (она недоступна как отдельный модуль). конечно, не так уж страшно, но... LuaJIT сделан на ядре Lua5.1 и следовательно для квика не подходит. ------------------------ Написал собственную библиотеку для любого ядра Lua, которая делает тоже самое, что и FFI, но быстрее. В итоге можно загрузить на исполнение любую функцию написанную на С/С++ из любой библиотеки DLL. И следовательно получить максимальную скорость вычисления любых алгоритмов, не программируя на СИ и не изучая API C for Lua. ---------------------------- Накладные расходы на преобразование параметров в пределах кванта высокоточного таймера (см далее). --------------------------- Вот пример вызова трех функций из WIN32 ------------------------------ QueryPerformanceCounter - высокоточный таймер квант 0.1 мкс. SleepEx - функция паузы MessageBoxA - вывод окна сообщения пример вызова в луа: В программе два варианта измерение интервала Sleep в 1 секунду и вывод результата в окно
Код
-------------sleep и высокоточный таймер вариант 1 -------------------
local x1=rfs("i","QueryPerformanceCounter","Kernel32.dll");
rfs(0,"SleepEx","Kernel32.dll",1000,0);
local x2=rfs("i","QueryPerformanceCounter","Kernel32.dll");
-------------sleep и высокоточный таймер вариант 2 -------------------
local pL,pF=nkcf.gf2L("Kernel32.dll","QueryPerformanceCounter")
local x3=rfs("i",pF);
rfs(0,"SleepEx","Kernel32.dll",1000,0);
local x4=rfs("i",pF);
s="t1="..0.1*(x2-x1).." мкс".." t2="..0.1*(x4-x3).." мкс";
print(" "..s);
rfs(0,"MessageBoxA","User32.dll",0, s, "sleep, timer",1);
а вот картинка результата
MT5+QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
17.03.2023 19:38:17
Добрый день, Реализовал механизм запуска в скрипте на луа как отдельный поток или процесс приложений на любом языке. Теперь хочу подключить торговые платформы. ------------------ Из бесплатных есть лишь MT5. Давно работал с MT4, с MT5 лишь знакомился. ===================== На вскидку подключить сравнительно просто, как и приложения на питоне, но пока не знаю что это даст. ============================ Если у кого есть опыт работы с MT5 на фондовом рынке или работы на TM5+QUIK, то поделитесь опытом и проблемами, а также хотелками. Спасибо.
Что не так?
Пользователь
Сообщений: Регистрация: 30.01.2015
13.03.2023 20:00:57
Выставляю и снимаю заявки на демо сервере. КВИК 9.7 Луа 5.3.5 Иногда систематически прилетает ответ в onOrders с trans_id=0 , а в таблице orders не ноль ------------------- вот пример это в колбеке: ["trans_id"]=0, ["ordernum"]=21555625,
Дело бы вечером, делать было нечего. --------------- Предположим, что у Вас есть большая таблица в терминале QUIK. ------------------------ Например, у меня получилась такая таблица "orders" В ней 227 тысяч строк. ------------------------- И Вы хотите пробежать по строкам и найти строку с нужными вам параметрами для этого Вы пишите такой цикл: -----------------------
Код
local N= getNumberOf("orders");
local j=1; while N>=j do
local z=getItem("orders",jz-1)
jz=jz+1;
end
для контроля добавим два оператора первый для замера расхода памяти и второй для вывода результата в лог файл получится так
Код
local N= getNumberOf("orders");
local j=1; while N>=j do
local mem=math.floor(collectgarbage ("count"))
local z=getItem("orders",jz-1)
Log:write(tostring(jz)..","..tostring(mem).."\n");
jz=jz+1;
end
А теперь вопрос знатокам, в ответ не подглядывать. Сколько памяти займет данный цикл пробега по строкам таблицы заявок, в которой 227 строк. ----------------------------- Уверен, что Вы даже не представляете себе это . ================== Ответ на поставленный вопрос в лог файле посмотрели 1-ю строку, заняли память 121 КБ
Код
1,121
посмотрели 100-ю строку, заняли память 654 КБ
Код
100,654
посмотрели 1000-ю строку, заняли память 5395 КБ т е округленно 5 МБ
Код
1000,5395
ну и когда посмотрели последнюю 227851 строку, заняли память 1205 952 КБ т е округленно 1.2 ГБ
Код
227851,1205952
Вот так Lua в QUIK кушает память. И в этом случае мы просто нашли нужную нам заявку в таблице заявок. ------------------------------------------------------- Угадайте, как с этим бороться?
Проблема с функцией getBuySellInfo
Пользователь
Сообщений: Регистрация: 30.01.2015
22.02.2023 12:43:19
Пишем вот такой фрагмент:
Код
qtyB,comission=CalcBuySell(clas,sec,client,acc,price,true,false); --расчитать доступное количество к покупке
qtyS,comission=CalcBuySell(clas,sec,client,acc,price,false,false); --расчитать доступное количество к продаже
local tp=getBuySellInfo (firm,client,clas,sec,price);
Qcur=tp.balance --STRING Текущая позиция по инструменту, в лотах
NQb=tp.can_buy --STRING Оценка количества лотов, доступных на покупку по указанной цене *
NQs=tp.can_sell-- STRING Оценка количества лотов, доступных на продажу по указанной цене *
Dp=tp.share --STRING Процентное отношение стоимости позиции по данному инструменту к стоимости всех активов клиента, рассчитанное по текущим ценам
QmaxBuy=tp.can_buy_own --STRING Максимально возможное количество инструментов в заявке на покупку этого инструмента на этом классе на собственные средства клиента, исходя из цены лучшего предложения
QmaxSel=tp.can_sell_own --STRING Максимально возможное количество инструментов в заявке на продажу этого инструмента на этом классе из собственных активов клиента, исходя из цены лучшего спроса
и результаты работы функции CalcBuySell (для сравнения)
Код
price=1161.5,qtyB=12,qtyS=10
и функции getBuySellInfo (проверяем)
Код
tp={}
Qbuy=nil,Qsel=nilNQb=nil,NQs=nil
CalcBuySell выдает какие-то значения, getBuySellInfo выдает пустую таблицу tp ================ Что не так c getBuySellInfo?
КРАШ -ТЕСТ терминала
Пользователь
Сообщений: Регистрация: 30.01.2015
20.02.2023 15:33:37
Добрый день, ---------------------- Написал скрипт краш-теста. В целом результатами доволен. Рассказываю подробности. ----------------------------, Условия теста: демо-сервер версия терминала 9.7 ( тормозная) -------------------- Робот на каждую принятую сделку по колбеку OnParam рассчитывает цену на 20 шагов ниже цены последней сделки определяет максимальное число контрактов для текущего инструмента функцией CalcBuySell и выставляет заявку на покупку одного контракта по расчетной цене. При очередном вызове колбека , робот снимает все выставленные ранее заявки , проверяет отсутствие неисполненной транзакции и открытой заявки по текущему инструменту и при положительном решении, выставляет новую заявку. -------------------- Результаты теста(фрагмент):
Время работы теста составило примерно 12000 секунд( примерно 1.5 часа) За это время колбеки вызывались 2 млн 670 тысяч раз, выставлено и снято заявок 278 тысяч инструментов 908 (акции валюта фьючерсы) среднее время на одну заявку составляет примерно 2.5 ms, максимальное 8 ms, минимальное 0.25 ms. из 2.5 ms одного цикла выставления заявки, 2.2 ms уходит на функцию CalcBuySell. уж не знаю, что туда напичкали, если на все остальное у робота уходит в 10 раз меньше,чем на эту функцию. На обработку колбеков заявок и транзакций уходит 0.05 до 0.1 ms. ------------------------------------------- Размер скрипта 600 строк LUA+ DLL для обработки событий и расчета времени с квантом 0.1 мкс.
Внимание! Тормоза в версиях 9 и 10.
Пользователь
Сообщений: Регистрация: 30.01.2015
16.02.2023 10:34:45
Добрый день, Посвятил целую неделю, чтобы выполнить работу разработчиков и найти критическую ошибку версий 9 10, по которой терминал может минутами не отвечать. -------------------------- Если У Вас нет желание это наблюдать, то рекомендую не ставить эти версии, а также другие выше 8 , пока разработчики официально не укажут на исправление этой ошибки. -------------------------- В настоящее время последней нормальной версией является 8.7.1.3, которую и рекомендую.
не работают "горячие клавиши"
Пользователь
Сообщений: Регистрация: 30.01.2015
15.02.2023 14:00:11
В таблице позиций по фьючерсам не работает "Закрыть все" и соответствующая горячая клавиша. Если так задумано, то сделать их невидимыми
нет в документации
Пользователь
Сообщений: Регистрация: 30.01.2015
15.02.2023 13:49:29
Добрый день, Просьба пояснить при каких условиях выдаются следующие сообщения: В документации не нашел, если есть, дайте ссылку. 1. Превышена позиция по инструменту 2. Превышен лимит отправки транзакций для данного логина.
ДемоСчет. Что не так?
Пользователь
Сообщений: Регистрация: 30.01.2015
10.02.2023 22:07:26
Добрый день, второй день на демо счете все чудеснее и чудеснее. В настоящее время при загрузке демо квика версии 10.01 терминал QUIK-JUNIOR подключается к демо счету после этого не отвечает по несколько минут на каждое нажатие мышки на экране. А в диспетчере задач видим следующее. 2-я строка это демо сервер версия 10 загрузка процессора около 30% 1-я строка рабочий терминал версия 8.7 загрузка процессора около 3%
для сравнения загрузил версию 9.7 и наблюдаем чудеса:
----------- На рабоем терминале работают индикаторы и скрипты На демо терминалах ничего своего не ставил. Просто скачал развернул и подключил. И ловлю кайф. Такого прикола еще не видел.
Демо счет 2, Ау, разработчики.
Пользователь
Сообщений: Регистрация: 30.01.2015
09.02.2023 12:21:16
Полагаю, что отсутствие класса фьючерсов на демо связано с тем, что Вы забыли установить входящий остаток по средствам на демо счете фьючерсов. --------------------- Потому и класс нет. ====================== Может в консерватории надо что-то исправить.
проблема с функцией getDepo
Пользователь
Сообщений: Регистрация: 30.01.2015
08.02.2023 13:59:55
Добрый день, тестирую функции на демо сервере. Сделал лишь старт квика. т е ничего не покупал и не продавал. ----------------- поясняю: колбек OnParam принимает сделки:function OnParam(c,s)
Код
for i=1,#tparam do local t=tparam[i]; if t=="table" then if t[1]==14 and t[3]==s then return end end end
local t={14,c,s}; if #tparam==0 then tparam[1]=t; ESet(event); else table.sinsert(tparam,t); end
end
и загружает clas и sec в таблицу tparam
фунция main в цикле принимает значения из tparam и вызывает функцию getDemo
Код
Log:write("clas="..clas..",sec="..sec..",firm="..firm..",account="..account..",client="..client.."\n");Log:flush();
local t1=getDepo(client,firm,sec,account);
Log:write("type="..type(t1).."\n");Log:flush();
1 строка выводит в лог файл все параметры функции getDemo, которая вызывается во 2-ой строке 3 строка - выводим в лог файл тип возвращенного значения t1 ------------------ В результате получаем следующий кирдык: --------------------- Таблица позиций по инструментам имеет вид: т е в таблице есть лишь SBER c нулевыми значениями ================ А теперь смотрим лог файл
до последней строки инструменты в таблице позиций отсутствуют в последней строке SBER и QUIK висит. -------------------- Что не так?
Проблема Сервера QUIK?, Вопрос риторический
Пользователь
Сообщений: Регистрация: 30.01.2015
29.12.2022 14:23:43
Сегодня в Сбербанке повторилось. Дата торгов была вчера. И естественно вчерашний день пропал. -------------- Проблема решилась лишь после разрыва связи , длительного ожидания и установки связи заново. ---------------- Так как такую и подобные проблемы наблюдал неоднократно, то хочу высказать свое предположение о ее источнике. =================== проблема возникает, если установить соединение до начала торгов, либо в момент начала. Предположу, что при этом происходит не полная загрузка с сервера начальных данных, но после начала торгов сервер не проверяет некорректность данных у клиентов а продолжает работу с неполными либо с неверными данными. ============ Полагаю, это недоработка разработчиков QUIK. Но это лишь мои предположения. =============== Проблема решается иногда лишь перезагрузкой но после начала торгов и длительного ожидания.
лыко да мочало начинай сначала
Пользователь
Сообщений: Регистрация: 30.01.2015
19.12.2022 10:04:18
В сбербанк брокер теперь новая х...я ---------------
новая хрень у Сбербанка
Пользователь
Сообщений: Регистрация: 30.01.2015
16.12.2022 10:48:01
вопрос к разработчикам QLUA
Пользователь
Сообщений: Регистрация: 30.01.2015
14.12.2022 10:55:55
Добрый день, решил написать робота, который работает со всеми доступными в терминале кодами клиентов и вдруг откуда не возьмись появился ... затык. ----------------------- Вопрос: ---------------- Каким образом ,т е на основе каких таблиц или функций, можно установить соответствие кода клиента (таблица client_codes) торговому счету (таблица trade_accounts) ------------------- Спасибо
Что не так?
Пользователь
Сообщений: Регистрация: 30.01.2015
09.12.2022 06:49:15
Попытался установить новую версию для демо. при распаковке получил это:
и такая дребедень Целый день
Пользователь
Сообщений: Регистрация: 30.01.2015
06.12.2022 17:58:09
брокер Сбербанк. Стыдоба - это ведущий банк РФ. Внедряют ИИ.
и такая дребедень Целый день.
QUIK съедает более 2 ГБ памяти вне зависимости от брокера.
Пользователь
Сообщений: Регистрация: 30.01.2015
03.10.2022 19:20:38
Добрый день, Периодически на форуме появляются душераздирающие вопли о том, что мол у брокера .... QUIK съедает .. ГБ. Попытка объяснить , что и как надо сделать наталкивается либо на вопли "мы все это знаем", либо на рассуждения о том, что это не у любого брокера, а лишь у избранного. ---------------------- Полагаю, что проблема не в зеркале, то есть не в брокере, а как обычно, в отсутствии знаний у пользователя. ----------------- Доказательство: ------------------- брокер СБЕРБАНК. Чтобы доказать, что брокер не виноват, специально настроил QUIK так, чтобы получить наибольшую загрузку памяти для этого брокера. --------------------------- Желающие могут получить и большую загрузку. Я к этому не стремился, но знаю как это сделать. ----------------- итак вот картинка результата сегодня:
а это результат обычной настройки ----------------------------------------------- Успехов в борьбе за знания, т.е. за память.
старт скрипта по расписанию
Пользователь
Сообщений: Регистрация: 30.01.2015
27.09.2022 12:56:07
Добрый день, Пример запуска скрипта по расписанию. Если есть вопросы - пишите
Код
local isRun=0; --флаг завершения функции main
local fstop=true; -- флаг остановки скрипта при запуске по расписанию
local Ts={"12:53:00","12:54:00","12:55:00","12:56:00","12:57:00","12:58:00","12:59:00",}
for i=1,#Ts do local x=Ts[i] Ts[i]=60*(60*string.sub(x,1,2)+string.sub(x,4,5))+string.sub(x,7,8); end
------------
function main()
local jT,x=0,0;
while isRun do
if #Ts>jT then local dt=-1;
if fstop then fstop=false; -- в колбеках первой строкой поставить if fstop then return end
x= getInfoParam("SERVERTIME"); -- local x=os.date("%X");
local z=60*(60*string.sub(x,1,2)+string.sub(x,4,5))+string.sub(x,7,8);
while #Ts>jT and 0>dt do jT=jT+1; dt=Ts[jT]-z; end
end
if dt>=0 then message(x.." до старта "..dt.."сек"); sleep(1000*dt); else sleep(1); end
end
if fstop==false then x= getInfoParam("SERVERTIME"); message("старт "..x.." fstop="..tostring(fstop) ); end
-- исполнение скрпита
fstop=true; --- остановить скрипт
if fstop then x= getInfoParam("SERVERTIME"); message("стоп "..x.." fstop="..tostring(fstop) ); end
end
end
Предлагаю углубить, Расширение функций библиотеки QLUA
Пользователь
Сообщений: Регистрация: 30.01.2015
19.09.2022 08:00:41
Добрый день, Предлагаю добавить в библиотеку QLUA функцию установки идентификатора для графика цена и индикатора . --------------------- Объясняю зачем: -------------------- 1) Для установки идентификатора не надо будет лазить в меню окна. Причем очень достает устанавливать этот идентификатор для индикатора при отладке индикатора. ---------------------------- 2) идентификатор графика цены нужен для вывода меток на график. Если это график с якорем, то отображаемый инструмент будет изменяться при изменении активной строки в таблице, а идентификатор при этом не меняется. С помощью предлагаемой функции можно в скрипте динамически изменять идентификатор, например, указывая в нем имя инструмента. В итоге можно метки на графике разделить по инструментам. ------------------------------ 3) идентификатор индикатора нужен для чтения параметров индикатора в скрипте луа. Сейчас для этого надо лазить в меню окна и прописывать идентификатор в Settings. В итоге идентификатор для индикатора можно будет динамически привязывать к инструменту, интервалу и алгоритму индикатора.
Lua советник
Пользователь
Сообщений: Регистрация: 30.01.2015
18.09.2022 10:43:57
Добрый день, --------------------------- Пример простого, универсального советника на луа на основе любых индикаторов. ------------------------------ Советник - это программа, которая формирует сигналы "купить/продать" и показывает их, но не совершает сделки. --------------------- Пример на основе стратегии пересечения двух скользящих средних. Помещаем два индикатора на график цены инструмента Присваиваем им идентификаторы MOV1 и MOV2 как на рисунке:
далее пишем индикатор "nk_bot"
Код
Settings={ i1="MOV2",i2="MOV1", Name = 'nk_bot', }
------------------
local function gI(s,j,i)
local t=getCandlesByIndex(s,j,i-1,1); if t then return t[0].close; else return 0 end
end --значение индикатора
-------------------------
local function cross(s1,j1,s2,j2,i)
local m=i; local x= gI(s1,j1,m) local x1=gI(s2,j2,m);
while m>1 and x~=0 and x1~=0 and x>x1 do m=m-1; x=gI(s1,j1,m); x1=gI(s2,j2,m) end
if m>1 and i>m then return m end
end --пересечение
--------------------------
function OnCalculate(i)
local Bu,Se; local i1=i-1;
if i>1 then
local jU_,jD_=jU,jD;
jU=cross(Settings.i1,0,Settings.i2,0,i1); --MOV1 пересекает MOV2 снизу вверх
jD=cross(Settings.i2,0,Settings.i1,0,i1); --MOV1 пересекает MOV2 сверху вниз
if jU and jU_==nil then jBu=i; Bu=L(i)-0.1; end
if jD and jD_==nil then jSe=i; Se=H(i)+0.1; end
if i==Size() then -- последняя свеча
end
end
return Se,Bu;
end
-----
function Init()
local t={};
t[#t+1]={Name = "Se",Color = RGB(255,0,0),Type = 11,Width =3}; ---sell
t[#t+1]={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width =3}; ---buy
Settings.line=t;
return #t;
end
и помещаем его на график инструмента В результате получим на истории торгов сигналы "купить/ продать" на графике инструмента --------------------- На основе данного примера Вы можете построить советник для любых индикаторов, которые встроены в терминал КВИК или написаны кем-то.
Прикольно, но ошибка
Пользователь
Сообщений: Регистрация: 30.01.2015
08.09.2022 10:25:55
Недавно сообщал на форуме о том, что дата сервера в текущих торгах показывает вчерашнюю дату. сегодня выявил как это можно повторить. ------------------- проблему можно обнаружить, если загрузить квик и подключить его к серверу до начала торгов. В этом случае, после начала торгов дата сервера не обновляется и остается равной дате предыдущих торгов. если разорвать соединение и снова восстановить то дата сервера обновляется до текущей. -------------------- От версии КВИКА этот прикол не зависит.
Ответ на вопрос: "Что быстрее , рассчитать индикатор или взять с графика?"
Пользователь
Сообщений: Регистрация: 30.01.2015
30.08.2022 12:53:16
Добрый день, --------------- сделал следующий тест. На график вывел два варианта индикатора стохастик. ----------------------- 1) встроенный в терминал (третий график на картинке ) 2) взятый из предложенных разработчиками вариантов на луа. (четвертый график ) ----------------------- Во втором варианте добавил чтение индикатора с графика первого варианта и вывод этого значения для сравнения на график второго варианта. ------------- На втором варианте это линия белого цвета. ------------------ Вот такая картинка в итоге:
Время чтения индикатора с графика 6.8 мкс , а время расчета индикатора 23.4 мкс.
--------------
Прикольно,но факт.
Пользователь
Сообщений: Регистрация: 30.01.2015
22.08.2022 13:53:04
Сегодня в сбербанке на реальных торгах наблюдаем это: посмотрите дату торгов и дату сервера. Очевидно, все в отпуске и сервером управляет пьяный робот.
Индикатор для арбитража
Пользователь
Сообщений: Регистрация: 30.01.2015
20.08.2022 10:59:00
Добрый день, Специально для буратин и чайников выкладываю исходник индикатора арбитража. ----------------- На графике отображается белый - разность цен красный - максимум за торговый день синий -минимум за торговый день зеленый - средний за торговый день розовый - эксп.скользящая средняя ------------------ Инструкция для ощущения счастья: 1. Откройте график цены первого инструмента 2. Откройте в этом же окне график цены второго инструмента. 3. На вкладке Дополнительно второго графика запишите Идентификатор, который записан в исходнике индикатора в поле sec таблицы Settings 4. Откройте индикатор в новой области этого окна. ------------------
Код
--title="Arbitr <nikolz> "-- арбитраж
name='arb_nk'
Settings={
sec ="SB_arb", --идентификатор 2-го инструмента (графика)
LEMA = 30,
Name = name,
}
-------
function OnCalculate(i)
if i==1 then
AL=1/Settings.LEMA; y,Ma,Mi,Me,x=nil;
else
local C1=C(i)
if T(i-1).hour>T(i).hour then y,Ma,Mi,Me,x=nil end
local t=getCandlesByIndex(Settings.sec,0,i,1); t=t[#t];
if t then
local C2=t.close;
if C2 and C1 then
x1=C1-C2;
if Ma==nil or x1>Ma then Ma=x1 end
if Mi==nil or Mi>x1 then Mi=x1 end
if Ma and Mi then
Me=(Ma+Mi)/2; x=x1;
if y==nil then y=x; end y=(1-AL)*y+AL*x;
end
end
end
end
return Me,Ma,Mi,x,y
end
-----
function Init()
Settings.line={};
Settings.line[1] = {Name = "Me",Color = RGB(0,255,0), Type =1,Width = 2 };
Settings.line[2] = {Name = "Ma",Color = RGB(255,0,0), Type =1,Width = 2 };
Settings.line[3] = {Name = "Mi",Color = RGB(0,0,255), Type =1,Width = 2 };
Settings.line[4] = {Name = "x",Color = RGB(255,255,255), Type =1,Width = 1 };
Settings.line[5] = {Name = "eMA",Color = RGB(255,32,255), Type =1,Width = 2 };
return #Settings.line;
end
Хотелось бы узнать, где про ЭТО прчитать.
Пользователь
Сообщений: Регистрация: 30.01.2015
15.08.2022 19:16:52
Добрый день, Вопрос к знатокам. В документации QLua в разделе: "Функции для работы с таблицами Рабочего места QUIK" ------------------- написано: ----------------- В таблицах Рабочего места QUIK, созданных с помощью скриптов на языке Lua, поддержаны следующие возможности :
..
пользовательские фильтры,
...
=========================== прошу подсказать, где я могу прочитать про эти "секретные возможности" под названием " пользовательские фильтры" ------------------ Читать на расстоянии мысли разработчиков пока не научился, а в документации ничего не нашел.
Недокументированный "Троянский конь" на Lua
Пользователь
Сообщений: Регистрация: 30.01.2015
29.07.2022 14:41:45
Добрый день, всем, Хотя о том, про что буду рассказывать знаю с момента появления LUA VM в КВИКЕ и думал, что эту подлянку давно поборол, однако она снова дала о себе знать. --------------------- В частности примерно это же недавно обнаружил посетитель по нику Старатель. -------------------- Так как я давно казалось бы проблему решил, поэтому на его вопрос особо не обратил внимание. =============== но вот недавно столкнулся с проблемой удваивания заявок-близнецов. ================= Хотя ничего хорошего мне на форуме как обычно не посоветовали, но вредные советы тоже пригодились. =============== Например, представитель разработчиков гневно заявил, что мол надо все обнулять при index=1 в индикаторах. Благодарю его за его вредный совет. ------------------ Действительно, верно говорят -выслушай совет на Красной площади и сделай наоборот. ---------------------------- Поэтому я обратил внимание, что именно по index=1 я обнулил лог файл. ------------- продолжение следует..