nikolz (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 28 След.
Изменения в работе с колбеками LUA в новой версии
 
либо проще
обслуживание колбеков пулом потоков без разделение на виды.
Изменения в работе с колбеками LUA в новой версии
 
добавлю свои пять копеек.
---------------------------
сделал бы для каждого вида колбека отдельный пул потоков.
Открытие файла и память
 
Цитата
s_mike@rambler.ru написал:
Цитата
Старатель написал:
Что интересно, если переменную удалить сразу после использования, то скрипт станет занимать больше памяти.
 
Код
      local   a   =     0  
 print (collectgarbage(  "count"  ))    --> 23.4453125      
 
 
Код
      local   a   =     0  
a   =     nil  
 print (collectgarbage(  "count"  ))    --> 23.453125      
 
рaзница в 8 байт. Как раз длина строчки a = nil )
a=nil - не удаляет переменную, а присваивает ей значение nil
а скрипт естественно длиннее на строку a=nil.
------------------------------------
Чудес не бывает, бывает лишь отсутствие знаний.
Предложение к разработчикам
 
Цитата
Владимир написал:
В своём коде я "обвистовал" все присвоения tostring или tonumber - пока работает (а мне, собственно, осталось только отладить подачу заявок и контроль их исполнения, да обработку событий от юзера), но замечания к реализации остались. На код глядеть местами тошно, но это мелочи. Однако, есть и довольно важные замечания. Попробую их изложить по группам:

I. Настоятельно рекомендуемые к исправлению:

1. У меня  все до единого  обращения к функциям другого потока (SetCell, SetColor и прочие) выполняются только после контроля флага останова. Тем не менее, даже после этого мне доводилось пару раз так "удачно" нажать на кнопку "остановить", что управление в main больше не возвращалось, скрипт завершался принудительно, и вместо записанного файла результатов работы скрипта я получал шиш с маслом. Здесь уже высказывалось мнение, что это "на 100% зона ответственности QUIK, и я с ним согласен. Я отслеживаю эту ситуацию по наличию или отсутствия финального message("Скрипт остановлен!") и по нулевому размеру файла результатов, но это же ненормально! Как и бесконечные "if f then ... end".

2. Как и первое предложение, это высказывалось уже давно, и не исправляется ГОДАМИ! Как и в первом случае, я не понимаю (и не хочу понимать!) почему "для того, чтобы строки отображались, необходимо, чтобы вызов CreateWindow() производился ДО процедуры добавления строк в таблицу". Здесь участники дискуссии, на мой взгляд, очень убедительно показывали, что такого быть не должно, но хотя бы внесите в описание языка эту "особенность"! Ведь многие (особенно новички) даже не подозревают о таких "нюансах" и тратят многие часы на отладку того, что в принципе не может быть отлажено.

3. Некоторые функции допускают необязательные аргументы (например, основание системы счисления в tonumber), а другие - нет. Так,
SetColor (iTable, iRow, iCol, BCol, TCol)
НЕ работает, а если подставить туда два дополнительных аргумента , SelBCol, SelTCol, равные QTABLE_NO_INDEX (-1) - начинает работать! Поскольку мне совершенно не были нужны выделенные ячейки, до необходимости переделать вызов в
SetColor (iTable, iRow, iCol, BCol, TCol, SelBCol, SelTCol, -1, -1)
без подсказки от службы техподдержки я бы просто не додумался НИКОГДА!

II. Очень хотелось бы, но это уже скорее ненаучная фантастика:

1. Определение типов данных программистом, типа STRING s, NUMBER n, BOOLEAN b, и чтобы интерпретатор не имел права менять указанный тип данных  ни при каких обстоятельствах  (вылетал бы с ошибкой). Хотя бы как дополнение к существующей "динамической типизации" (а лучше как полная её замена).

2. Вернуть "украденный" целочисленный тип данных (INTEGER i) и операции булевой алгебры для работы с ними (and, or, not или, в сишном синтаксисе, &, |, ^, >>= и т.д).

3. Отделить ключи от индексов. Точнее, ввести индексы в их классическом понимании как порядковый номер элемента в массиве (автоматически получая возможность задавать именно массивы, а не "таблицы Lua"), а также структуры данных (и, соответственно, возможность определять таблицы как массивы структур или, в реляционной терминологии, как массивы кортежей). Это, к тому же, заставит нумеровать массивы либо с нуля, либо с единицы, а не как Бог на душу положит. Для меня в своё время стало открытием, что определив таблицу как T={} я спокойно заполняю её данными, начиная с нулевого индекса, а если начинаю инициализировать вроде:
Q = { 0x999999, 0xFFFFFF, 0x99FFFF, 0x99FF99 };
то для обращения к первому элементу требуется указать именно 1, а не 0.

III. Синтаксис

1. В циклах имеется break, а вот continue почему-то нет (про goto я просто молчу).

