VPM, Вы рыбак? Покупали лодку на Аральском море ? ----------------- Если нет, то Ваш пример из раздела - " Остапа понесло" --------------- Всегда прикольно, когда начинают рассказывать примеры из совершенно чужой области деятельности. =========== Типа: "А вот им это очень нужно" или "в будущем это особо пригодится тем, .... " и так далее...
Serge123 написал: А если диск виртуальный, то как по сравнению с маппинг филес?
У меня нет виртуального диска. Могу предположить что разницы в скорости нет так как обмен практически через память , но в маппинге параллельно получаем файл в энергонезависимой памяти (диске). и нет надобности тратить память на виртуальный диск. Ну и безусловно, если данных сотни гигабайт или терабайты, то никакой виртуальный диск не поможет. ------------------------------ Возможно обмен через Shared Memory будет быстрее.
сделал тест обмена данными приложения Lua и Python. -------------------- для mapping falles скорость обмена 21 МБ/сек. Просто файлами 0.8 МБ/сек. Аналогично между приложениями на Lua. ------------------ Функции обмена реализованы на С.
nikolz написал: Я выкладывал тесты. Но с питоном не делал. Он медленнее luajit примерно в 30 раз.
да уже увидел тесты
сделал тест обмена данными приложения Lua и Python. -------------------- для mapping falles скорость обмена 21 МБ/сек. Просто файлами 0.8 МБ/сек. Аналогично между приложениями на Lua. ------------------ Функции обмена реализованы на С.
Продолжаю хвалится. -------------------------- Те кому рябит, смотрите только нижнюю картинку это профит - рассчитывается с начала этого года (есть за 2023 и частично за 2022) -------------- белая линия - это суммарный профит зеленая линия - это лонг синяя - это шорт штриховые линии - это текущий расчет. ================= Графики использую для обучения. Этот робот реализует NN -"обучение с учителем" ----------------- С самообучением пока лишь стою. ============== На верхнем графики автоматически строятся уровни поддержки и сопротивления и линии регрессии.
bespalex написал: перебор тоже вариант Чаще всего отключение происходит ровно в 10:00:05. Не знаю, может какое-то технологическое переключение в начале сессии, которое триггерит выкидыш. Не думаю, что если бы дело было в core.dll оно бы так выглядело.
Дело в том, что нет смысла передавать все данные из КВИК через луа в питон. ------------- Моя концепция создания робота такая: ----------- Робот условно содержит две части - я их назвал по аналогии с человеком - спинной и головной мозг. Спинной - это все колбеки в КВИКЕ и все торговые операции в КВИКЕ. Их нет смысла перегонять в питон и обратно. Это фактически автомат стандартных действий, которые не зависят никак от стратегии и тактики торговли. Эту часть я реализую в КВИКЕ на луа + си for lua. ------------------ Головной мозг - это прогнозы, управление капиталом, стратегии торговли можно и нужно реализовывать в дополнительных потоках и приложениях на любых языках, в том числе и питоне. --------------------- Вот для этого организую взаимодействие КВИКа через Луа с python, rust,julia, terra, luajit и т д ================ Сейчас обмен любыми данными делаю через mapping files. Скорость обмена просто аховая, так как это обмен через память . Нет никаких оберток. Поддерживаются все форматы. Строки передаю как хеш. Это фактически два целых числа. Объем данных ограничен лишь объемом дисков. ---------------------- Хочу сделать формирования запроса произвольных данных от сторонних приложений. =========== И еще замечу, что если Вы исполняете скрипт для питона без jit либо трансляции в СИ, то это раз в пять медленнее, чем на луа.
Спасибо, очень познавательно. У меня задача немного проще сейчас: адаптировать существующего робота для работы с Quik. В принципе не сказать, что медленно, цикл проверок на триггер занимает около 50-150мс (вместе со всеми транзакциями). Для моих задач этого пока достаточно. В вашей системе какое время обработки получается?
Добрый день, Тестил скорость питона, луа и 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);
nikolz написал: Да, тики - это лишь текущие торги. Свечи - на сервер КВИК формируются и хранятся 3000 шт. Если не будете удалять и переустанавливать, то будут накапливаться в арктве на компе бБлагодарю за пояснение
Благодарю за пояснение! По поводу второго вашего поста, нужно было сделать только один запрос с последующим экспортом в cvs например, но теперь я понял что нужно искать другие источники биржевых данных, либо накапливать самому во внешнюю БД
перебор тоже вариант Чаще всего отключение происходит ровно в 10:00:05. Не знаю, может какое-то технологическое переключение в начале сессии, которое триггерит выкидыш. Не думаю, что если бы дело было в core.dll оно бы так выглядело.
Дело в том, что нет смысла передавать все данные из КВИК через луа в питон. ------------- Моя концепция создания робота такая: ----------- Робот условно содержит две части - я их назвал по аналогии с человеком - спинной и головной мозг. Спинной - это все колбеки в КВИКЕ и все торговые операции в КВИКЕ. Их нет смысла перегонять в питон и обратно. Это фактически автомат стандартных действий, которые не зависят никак от стратегии и тактики торговли. Эту часть я реализую в КВИКЕ на луа + си for lua. ------------------ Головной мозг - это прогнозы, управление капиталом, стратегии торговли можно и нужно реализовывать в дополнительных потоках и приложениях на любых языках, в том числе и питоне. --------------------- Вот для этого организую взаимодействие КВИКа через Луа с python, rust,julia, terra, luajit и т д ================ Сейчас обмен любыми данными делаю через mapping files. Скорость обмена просто аховая, так как это обмен через память . Нет никаких оберток. Поддерживаются все форматы. Строки передаю как хеш. Это фактически два целых числа. Объем данных ограничен лишь объемом дисков. ---------------------- Хочу сделать формирования запроса произвольных данных от сторонних приложений. =========== И еще замечу, что если Вы исполняете скрипт для питона без jit либо трансляции в СИ, то это раз в пять медленнее, чем на луа.
Робеспьер написал: Всем привет! Полагаю, что получение тиковых данных возможно только при активной биржевой сессии, или возможно, это от брокера зависит.
Код
class_code = "TQBR"
sec_code = "GAZP"
function main ()
ds, err = CreateDataSource (class_code, sec_code, INTERVAL_TICK)
if err ~ = nil then
message (tostring( message ))
return
end
err = ds: SetEmptyCallback ()
if err = = false then
message (tostring(err))
return
end
message ( string.format ( "Sizeof: %s" , ds: Size ()))
end
Вывод: Sizeof: 0 При использовании свечного интервала, к примеру: INTERVAL_M1, наоборот данные возвращаются со всеми полями OHLC
у вас неправильно написана программа. Надо один раз подписываться на источник, а не долбить сервер заявками на подписку. Сами тики приходят в колбек onAllTrade ---------------- На форуме я выкладывал скрипт с очередью данных из колбеков и подпиской. посмотрите и повторите.
Да, тики - это лишь текущие торги. Свечи - на сервер КВИК формируются и хранятся 3000 шт. Если не будете удалять и переустанавливать, то будут накапливаться в арктве на компе больше.
Мы , многонациональный народ России, достоин любого индикатора на халяву. Поэтому можем позаимствовать у недружественных разработчиков алгоритм и сделать на луа в КВИКЕ импортозамещение. Как два пальца..
Kolossi написал: Через файлы это хорошо, сам пользую. Как для передачи, так и для сохранения для последующего запуска. Вот только бэкапится приходится т.к. при коллизиях и вывыливании терминала в дамп файлы частенько бьются. А поскольку в файл писать приходится часто это становится проблемой.
Как видно из экспериментов выше, время обмена через файлы, особенно с отображением в память, меньше, чем вызов не сложной функций на любом скриптовом языке. --------------------- Но если это разные потоки или приложения, то надо синхронизировать, чтобы не было проблем. ------------------ Я предпочитаю синхронизацию без блокировки. Проблем нет.
Последний эксперимент - mapping files. Создается файл, в который два скрипта пишут письма друг другу по очереди, так же как во втором эксперименте. --------------- Однако в этом случае. делается проекция файла в память. Приложения фактически обмениваются через память, при этом выполняется и запись в файл. ------------- картинка работы приложений.
В файл каждое приложение выводит текущее время с квантом 0.1 мкс. Для определения задержки обмена сообщения на экран отключены Первое число - длина текста в строке Результат в файле:
Величина задержки получилась менее 3 мкс. ------------------- Таким образом, при обмене не то что потоков, а приложений, через файлы с отображением в память задержка сообщений не более 3 мкс.
Вот результаты теста обмена данными через файл двух приложений. ----------------- Запускаю два приложения на луа. Каждое приложение записывает свое сообщение в файл в ответ на поступившее сообщение от другого приложения. Поступившее сообщение выводится в окно приложения. вот так это работает а это содержимое файла через который выполняется обмен сообщениями Первое число в строке - задержка между сообщениями в мкс. Второе число - размер файла в данный момент. В среднем задержка обмена составляет 0.2 ms или 0.0002 сек.
nikolz написал: Хвалюсь. ------------------------------ Сегодня мой робот на сбере показал такую картинку с начала года.
Т е c 3.01.2024 профит 2.44%, из них 1.72 - лонг и 0.72 -шорт. Стратегия "купил и держи" дала бы 1%.
Чем тут хвалиться? Этой уродливой картинкой, по которой единственное, что можно понять, - что она опасна для глаз смотрящего? У меня цыгане на соседней улице живут, так вот от их шмоток в глазах меньше рябит.
Если умеете программировать на луа и питон, то делаете обмен данными между приложением на питон и приложением на Луа. Либо ищите такой скрипт. КВИК вообще при этом не требуется. Потом скрипт луа для обмена запускаете в КВИК.
Не очень понял, т.к. QuikPy это и делает. Он работает на питоне в связке с QuikSharp, который запущен в QUIK. Вот между ними связь и теряется периодически.
В документации QuikPy написано: ------------------ Возможные ошибки
Если возникают ошибки, связанные с core.dll, то все варианты этой библиотеки выложены в проекте QUIKSharp
Путем перебора подбираете подходящую для вас версию core.dll
Если возникают ошибки при исполнении LUA скриптов, то, возможно, были обновления в QUIK или LUA. Последняя версия LUA скриптов находится Они не учитывают мои специфические правки, но должны работать без ошибок с последней версией QUIK.
Добрый день, Эта тема в основном для начинающих строителей роботов. -------------------------- На вопрос как сохранить или как передать данные в другой скрипт и приложение, я рекомендую начать с обмена через файлы. -------------------- Как правило в ответ получаю - через файлы - это медленно. На вопрос -откуда Вы это знаете -обычно ответа нет. ---------------- Аналогичный вопрос возникает при попытке передать данные из одного приложения в другое. --------------- Тем кто, знает С 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, текущее время и задержку обнаружения записи в очередной файл.
Добрый день, Вопрос к разработчикам. Можете объяснить, почему на учебном сервере тики приходят с запаздыванием от 500 до 1700 ms. При этом задержка обмена по интернет не более 30 ms. Задержка обработка колбека не более 0.1 ms Вот результаты теста строки с первым числом 2 - это обработка колбека onAllTrade. Последнее число в строке(zT) - это задержка в ms Я понимаю, что это учебный сервер, но у всего есть причина. Хотелось бы понять и простить.
Если умеете программировать на луа и питон, то делаете обмен данными между приложением на питон и приложением на Луа. Либо ищите такой скрипт. КВИК вообще при этом не требуется. Потом скрипт луа для обмена запускаете в КВИК.
Добрый день, По просьбе разработчиков https://forum.quik.ru/messages/forum10/message73569/topic8440/#message73569 выкладываю для общего пользования свой тест измерения времени подключения источников данных. Так как ранее использовался очень большой скрипт, то пришлось написать специально тест для общего пользования. ------------------- В тесте используется два таймера. Один - мой на основе высокоточного счетчика 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
VPM написал: nikolz, Наоборот прозрел, за скоростью не гоняюсь , тогда чем можно руководствоваться и как наилучшим (оптимальным) образом организовать память?
С памятью все просто. ------------------- На диск надо писать лишь то, что хотите сохранить для истории и что не хранится в архивах КВИК. Как правило - это результаты реальной торговли. Но и это можно не сохранять так как они есть в отчете брокера. И только в отчете брокера Вы увидите что было реально. -------------------- Кроме того, в отдельный файл можно записать исходные данные для торговли. Это позволяет не изменять их в скрипте. ----------------- Могу посоветовать следующее. Написали что-то. Поставьте в начале блока N=os.clock() и в конце time=os.clock() -N и выведите time в сообщение. Вы узнаете сколько реально в секундах у вас выполняется этот блок. Если это разовый блок в начале запуска, то время вообще не колышет. Если время вас устраивает, то забудьте про этот блок и пишите дальше.
VPM, Без обид, но Вы очевидно не представляете как реализована запись в файл в Винде. Если Вы часто читаете файл, то Вы читаете его из памяти, а не с диска. Поэтому разницы никакой нет. Да и вы же за скоростью не гонитесь. Или что я упустил в Ваших рассуждениях?
Коллеги, нужна помощь c lua. Не могу найти прямую зависимость. То что хочу построить firm_id (n1) - client_code (n1) .......................... - client_code (n) --trdaccid (n1) ..................... --trdaccid (n) firm_id (n) .......................... - client_code (n) ..................... --trdaccid (n)
Есть ли зависимость такая? Как ее выстроить?
Проблема возникла из задачи определения кол-ва доступных стредств, если счет является " * -единый брокерский счет". Если я правильно понимаю сам факт проверки у нас есть через IsUcpClient. Но возникает проблема когда к квику подключено несколько торговый счетов, фирма одна. При запросе лимитов при архитектуре древа, получается так что лимиты по деньгам дублируются, т.к. связь удалось выстроить только через фирму.
В целом реализацию делаю в питоне, посредством QuikSharp и библиотеки QuikPy. Но понять бы как это сделать на луа, можно бы было интерпретировать и в питоне. Возможно кто то из вас уже реализовывал это и на самом питоне, буду очень признателен.
Есть. По таблицам и ключам с помощью функций для работы с произвольными таблицами. Пишите и выкладывайте с конкретным вопросом.
Преобразование таблицы 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])
Nikolay написал: Думается, что это проблема выбора реляционной базы для хранения данных (правда мой опыт обработки всех сделок, всех акций за 2016 год на MsSQL не вызывал каких-то проблем, кроме объема, но это год). Хотя организовать порционную подачу данных вполне можно. Заказали - начинают поступать данные. Если же сделано, что сначала все данные подготавливаются, кешируются и только потом выдаются всем объемом, то, наверно, это и приводит к таким задержкам. Плюс, видимо, у таких данных очень низкий приоритет, так что не во все пакеты попадают.
Не понял, кто выбирает? Тики вообще выдаются лишь за текущий день.
nikolz написал: если Вы записали в файл fT таблицу T так, как она записана в скрипте Lua, то просто загрузите этот файл в скрипттак:loadfile(fT)
Я вообще не понимаю в чем различие loadfile от load в каком случае чем пользоваться (может есть какие то критерии) ???
load - загрузка из переменной string loadfile - загрузка из файла на диске ======================= Выкладываю для вас решение для вывода таблицы в файл и загрузки таблицы из файла в скрипт
Код
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])
Увеличенное время объясняется разницей в запрашиваемом объеме данных.
Вообще-то после выхода из функции CreateDataSource ничего не загружено. ---------------------------- Загружается после. -------------------------------- А ежели тики, да еще внутри сессии, то грузится несколько минут.
VPM написал: Glukator, Я этим пользовался в lua 5.1 при переходе на 5.4 перестало работать, вот смысл:
Цитата
Используем преобразование таблицы в текстовое представление и сохраняем на диске результаты. -- Сохранение таблицы или массива в файл function table.save(tbl,filename) local f,err = io.open(filename,"w") if not f then return nil,err end f:write( table.tostring (tbl)) f:close() return true end В результате на диске мы получим файл, в котором в терминах синтаксика языка Lua описана наша таблица. Зачем сохранять в синтаксисе Lua? Причин две: универсальность элегантный способ чтения таблицы из файла Вот функция, читающая файл и возвращающая сохранённую в нем таблицу: -- Чтение таблицы из файла в массива или таблицу function table.read(filename) local f,err = io.open(filename,"r") if not f then return nil,err end local tbl = assert(loadstring("return " .. f:read("*a"))) f:close() return tbl() end Все просто - читаем файл и запускаем его на выполнение Вот как это выглядит: table.save({11,22,33,{"gh",'jk'},44},"e:\\1.dat") -- пишем t = table.read("e:\\1.dat") -- читаем
У меня робот с начала года показал это: стратегия "купил и держи " показала бы в этом случае (275.28-273.5)/273.28 -ком=0.72% У робота получилось переиграть эту стратегию =1.3% -------------------- А это картинка за декабрь 2023
стратегия "купил и держи" показала бы (273-276)/273= -1.5% робот показал =32% ---------------------------- Особо интересно то, что рынок при этом сменил тренд с падающего на растущий. Сначала провалился на (276-255)/276=7.6% Потом вырос на (273-255)/255=7% Если сначала войти в шорт а потом в лонг, то получим всего 14.6% ---------------- Робот собрал на логах 15% и на шортах 17%.
Я смотрю на индикаторы как на фильтры. Представьте, что у вас есть некий черный ящик, который будет обрабатывать данные, слева от него вы помещаете некоторые данные, а справа из этого ящика будут выходить данные, которые являются отфильтрованными.
«Цифровая обработка сигналов» – это способ организации того, что находится внутри этого черного ящика. Это может быть нечто вроде RSI, или это может быть простая средняя. По сути, все сводится к вопросу: насколько сложным будет этот черный ящик? Другими словами, насколько сложным будет ваш фильтр данных? --------------------- И еще одна заключительная мысль. Как показывает опыт, сфера трейдинга и технического анализа полна людей, которые заявляют, что они торгуют, следуя за своим гуру, или утверждают, что обладают неким секретом успеха или имеют безупречную систему, о которой никто не знает. Но трейдерам-новичкам я бы сказал, что в техническом анализе нет никаких секретов. Всё на самом деле довольно просто.
Приступая к техническому анализу, вы выполняете обработку сигналов, а также используете некоторые аспекты оценки недостатков.
То есть он представляет собой комбинацию математики, статистики и психологии, но никаких секретов в реальности не существует. Так что не верьте людям, которые обещают вам огромное богатство практически за одну ночь – трейдинг так не работает. Не поддавайтесь на ложные обещания.
Владимир написал: VPM, КАКОЙ график? Мой скрипт следит за 8 таймфреймами, и никакой график не даст столько информации. В любом случае, строить гипотезы как поведёт себя дядя Вася и на них строить собственную торговлю попахивает самоубийством. Мне плевать на проблемы всех "австралийских трейдеров", помноженных друг на друга - скрипт будет торговать теми инструментами и в тех направлениях, которые ОН САМ посчитает нужными. Вот прям ща, когда я это пишу, кто-то там "снял быстрым движение стопы забрав тем самым ликвидность улучшил свою позицию" на одном из моих тикеров, скрипт тут же отреагировал, и рынок пошёл в нужном ЕМУ направлении. Надолго ли, не знаю (и знать не хочу), но свои полпроцента прибыли скрипт уже успел хапнуть примерно за 5 минут.
nikolz написал: Подобную идею реализуют HFT роботы, но это не КВИК и дорого
Вероятно, не вижу где-то подвоха, но пока не понимаю почему это "дорого", если "API" квика поддерживает такую возможность. Вызвать несколько функций и передать пару десятков значений - не выглядит чем-то мудрёным.
Буду рад, если всё-таки официальная ТП прокомментирует: согласуется ли моя идея с возможностями QLua?
Мудреного ничего нет. Но посчитайте все задержки и получите, что вы измените свою заявку сегодня по тем данным, которые увидели вчера.
nikolz написал: Судя по вопросу Вы слабо представляете как работает биржевая торговля. Где , по вашему мнению, будет происходит эта "магия"?
Очевидно - в квике. Если он позволяет работать с заявками до момента отправки брокеру, то глобально не вижу проблем, чтобы реализовать идею. Вопрос лишь: есть ли технически такая возможность? В моей голове выглядит весь процесс примерно так: - есть некий listener, который следит за появлением заявок - как только срабатывает условие, что есть новая заявка и тип - рыночная, то либо меняем текущую, либо создаём новую, беря нужные параметры от изначальной и добавляя свои - отправляем брокеру - вуаля, "магия" сработала
Если время выполнения хотелки не критично, то все возможно. Но поезд скорее всего уже уйдет.
pertifospi написал: Добрый день. С программированием не очень знаком, поэтому перед тем как начать усиленно копаться в Lua хочу уточнить у знатоков и тех. поддержки возможно ли в принципе реализовать идею. Идея вот какая: в момент отправки рыночной заявки менять её тип на лимитную с фиксированным для каждого инструмента спредом от текущей цены? В идеале чтобы ещё была возможность указать, что делать с контрактами, которые не попали в спред: оставлять в виде лимитной заявки или снимать. Если на примере: есть инструмент А с шагом 1 и ценой 500, для простоты картины, в момент отправки рыночной заявки в лонгах и шортах на каждом шаге (то есть цене инструмента) по 10 заявок\контрактов. Мы отправляем по рынку 80 контрактов, допустим, в лонг. Спред для инструмента указан 5. Но тут происходит "магия" и рыночная заявка преобразуется в лимитную на 80конрактов с ценой покупки 505. И в идеале ещё, если можем указать заранее для этого конкретного инструмента что будет с оставшимися 30 контрактами. Либо они появятся в стакане по цене 505, либо сразу снимутся.
Если такое возможно, то буду рад, если кто укажет хотя бы в общих чертах схему работы по функциям. Что за чем вызывается.
Отвечая на возможный вопрос "а зачем это?". Всё просто: оказывается, у моего брокера (может и всех такое, я не проверял) ГО в зависимости от типа заявки отличается ~ в 2 раза.
Судя по вопросу Вы слабо представляете как работает биржевая торговля. Где , по вашему мнению, будет происходит эта "магия"?
Время обработки составило 5.6 секунд, вместо 48 секунд ранее. Во время вычисления головного блока не происходи останов функции main, которая продолжает обработку колбеков. В итоге, очередь до вычислений и после вычислений содержит не более 1 элемента, вместо 1854 ранее.
Про робота ------------------------ Один раз в минуту робот вычисляет головной блок для всех зарегистрированных инструментов. В результате этих вычислений получается очередь новых заявок . --------------- Привожу результаты теста , который позволяет оценить эффективность применения дополнительного потока для этих вычислений , а также проведение вычислений в Luajit в дополнительном потоке ------------- В первом тесте все вычисления выполняются в функции main для версии Lua5.3 Результат:
Nc=3 - число торгуемых классов ncs=284- число торгуемых инструментов. Вычисление головного блока началось в 14:58:00 , закончилось в 14:58:48 ------------------------ Обратите внимание на последнее число в стоках до и после вычислений головного блока. это число инструментов, которые находятся в очереди на обработку в main. ---------------------------------- За 48 секунд вычислений очередь увеличилась с 0 элементов до 1854. Т е за 48 секунд в ТТП изменились данные 1854 раза. ----------------------------------