2. Неплохо бы вообще приблизить синтаксис к совершенно гениальному языку C (фигурные скобки вместо "паскалевских" begin-end - тем более, что никакого begin как начало блока здесь вообще нет), возможность определять константы (#define), возможность условной трансляции/исполнения (#if) - тогда языку просто цены не будет!  ::  
Вы не к тем разработчика обращаетесь.
Ваши хотелки  || и III.
Это претензии к разработчикам языка луа, а это -  в Бразилию.
----------------  
Но самое прикольное,
что и луа и VMLua
и даже терминал QUIK
- это все Вам бесплатно
- т е халява.
А дареному коню в зад, то бишь  зубы,  не смотрят. (Народная мудрость)
перестало работать снятие активной заявки
 
Цитата
Владимир написал:
Sergey Gorokhov,Да я всегда спокоен - это просто стиль такой.  ::

В 64-разрядный integer спокойно влезают даже 20-значные числа - более 18 квинтиллионов!
Для справки  :
Разрядность мантиссы в 64 битном вещественном числе составляет 52 бита,
что  позволяет точно отобразить лишь 16 разрядное десятичное целое число .
а не  18 квинтиллионов, как наивно полагает Владимир.
Более быстрый способ, all_trades
 
методы создания торговых роботов, принципиально отличаются от написания программ по понятиям, которые гоняют туда сюда кучу данных.
вот некоторые из аксиом, которые надо усвоить и научится программировать.
-----------------
1) В текущий момент времени робот должен тратить ресурсы лишь на обработку новой информации
2) Если робот не успевает обработать информацию до прихода новой, то информация лишняя и обрабатывать ее не имеет смысла.
3) Применение циклов в системах реального времени - это зло, которое надо избегать.
----------------
Поэтому в конкретный момент времени надо обрабатывать лишь новые сделки.
===============  
Если надо очень быстро то используйте API C for LUA.
будет быстрее чем шарп, а для  уровня решения задач посетителей данного форума еще и проще в понимании.
А уж Буратинам надо писать исключительно на луа.
Более быстрый способ, all_trades
 
Цитата
Костя написал:
Цитата
nikolz написал:
Все смешалось - кони,люди

Зачем нагородили кашу из луа и шарпа?

Все делается без шарпов на луа без проблем.
--------------------------------------------------------------------------------------
Мы не ищем легких путей.  
Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
В ОБЩЕМ проблема не решена

Квиж жутко тормозит  и набиваем массив
Освойте сначала луа а потом пишите на шарпе
нет желания разбираться с вашей кашей.
из строки в числовое значение
 
x='0.08'
print(x..","..type(x))
z=tonumber(x)
print(z..","..type(z))
---------
результат:
0.08,string
0.08,number
Более быстрый способ, all_trades
 
Все смешалось - кони,люди

Зачем нагородили кашу из луа и шарпа?

Все делается без шарпов на луа без проблем.
--------------------------------------------------------------------------------------
Мы не ищем легких путей.  
Создадим себе трудности, чтобы потом искать того, кто их преодолеет для нас..
Более быстрый способ, all_trades
 
Цитата
Костя написал:
Цитата
nikolz написал:
исправьте так:
-------------------------------
function qsc.all_trades(msg)
if type(msg.data)~="table"  then msg.data={} end
local i=#msg.data;
 local count = getNumberOf("all_trades");
 while count>i do i=i+1;
     local depo_limit2 = getItem("all_trades",i)    
     if msg.data == "" or depo_limit2.sec_code == sec_code1 and depo_limit2.datetime.hour >= 10 then msg.data = depo_limit2; end
 end
 return msg
end
Благодарю за это, но это тоже медленно  работает ,  буду  
SearchItems пробовать  ...
Напишите для начала сколько времени у вас исполняется ваше решение и сколько это.
--------------
В этом решении все существующие данные загрузятся один раз а не каждый цикл.
Если новых данных нет, то время не тратится.
---------------------
Поясняю на примере.
Пусть в архиве 10000 данных.
В вашем решении на каждом цикле будете читать в таблицу 10000 данных
В моем это чтение будет лишь один раз.
После поступление нового значение у Вас опять будет читаться все 10001 значение
а в моем только 1.
-------------------
Итак какие результаты у вас получились?
Как убрать нуль после точки?, .0
 
 print(type(x))
x=10; print(type(x))
  x="10"; print(type(x))
 x={}; print(type(x))

результат:
nil
number
string
table
Как убрать нуль после точки?, .0
 
для справки тип данных определяется так:
 print(type(x))
 x=10
 print(type(x))
   x="10"
 print(type(x))
  x={}
 print(type(x))

результат:
nil
number
number
string
table
Обучаюсь, Обучаюсь Lua ,мне дали одно задание,но я его не понимаю.
 
Плохой у Вас учитель.
Более быстрый способ, all_trades
 
исправьте так:
-------------------------------
function qsc.all_trades(msg)
if type(msg.data)~="table"  then msg.data={} end
local i=#msg.data;
 local count = getNumberOf("all_trades");
 while count>i do i=i+1;
     local depo_limit2 = getItem("all_trades",i)    
     if msg.data == "" or depo_limit2.sec_code == sec_code1 and depo_limit2.datetime.hour >= 10 then msg.data[i]= depo_limit2; end
 end
 return msg
end
Более быстрый способ, all_trades
 
Цитата
Костя написал:
Цитата
nikolz написал:
local i=#msg.data;
Попробовал ваше  

сработало исключение
@"Lua error: qsfunctions.lua:605: attempt to index a string value (field 'data')"
покажите как вы определили msg которое передаете в вашу функцию.  
Более быстрый способ, all_trades
 
на основе вашей функции, можно сделать примерно так:
-------------------------------
function qsc.all_trades(msg)
if msg.data==nil then msg.data={} end
local i=#msg.data;
  local count = getNumberOf("all_trades");
  while count>i do i=i+1;
      local depo_limit2 = getItem("all_trades",i)    
      if msg.data == "" or depo_limit2.sec_code == sec_code1 and depo_limit2.datetime.hour >= 10 then msg.data[i]= depo_limit2; end
  end
  return msg
end
Более быстрый способ, all_trades
 
для скрипта надо делать две части
первая часть исполняется один раз и читает данные из архива квика
вторая часть работает в колбеке
Предложение к разработчикам
 
Цитата
Владимир написал:
nikolz,
Цитата
nikolz написал:
Вы еще далеки от понимания реальности фондовых рынков.
А зачем мне понимать их реальности?  :: Есть тикеры, есть цена спроса и предложения и это ЕДИНСТВЕННАЯ реальность, которая меня интересует.

Нет, я не помню игровые автоматы в супермаркетах и беспроигрышную лотерею у вокзалов  - мне всегда хватало мозгофф понять, что это лохотрон. Так что, бывшие напёрсточники теперь называются "маркетмейкеры"? ВОТ ЭТО ВОТ теперь называется ""монстры фондового рынка"? Я же говорю: КАБЗДЕЦ финансовому рынку с такими "трейдерами"! КАКИМ ОБРАЗОМ эта хрень может "сделать ликвидность и уменьшить спред"? Развести лохов на бабки? Да лохи и так все свои бабки благополучно просрут, без этих долбаных "мейкеров"!

А брокеры - это НЕ ТОЛЬКО "всего лишь посредники между биржей и клиентами" - цитата из Вики:
На бирже маркетмейкером может являться, например, брокерская контора, которая по договору с биржей берёт на себя обязательство держать в течение оговорённого времени (скажем, не менее 90 % торгового времени) одновременно выставленные заявки с разницей между ценами покупки и продажи (см. спред) не более оговорённой величины, за это биржа предоставляет маркетмейкеру определённые льготы, например, по оплате комиссионного сбора.

Про HFT роботов: кого и как они там "обгладывают" - меня не интересует: меня они не обглодают. Ну что они могут обглодать за свои сраные доли секунды? Ну, получат они какую-то там "информацию" раньше - и что? Ну, купят что-то на полкопейки дешевле, ну, продадут на три копейки дороже - да и то лишь в том случае, если они по этой информации примут правильные решения. Я если рынок тупо проигнорирует эту инфу? А если они неправильно оценят эту информацию? Где тогда будут эти "пираньи"? Правильно, в зопе!    
Не навязчиво рекомендую кроме вики прочитать ФЗ  "О рынке ценных бумаг"
Еще можно для  расширения кругозора почитать книгу Дж.Сороса "Новая парадигма финансовых рынков". Он ее написал под впечатлением очередного обвала рынков.
Что же относительно Вашего представления о фондовом рынке.
Так на то оно действительно  Ваше.
Но зачем же так агрессивно его излагать?
Получение значения индикатора не открывая данных графика
 
Попросите товарища пройтись по таблице и сказать результат.
Более быстрый способ, all_trades
 
Уточните, Вы пишите скрипт или индикатор.
Кто как решил вопрос уведомления о сделках?
 
Цитата
Nikolay написал:
Сделал небольшое решение для отправки сообщений в чат бота телеграма (Telrgram Bot Api).
https://github.com/nick-nh/qlua/tree/master/telegramQuik

Основа - это некое C# консольное приложение (многопоточный сервер), принимающее данные от lua скрипта и отправляющее уже сообщения в чат телеграм. Я предпочитаю делать так, дабы не связываться с проблемами совместимости библиотек lua.

Сначала сделал передачу данных на внутренний сервер через сокеты, но медленно оказалось.
Переделал на Named Pipes, быстрее намного. Пришлось написать библиотеку Named Pipe клиента для lua.

Пока сделал только отправку сообщений, т.к. это самая частая просьба.
информация к размышлению.
Вообще-то пакет байтов 500 по UDP сокетами передается даже на луа примерно не более чем за 20 ms. Это медленно?
Какая же у вас получилась скорость ?
---------------------------  
Вопросы Новичка
 
Цитата
Anton написал:
Цитата
nikolz написал:
предыдущий оратор
открыл оригинал и посмотрел, уот так уот неожиданно.
Да Вы батенька не только QLUA не знаете
Вы начинаете изучать, а  я должен гадать какую версию  программы Вы взяли и откуда?
Оно мне надо?   Можете не отвечать. Вопрос риторический.
Работа main() при наличии 1 ядра
 
Цитата
Христиан написал:
Здравствуйте, хочу поставить Quik на VPS сервер чтобы работал там круглосуточно, волнует вопрос, как будет работать main() в отдельном потоке при наличии только 1 ядра? Все ли будет работать или нужно минимум 2. Поправьте если я чего-то не понимаю, спасибо
все будет работать без проблем, если хватит памяти и места на диске.
Предложение к разработчикам
 
Цитата
Владимир написал:
Да какие они "маркетмейкеры", если работают аж на миллисекундах? Брокер - это маркетмейкер, это я понимаю. А эти... И вообще, как это биржи существовали в докомпьютерные времена?  ::  
Вы еще далеки от понимания реальности фондовых рынков.
От брокера до маркет мейкера как от земли до луны.
------------------------------
Вот вам немного информации для размышления.
Вы наверное помните еще игровые автоматы в супермаркетах и беспроигрышную лотерею у вокзалов  (лохотрон называется)?
Помните тех активных игроков, которые постоянно играют на автоматах и предлагают бесплатно поиграть прохожим у лохотрона?
Это и есть пример маркет-мейкера.
Маркет-мейкера нанимает биржа, чтобы он делал ликвидность и уменьшал спред.
Т е если игрок  бьет в позицию  маркет-мейкера, то биржа платит маркет-мейкеру.
--------------------------------------
А брокеры - это всего лишь посредники между биржей и клиентами.
Они лишь собирают заявки и выставляют их на биржу потом раздают, что купили тем, кто просил.
При этом втихаря раздают в долг игрокам деньги и акции других игроков.
Т е делают то же самое что и банки, только банки берут деньги под проценты у одних и дают под проценты другим,
а брокеры берут деньги у одних на халяву и дают под проценты другим. Чувствуете разницу?
-------------------------------------  
Теперь про HFT роботов.
Они подобно пираньи . Обгладывают крупных инвесторов. Для этого им надо максимально быстрый доступ к торговой площадке.
Пока до буратин, которые играют на КВИКЕ,  дойдет информация , HFT роботы уже скушают, что всплыло в стакане.
Но, делать на квике HFT робота - это как делать самолет из самоката.  
При этом главное процесс, так как результат лишь будет сниться.  



 
Как убрать нуль после точки?, .0
 
Цитата
Алексей написал:
Цитата
nikolz написал:
 
Цитата
Алексей  написал:
Про string.format понял, работает, но сложно как то получается.

Про math.floor можно для чайника разжевать.
Как сделать проще простую операцию:
function OnAllTrade(alltrade)
price = tonumber(alltrade.price);

Далее я просто записываю в файл:
f:write(" "..price.."\n");

Как проще при этом использовать math.floor? Я похоже не понимаю синтаксис и поиск не помогает. (
 попробуйте так:
-------------------
function OnAllTrade(alltrade)
local price = alltrade.price;
f:write(price.."\n");
К сожалению так не работает. Записывается цена и .0 . Оно просто занимает место в таблице или файле, а таких значений много, что очень не удобно.
тогда так:
function OnAllTrade(alltrade)
local price = alltrade.price;
f:write(tostring(price).."\n");
Возможно ли запустить в индикаторе функцию из dll которая подключается в другом lua-скрипте?
 
Цитата
Виктор написал:
Я подключаю dll через lua-скрипты в require("dll").

Хочу чтобы lua-индикатор (это уже другой скрипт) тоже мог обращаться к функциям этой же самой, уже запущенной, dll.
Возможно ли это реализовать? Как?
функции в динамической библиотеке dll всегда имеют одну копию в памяти.
Поэтому ответ -возможно.
Вы индикаторе надо тоже подключить эту библиотеку так же ка вы ее подключали в другом скрипте ,
но Вы это знаете.
Вопросы Новичка
 
Цитата
Афонькин написал:
Начинаю изучать Qlua. Для освоения рассматривал код индикаторов, который опубликован поддержкой (поэтому сам код приводить полностью нет смысла). Конкретно Momentum.
Жалко что в тексте нет ремарок.
При штудировании кода возник вопрос, который приводит меня в тупик :
Код
   function   Init ()
   func  =  MOMENTUM()
    return   # Settings.line
 end 

 function   OnCalculate (Index)
    return  tonumber(Settings.Horizontal_line), ConvertValue(Settings, func(Index, Settings))
 end 

 function   MOMENTUM () 
    local  it  =  {[ 1 ] =  0 , l =  0 }
 return   function  (I, Fsettings, ds)  

Логически я читаю так в  Init() инициализируется/запускается экземпляр функции MOMENTUM() ; в OnCalculate(Index) в неё передаются вводные  func(Index, Settings)

откуда во внутренней функции function (I, Fsettings, ds) берутся данные в ds ? !
они по умолчанию как то привязаны к источнику данных ?

Спасибо заранее.
вы привели лишь кусок кода, поэтому объяснить его нельзя. Можно лишь гадать, как это и делает предыдущий оратор.
Предложение к разработчикам
 
Цитата
Владимир написал:
Борис Гудылин, Ну, во-первых, это правила Московской биржи, во-вторых, если они не тупорылые жадные камикадзе, они должны бы немедленно этот пункт снять - при наличии малейшей конкуренции эти идиоты мгновенно бы лишились все своих клиентов! В-третьих, я предлагаю наказывать не за "неэффективные транзакции" (откуда юзеру знать, куда пойдёт рынок, сработает его заявка или нет?), а за смену заявок в течение короткого промежутка времени. Ошибся? Бывает, на первый раз прощается! Но если не первый - это уже ненормально, за это НУЖНО наказывать! Кстати, аналогичные правила не хило бы ввести и для комментов на этом форуме: минут 5-10 позволять разрешать редактировать свою запись - мало ли, опечатался где-то ляпнул что-то, не подумавши...
это и есть HFT роботы.
Вы предлагаете наехать на монстров фондового рынка?
Почитайте в инете, как HFT роботы делают профессиональных трейдеров.
------------------------------------------------
Мечтать не вредно, но бесполезно.
Вопросы, не требующие ответов
 
Цитата
TGB написал:
Цитата
Владимир написал:
я бы хотел иметь в виде интерпретатора аналог моего любимого С (или хотя бы JS)
  Я, наверное, Вас обрадую. В QLua (Lua) существует C-API и у Вас есть возможность, практически полностью вести свои разработки на C. Хорошее описание C-API представлено в книге одного из отцов-основоположников языка Lua  http://texno.info/wp-content/uploads/2019/09/lua.pdf  (можно посмотреть также  https://lua.org.ru/contents_ru.html#4.7 ).  Вы можете создать dll-пакет на C и подключить в своем скрипте. Далее вызываете в скрипте свою функцию пакета, в которой делаете все что Вам нужно (например, запускаете потоки для обработки данных и так далее). Из такого пакета доступен весь интерфейс с QUIK. Есть хороший ресурс  https://quikluacsharp.ru/ , на котором представлены некоторые шаблоны решений для QLua, в том числе, шаблон создания dll-пакета для QLua.
Ну наконец-то, настало время читать учебники.
-------------------------------
Замечу, что QLUA - это библиотека (dll) и написана она на С-API.
Поэтому можете писать свои библиотеки аналогично.
----------------
Что же касается перехвата всех исключений - то это скорее мечта дилетанта, чем реальность профи.
Как нельзя найти все ошибки, так и невозможно перехватить все исключения. Это аксиома.
Как убрать нуль после точки?, .0
 
Цитата
Алексей написал:
Про string.format понял, работает, но сложно как то получается.

Про math.floor можно для чайника разжевать.
Как сделать проще простую операцию:
function OnAllTrade(alltrade)
price = tonumber(alltrade.price);

Далее я просто записываю в файл:
f:write(" "..price.."\n");

Как проще при этом использовать math.floor? Я похоже не понимаю синтаксис и поиск не помогает. (
попробуйте так:
-------------------
function OnAllTrade(alltrade)
local price = alltrade.price;
f:write(price.."\n");
 
импорт данных в архив
 
Цитата
Andrey Bezrukov написал:
Здравствуйте, nikolz.

Просьба уточнить - правильно ли понимаем, что Вы хотели бы иметь возможность самостоятельно формировать данные свечек как исторические, так и текущего дня в отдельном файле и за тем импортировать их терминал в виде свечек графика QUIK для дальнейшей отладки роботов?
Возможно, для Вашей задачи подойдёт  Редактор архива данных для графиков ?
Да.
Поясню.
Дело в том, что накопление данных на компе в КВИКЕ начинается с момента первого подключения к конкретному инструменту.  
Кроме того, если происходит сбой (пропуск данных) ,то приходится перезаказывать. После этого все, что накоплено на компе, стирается и загружается история с сервера.
---------------
Тестирую робота в реальных торгах.  
При этом  результат работы зависит от длины истории, так как робот обучается.
Невозможность увеличивать историю не позволяет проверить его на различной глубине обучения.
--------------------  
Тестирование алгоритма в других пакетах таких как Амиброкер,
не позволяет полноценно использовать возможности QLUA и терминала QUIK.
неужели OnParam самый быстрый?
 
когда пытаетесь измерять время исполнения колбеков,
то учитывайте минимальный квант винды для задачи,
либо сначала уменьшите его чтобы.
неужели OnParam самый быстрый?
 
Полагаю,что есть единственный способ знать как давно была совершена сделка.
------------------
Ранее уже говорил,
что единственный способ не торговать по вчерашним сделкам,
это синхронизация времени компьютера по серверу реального времени или GNSS
и сравнение времени сделки с точным временем.
-----------------
В итоге мы будем всегда знать на сколько запоздала информация о сделке.
Другого способа не существует.
импорт данных в архив
 
Для тестирования торговых роботов не хватает истории торгов.
Просьба сделать возможность конвертации данных из текстового формата в формат файлов с данными  типа  .dat ,
либо выложить формат этих файлов.

Конвертор напишу и выложу в свободный доступ.
Статус сессии.
 
Статус сессии.
 
Статус сессии.
 
используйте сервер точного времени и не будете месяцами ничего согласовывать.
Биржа тоже его использует.
погрешность будет не более 10 мс. Это меньше, чем задержка интернета.
Зависание QUIK
 
Цитата
Anton написал:
Цитата
nikolz написал:
зачем Вы данные всех сделок собираете в таблицу QLUA
Ничего никуда не собираю, сижу примус починяю, а тут и добрый совет подоспел. Попал тксть под раздачу.
тогда поясните, что вы делаете в функции колбека:
-------------------------------
function   OnAllTrade (v)
  recursion_level  =  recursion_level  +   1
  counter  =  counter  +   1
   if  recursion_level  >  max_recursion_level  then
     max_recursion_level  =  recursion_level
   end
   if  tabid  then
     SetCell (tabid, rowid,  1 , tostring(max_recursion_level))
     SetCell (tabid, rowid,  2 , tostring(counter))
   end
  recursion_level  =  recursion_level  -   1
end
-------------------------
Использование памяти скриптами Lua
 
Цитата
Александр М написал:
Цитата
Михаил Понамаренко написал:
Сегодня выпустил своего простенького робота сеточника на демо-счёт. Пока трудится без капризов, но потребление памяти, с учётом, что робот практически не накапливает данные впечатляет. Мусоровоз приезжает систематически, но загружает не весь мусор.
У меня достаточно сложные роботы, висят круглосуточно постоянно (пока на версии 8.8.4.3 с 14 сентября), память показывается в данном окне 300-600 KB и в этих пределах крутится. У вас просто нереальные цифры.
очевидно это у вас версия 7 на XP
у меня тоже 7 версия кушает 600 КB
а вот верия 8.3 на win10 даже без робота кушает 6.8МБ
запуск GUI на lua дистрибутиве отдельном от quik, qvcl gui на 32bit lua
 
Цитата
Коля Маржин написал:
У меня до сегодня был прекрасный интерфейс к роботу на библиотеке qvcl, но в связи с тем что сегодня все квики только 64bit а qvcl там не работает, то было принято решение запускать gui на 32bit Lua отдельном от quik.


Всё запустилось и основной необходимый мне функционал работает (кнопочки жмутся, данные шлются в квик через файл), но весь код который после инициализации окна ShowModal не запускается пока окно не закроется - я не могу обновлять данные в окне автоматически (вслед за обновлённым файлом настроек окна). Если окно инициировать по Show и после него ставить вечный цикл с синтетическим sleep на основе ping (в неквиковом lua функции sleep нет) то окно зависает. Есть у кого-нибудь идея, как, не закрывая окно, после его инициализации сделать цикл типа функции main в квиковом lua из которого можно было бы менять настройки окна?  
1) попробуйте Coroutines;
2) если не поможет, то создайте второй поток.
Зависание QUIK
 
Цитата
Anton написал:
Идея с рекурсией не подтверждается пока, потестил с перезаказами ТВС следующим скриптом
Код
   local  run  =   true 
 local  tabid  =   nil 
 local  rowid  =   nil 
 local  counter  =   0 
 local  recursion_level  =   0 
 local  max_recursion_level  =   0 

 function   OnInit ()
   tabid  =   AllocTable ()
    if   0   =  =   AddColumn (tabid,  1 ,  'recursion level' ,  true , QTABLE_STRING_TYPE,  16 )  then 
       DestroyTable (tabid)
      tabid  =   nil 
      error( "AddColumn failed" )
    end 
    if   0   =  =   AddColumn (tabid,  2 ,  'counter' ,  true , QTABLE_STRING_TYPE,  16 )  then 
       DestroyTable (tabid)
      tabid  =   nil 
      error( "AddColumn failed" )
    end 
    if   0   =  =   CreateWindow (tabid)  then 
       DestroyTable (tabid)
      tabid  =   nil 
      error( "CreateWindow failed" )
    end 
   rowid  =   InsertRow (tabid,  -  1 )
    if   -  1   =  =  rowid  then 
       DestroyTable (tabid)
      tabid  =   nil 
      rowid  =   nil 
      error( "InsertRow failed" )
    end 
 end 

 function   OnAllTrade (v)
   recursion_level  =  recursion_level  +   1 
   counter  =  counter  +   1 
    if  recursion_level  >  max_recursion_level  then 
      max_recursion_level  =  recursion_level
    end 
    if  tabid  then 
       SetCell (tabid, rowid,  1 , tostring(max_recursion_level))
       SetCell (tabid, rowid,  2 , tostring(counter))
    end 
   recursion_level  =  recursion_level  -   1 
 end 

 function   OnStop ()
    if  tabid  then 
       local  t  =  tabid
      tabid  =   nil 
       DestroyTable (t)
      rowid  =   nil 
    end 
   run  =   false 
 end 

 function   main ()
    while  run  do 
       sleep ( 1000 )
    end 
 end 
  
Результат - уровень рекурсии стоит 1 как влитой. Кому не лень прошу повторить упражнения, может где двоечка хотя бы выскочит, тогда будем знать, что хотя бы в принципе такое возможно. Также можно попробовать понагружать OnAllTrade перед выводом в таблицу чем-нибудь. Вариант sleep(100) попробовал, загружает квик до почти зависания, но это и логично, надо бы чем-нибудь поинтересней.
зачем Вы данные всех сделок собираете в таблицу QLUA - это же тормозуха.
Собирайте в таблицу луа, либо в массив на C и будет вам счастье.
Использование памяти скриптами Lua
 
Цитата
Михаил Понамаренко написал:
Вчерашний тест, можно сказать, успешный: 54 тысячи заявок, 14 тысяч сделок, расчёт кода робота каждые 500мс, затраченной памяти 2Гб. Но главное - ни одного зависания. Всё очень быстро и точно (в сравнении с QPILE).
В реальной торговле в таком режиме использовать не собираюсь и затраты памяти будут не существенные. Поэтому вопрос не критичный, скорее для возможного улучшения работы.
Но это первый день краш-теста.
Очевидно, что у Вас неправильно написана программа.
Вы либо банально не даете работать сборщику либо плодите много мусорных объектов  как глобальные .
Для начала поставьте контроль занятой памяти и при размере больше заданного запускайте сборщик мусора.
Преобразование целого числа в строку в QUIK 8.8+
 
Цитата
Александр М написал:
Цитата
Не правильно, я вообще ничего не лепил и у меня преобразования не было, но я в коде исторически использовал "%.f", т.к. надеялся, что если преобразование типов случайно пройдет, то в строку не добавится ".0" в конце. Код .0 не добавлял, а вот сам номер изменил даже при преобразовании  целого числа в строку, о чем я и написал.
вот это  "%.f"  и есть преобразование из целого в вещественное.
В документации сказано: Стандартный Lua использует 64-битные целые (integer) и вещественные числа двойной точности (double 64-bit)
В итоге у Вас 64 битное целое не умещается в 64 битное вещественное, т к для мантиссы всего 53 бита
Проблема решается если целое число преобразовать в вещественное расширенной точности  (long double ),
но  луа не поддерживает данный  формат, а железо поддерживает. Поэтому если надо, то пишите свою функцию на API C.
Преобразование целого числа в строку в QUIK 8.8+
 
Цитата
Александр М написал:
В связи с переходом биржи мы дождались 19 знаков.

Уважаемые разработчики и коллеги, может кто подскажет, почему результат разный и что надо подставить в string.format, чтобы он стал одинаковый? Как вы понимаете, необходимо, чтобы Номер заявки или сделки в виде строки всегда был нормальным числом, идентичным самому числу.
Код
  a =  9952336732254970146 
 message ( string.format ( "%.f" ,a) .. " " .. tostring(a))  
Результат: 9952336732254969856 9.952336732255e+18
Код
  a =  1952336732254970146    
 message ( string.format ( "%.f" ,a) .. " " .. tostring(a))
  

Результат: 1952336732254970112 1952336732254970146
Код
  a =  9952336732254970146 
 message ( string.format ( "%.d" ,a) .. " " .. tostring(a))
  
Результат: "bad argument #2 to 'format' (number has no integer representation)"
Правильно я понял, что Вы где надо и не надо лепили к числам ".0"
В итоге получали переполнение разрядной сетки мантиссы, т к в отличии от целого числа на нее в 64 битах меньше места?
Ну батенька, надо учить мат.часть.
Преобразование целого числа в строку в QUIK 8.8+
 
Цитата
Александр М написал:
print(a)print(tostring(a))print(a+1)print(tostring(a+1))
сделал так:
а=9152336732254970146
print(a)
print(tostring(a))
---------------------
результат:
9152336732254970146
9152336732254970146
----------------
что не так?
Использование памяти скриптами Lua
 
Цитата
Михаил Понамаренко написал:
Сегодня выпустил своего простенького робота сеточника на демо-счёт. Пока трудится без капризов, но потребление памяти, с учётом, что робот практически не накапливает данные впечатляет. Мусоровоз приезжает систематически, но загружает не весь мусор.
Если хотите решение проблемы, то выкладывайте скрипт.
Телепатов на форуме нет.
Преобразование целого числа в строку в QUIK 8.8+
 
а можно подробнее про ошибку.
у меня Lua 5.3 работает корректно
вот пример:
a=1952336732254970146
print(a)
print(tostring(a))
print(a+1)
print(tostring(a+1))
-------
результат:
1952336732254970146
1952336732254970146
1952336732254970147
1952336732254970147
----------------  
что не так?
Потокобезопасные функции в Lua 5.3
 
Цитата
Anton написал:
По-любому все потоки в квике, привязанные к луа, будут шарить одну луа-машину и, таким образом, выполняться по очереди. Поэтому я не понимаю цели подобных изысканий. Ну, создали еще 100 потоков, получили 100 дополнительных переключений контекста, поймали и героически преодолели кучку косяков с синхронизацией. И в чем профит? Кроме, конечно, прокачивания скилла, тоже занятие не сказать чтобы вредное, если есть куда потом этот скилл продать.
По-моему Вы ошибаетесь.
VMLua (луа машин)  не одна, а одна+число скриптов.
Одна - в основном потоке, где будут последовательно вызываться все колбеки QLUA
и еще по одной на каждый скрипт (main - создает свою VMLua)
-------------------------------
В итоге колбеки QLUA вызываются в очередь, а потоки main могут работать параллельно.
Поэтому, если мы делаем копию получаемых данных, то их обработка может выполнятся параллельно.
------------------  
Но в отличии от запуска независимых задач, нет надобности перебрасывать все данные во все параллельные задачи.
В том то и суть параллельных потоков.
Если мы строит робота, который работает со множеством инструментов, то запуск отдельного скрипта (main) на каждый инструмент, позволяет нам организовать параллельную работу с инструментами.
При этом большинство модулей будет универсальными и будут запущены в единственном экземпляре.
-----------------
В существующем варианте QLUA  в каждом скрипте для различных инструментов надо повторять все колбеки QLUA .
В итоге мы получаем многократный вызов одних и тех же колбеков в различных скриптах.
----------------  
В моем варианте для 1000 инструментов будет один модуль обработки например ТТП
А в существующей версии QOUA  таких вызовов будет 1000 на каждое изменение ТТП  и все они будут вызываться последовательно.
В итоге получается ужас какой-то.
Потокобезопасные функции в Lua 5.3
 
Цитата
Anton написал:
Цитата
nikolz написал:
Дискуссия схоластическая
Есть такое.

Цитата
nikolz написал:
Проблема многопоточности и проблема синхронизации потоков - это синонимы.
Да, так. Надо пойти дальше и спросить, а в чем проблема синхронизации потоков. Она в синхронизации доступа к данным и только. У каждого потока есть свой (нативный) стек, поток также может выделить tls из кучи, и если он никуда больше не ходит, ему никакая синхронизация не требуется. Как только появляется какое-то разделяемое между потоками состояние, возникает проблема синхронизации доступа к нему. Посмотрим на примере. Берем два потока, совместно использующих один int. Если потоки лезут в этот int без синхронизации, имеем проблемы (даже int с точки зрения процессора не атомарен, атомарно можно его прочитать, но модифицировать уже нет). Защищаем int критической секцией. Все, проблем нет. Но если у нас два разделяемых int'а, появляется выбор: одна общая критическая секция на все разделяемое состояние или у каждого поля своя. Второй вариант это отличный способ огрести проблем: во-первых, появляется возможность дедлока, во-вторых, появляется проблема атомарности изменения обоих полей сразу. То есть лучше выбрать вариант раз с одной критической секцией на все разделяемое состояние, ценой более длительных блокировок  всех  потоков. В луа самом по себе вариант раз и использован, но есть нюансы*. А в квике получился вариант два, результаты которого в основном и вылезают то тут то там. Внутри квика это еще можно разрулить, зная, что и в каком порядке лочить, но как только к этой запутанной системе дан доступ внешнему кодеру через луа, открыт ящик пандоры, кодер завсегда придумает, как упорядочить свои обращения к состоянию так, чтобы повесить весь квик или получить неконсистентные результаты. Автор топика не раз просил арку дать возможность синхронизации из луа, но это, увы, не решит проблему, в квике нет одного общего лока на все, а  еще один лок  сделает только хуже.

Радикальный способ решения проблем - как раз приведенный в статье, межпоточное взаимодействие, по определению требующее синхронизации, локализуется в виде очередей сообщений, а каждый поток работает только со своим состоянием и ему никакая дополнительная синхронизация не нужна в принципе. Это еще не процессы (луа-то общий и нативный процесс тоже общий, хоть авторы и выбрали путающую терминологию), это просто собрали всю синхронизацию в одном месте и избавили конечного кодера от размышлений о ней. Как конкретно решили мне не нравится, но путь правильный.

Цитата
nikolz написал:
Проблемы такого решения хорошо известны.
Можно ссылок или ключевиков? Винда как-то работает на сообщениях и ничего страшного, даже порт завершения позже придумали, то есть вперли-таки сообщения в само ядро (и молодцы).


* Если посмотреть в сорцы луа, увидим прекрасную вещь: сам по себе интерпретатор всегда работает под локом ( пруф: поищите lua_lock /lua_unlock в этой функции ). То есть, если выполняется только луа-код без вызовов функций, он весь атомарен (и другие потоки ждут). Лок снимается только перед вызовом си-функции. При этом встроенные библиотеки луа тоже состоят из си-функций, поэтому лок может быть снят (и тут же захвачен снова библиотечной функцией) в непредсказуемых местах, что убивает-таки атомарность изменения состояния как целого даже в луа без квика, при этом средств синхронизации со стороны луа не предоставлено. То есть луа защищает консистентность своего состояния, но не консистентность состояния пользовательского кода, с точки зрения луа-кодера он в той же ситуации, в какой и без луа, вот тебе потоки и рули как хочешь. Поэтому и говорю, что проблема не луа-специфичная, проблема в ожиданиях от луа чего-то, чего он не дает, хоть в нем и есть lua_lock.
Возможно ваши рассуждения правильны, возможно нет.
Но это не имеет значение, так как решения проблемы нет, кроме как указанная вами ссылка - т е созданием изолированных задач.

Я достаточно подробно изучал  исходники луа,  что решить проблему много поточности в своих приложениях и ускорения обмена данными из луа в си.
кое что получилось, не утверждаю, что все.

Можно много рассуждать и строить правдоподобные гипотезы о том  , почему что-то не работает.
но это лишь трата времени на переливание из пустого в порожнее, если не доказано как это исправить.
Кто как решил вопрос уведомления о сделках?
 
и самый халявный вариант.
Создаем в облаке ORACLE бесплатный виртуальный сервер и ставим на нем например MQTT брокер.
В итоге можно реализовать обмен информацией по подписке.
Можно и любой другой вариант обмена информацией со своим компом с QUIK
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 28 След.
Наверх