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

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

Страницы: Пред. 1 ... 40 41 42 43 44 45 46 47 48 49 50 ... 72 След.
Вопросы Новичка
 
Цитата
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) покупаем SIM800L+USBUART adapter  - цена на али 2 доллара
2) берем карточку от любого оператора с самым дешевым тарифом и подключаем к USB.
3) на LUA через UART, с помощью AT команд, можем посылать SMS,  UDP и  TCP пакеты, голосовые сообщения.
описание полей ТТП, где взять полное и актуальное
 
Цитата
Дмитрий написал:
Цитата
nikolz написал:
 
Цитата
Дмитрий  написал:
Здравствуйте!
По названиям параметров ТТП, к которым можно обращаться с помощью функции getParamEx, иногда бывает трудно однозначно понять, что эти параметры означают и/или как рассчитываются их значения.
Подскажите, пожалуйста, где можно взять подробное и актуальное описание всех параметров, которые транслируются с Московской биржи?
Если оно есть на сайте биржи, то подскажите ссылку.
 Описание полей любой таблицы в т числе и ТТП  можно легко получить используя вывод через DDE сервер в excel. Для получения имен параметров надо установить флажок "Формальные заголовки"  С заголовками столбцов"  
Я имел в виду, что даже по русскоязычным названиям параметров из QUIK не всегда можно однозначно понять, что именно они означают.
было бы удивительно, если бы по названию можно было бы определить что это такое.
Безусловно, надо читать описание параметров в документации биржи. Но оно Вам надо?
Как бороться с неоднозначностью в заявках и сделках?, OnOrder(), OnTrade()
 
Цитата
Сергей написал:
Добрый день!

Погряз в рутине с заявками и сделками.
На соседних ветках тут уже были предложены решения. В частности,  от уважаемого _sk_ , например.

Но, блин, это ж надо операционную систему написать...

Кто как борется с неоднозначностями?

Например, прилетает мне сделка в OnTrade(). И я знаю наверняка, что прилетит еще её дубль, а может, и в третий раз сработает.
Как узнать, это просто дубль пришел или моя заявка последовательно разбирается частями? В отличие от OnOrder(), в OnTrade() нет поля остатка balance (что и логично). Есть только qty. И чем тогда отличается повторное срабатывание от нового на такой же объем? trade_num у них одинаковые. Все остальное (order_num, trans_id, ...) тоже. Заявка-то одна была.

В саму заявку тоже не очень посмотришь. Во-первых, порядок срабатывания OnOrder(), OnTrade() достоверно не предопределен. Во-вторых, там свои неоднозначности. Допустим, использую я move_order. Прилетает сделка, а заявка еще пришла, а если пришла в OnOrder() и "исполнена", то надо еще разобраться, что это означает: а) успела исполниться старая заявка до перестановки, б) успешно переставилась, в) исполнилась уже новая после перестановки.


Есть ли компактные решения менее 1000 строк? :)

Спасибо!
А что страшного в том, что прилетит дубль?
Храните сделки в таблице и обновляйте ее состояние.
Если прилетел дубль, то он ничего не обновит.
Не имеет значение сколько раз прилетит информация о сделке.
------------------------
Когда сделка завершена, то ее состояние "не активна"  и мы ее просто не замечаем
--------------------
В каждой сделке можно найти номер заявки которая ее создала
Таким образом сделка однозначно отслеживается по заявке которая ее создает  
вывести выставление заявки из функции main в отдельную функцию
 
Цитата
s_mike@rambler.ru написал:
Цитата
Imersio Arrigo написал:
 
Цитата
nikolz  написал:
Чтобы ускорить работу надо функцию выставления заявки запускать в отдельном потоке,
 А как это ускорит работу?
Никак
Ну если не можете запустить выставление заявки в отдельном потоке, то запустите все остальное в другом потоке.
Например , можно в отдельных потоках запускать алгоритмы принятия решений роботом для различных рынков (бумаг)
можно в отдельных потоках запускать любые функции, которые не связаны с основным потоком КВИК.
В отдельных потоках дополнительно к main можно запускать любые действия внутри колбеков и тем самым ускорять их исполнение.
-----------------  
Так как узким местом териминала КВИК является его хранилище, то, чтобы обеспечить параллельную работу потоков,
надо всю информацию, поступающую в терминал квик, дублировать в свои таблицы и файлы
и работать не с хранилищем терминала, а со своей базой данных.
--------------------
описание полей ТТП, где взять полное и актуальное
 
Цитата
Дмитрий написал:
Здравствуйте!
По названиям параметров ТТП, к которым можно обращаться с помощью функции getParamEx, иногда бывает трудно однозначно понять, что эти параметры означают и/или как рассчитываются их значения.
Подскажите, пожалуйста, где можно взять подробное и актуальное описание всех параметров, которые транслируются с Московской биржи?
Если оно есть на сайте биржи, то подскажите ссылку.
Описание полей любой таблицы в т числе и ТТП  можно легко получить используя вывод через DDE сервер в excel. Для получения имен параметров надо установить флажок "Формальные заголовки"  С заголовками столбцов"  
вывести выставление заявки из функции main в отдельную функцию
 
Цитата
Duke2 написал:
Evgenii, Main зациклен, просто в выдержку кода не попало зацикливание. Спасибо все равно
дело в том что поток колбеков и поток Main - это разные потоки.
Если функция выставления заявки будет работать в майн,
то это ничего не даст, кроме лучшей читаемости текста программы.
--------------------------
Чтобы ускорить работу надо функцию выставления заявки запускать в отдельном потоке,
а в цикле  майн проверять завершение работы этой функции.
-----------------
Если есть желание это сделать,
то рекомендую почитать книгу Дж.Рихтер Создание эффективных WIN-32 приложений с учетом специфики 64-разрядной версии Windows
Ускорение работы скриптов, предложение по развитию QLUA
 
Цитата
Anton написал:
Цитата
nikolz написал:
не надо отслеживать новые версии и исправлять то, что перестает работать
Это, конечно, важный плюс, спору нет. Но если один мейн рушится, что с остальными делать? Очевидно, тоже прибивать и завершать весь скрипт, т.к. очень сомнительно, что большинство скриптов следуют RAII (до предыдущей версии это было физически невозможно даже и никто не бухтел, т.е. буквально  никто  этим не морочился). В таком раскладе мультипликативно снижаем общую надежность скрипта, если (утрированно) надежность одного мейна 0.5 и всего скрипта тоже, то при двух таких мейнах надежность скрипта в целом уже 0.25.
Указанная Вами проблема легко решается.
--------------------------------
Дело в том, что в моем решении создание роботов разделяется на отдельные ,самостоятельные и не требующие нового программирования модули.
Ранее я уже намекал на такое решение.
Это решение легко представить, если ответить на вопрос -Чем отличаются роботы торгующие акциями друг от друга?
----------------------------
Они отличаются лишь торговым алгоритмом.
В моем варианте, я сделал модуль для работы кучу общих модулей - модуль для  стакана, модуль для  счета, модуль для сделок, модуль для заявок, модуль стопов и т д.
Все эти модули являются универсальными и одинаковыми для любого робота.
-----------------------------------
В итоге, разработка робота сводится к программированию лишь алгоритма принятия решения.
Этот алгоритм можно написать на более простом и близком к естественному языку.
----------------------------------
В итоге нет надобности изучать LUA, изучать QLUA.  
Надо изучать именно закономерности рынка и написать алгоритм состояний робота
и логику изменения этих состояний.
----------------------------------
В итоге любой буратино может легко реализовать свой гениальный алгоритм, как стать миллионером на поле чудес.
Тестирование робота на исторических данных в quik, Как построить график на основе произвольных данных
 
Тестирование робота на исторических данных в quik, Как построить график на основе произвольных данных
 
Цитата
Христиан написал:
В итоге решил сделать тестирование стратегий на C# и потом переносить алгоритм на lua
в квик на  луа тестирование стратегий работает очень медленно.
Более лучшим вариантом является амиброкер и связка его с QUIK.
Потокобезопасные функции в Lua 5.3
 
Цитата
Anton написал:
Цитата
nikolz написал:
если бы все было так просто, то проблему многопоточности в луа не поднимали бы на форумах  уже лет ..надцать.
Это именно проблемы многопоточности как таковой, а не многопоточности в луа. В приведенной статье тоже. Как раз автор пришел в конце к правильному выводу, асинхронность рулит. Надо только не забывать, что нынче практически все процессоры многоядерные, даже контроллеры многие, так что многопоточность все равно будет присутствовать, главное ее локализовать и не позволить ей разползтись по всему коду. Конкретно в квике уже отступать некуда, архитектура выбрана такая и трудно предположить, как ее можно обратно-совместимо поправить. Теперь только костыли лепить.

Цитата
nikolz написал:
Тоже решал эту проблему
Многие решали,  в том числе и основоположники . К сожалению, конкретно в их решении очереди блокирующие, эдакий qnx получился.

Дискуссия схоластическая, но замечу, что Вы путаете понятия
Проблема многопоточности и проблема синхронизации потоков - это синонимы. т е первое это есть второе.
Проблема именно луа а не многопоточности.
Как решать задачу синхронизации потоков в конкретном софте хорошо разжевано у Рихтера.
Но в луа проблема в том, что есть сборщик мусора и много сторонних библиотек.
--------------------------
Вы не внимательно прочитали статью, на которую ссылаетесь.
---------------------------
цитата: "В этой работе мы исследуем модель, основанную на выполнении потоков без общей памяти, которые используют передачу сообщений для синхронизации и общения."
Т е это фактически многозадачное решение, а не многопоточное.
------------------------------
и далее цитата:
"Связь между процессами Lua происходит исключительно через сообщения. Cвязь с передачей сообщений может быть медленнее по сравнению с общей памятью."
===============  
Т е упрощенно, запускаем несколько независимых VMLua как несколько задач, а потом пересылаем данные между ними в виде сообщений OC.
Проблемы такого решения хорошо известны.
 
Оптимальный способ остановки исполнения скрипта
 
Цитата
verder написал:
Каков оптимальный способ программно остановить исполнение скрипта на QLua?
Например, код диагностирует некую внутреннюю ошибку по своей логике, выкидывает message и сразу останавливает работу скрипта во всех потоках.
в main есть бесконечный цикл поставьте в нем переменную и присваивайте ей nil  при ошибке. В итоге скрипт завершит работу
getFuturesHolding - возврат Nil если не было сделок?
 
Цитата
Leonid написал:
Здравствуйте.

Я определения текущего количества фьючерсов в портфеле я использую функцию getFuturesHolding.
Обратил внимание, что если по тикеру ранее не было сделок, то функция возвращает Nil, а не 0 как я предполагал.
Если сделки ранее были, то количество бумаг отображается корректно.

Можно ли как-нибудь выйти из этой ситуации?
просто написать
local x=0;  -- текущее количество фьючерсов
if ( getFuturesHolding...) then x= getFuturesHolding...  end  -- читаем  текущее количество
Потокобезопасные функции в Lua 5.3
 
https://zen.yandex.ru/media/id/5d1e1629b4a58500acbc079a/mnogopotochnost-v-lua-moia-glavnaia-oshibka-...
Статус сессии.
 
Цитата
Kolossi написал:
Цитата
nikolz написал:
Есть очень простое решения проблемы статуса сессии.
Делаем раз - синхронизируем компьютер по серверу времени.  Это позволяет нам синхронизироваться с временем биржи с погрешностью не более 0.01 сек
Делаем два - пишем константы начала и конца сессий
Делаем три - где надо и не надо просто сравниваем текущее время с константами и решаем какое сейчас состояние сессии без каких либо кодов с биржи
------------------------
Самое смешное в том,  что биржа(брокер)  свои коды формируют точно так же.
Как для автомобиля - крутить рукоятку если стартер не заводит автомобиль - простое решение ). Я перешел к пользованию статусом сессии именно потому, что однажды, пользуясь простым решением, забыл перевести сезонное время (я живу в стране где его надо переводить) и потерял прилично денег на этом.
полагаю что потеряли вы не по причине что забыли перевести время.
это лишь вариант самоуспокоения.
Если Вы включили комп позже начала сессии, то никакие сигналы Вам не помогут.
и статус сессии здесь не причем.
Конечно решать Вам, я лишь изложил свой опыт решения данной проблемы
Потокобезопасные функции в Lua 5.3
 
Цитата
Anton написал:
Цитата
nikolz написал:
Если это особенности VMLua
Что я выше описал, это на стороне qlua.dll, то есть аркино производство. В самой lua53.dll правки если и есть, то крайне незначительные, практически все строка в строку ложится на сорцы луа из репозитория, как выше из разбора дампа видно.

Цитата
nikolz написал:
Проблема многопоточности в луа - это проблема луа.
Луа дает lua_lock/lua_unlock и на этом его проблемы с многопоточностью закончены. Можно поспорить, здорово ли, что в некоторых функциях 5.3 вытащили часть обращений к стеку из-под лока, если говорить о проблемах луа. Но вот как сделаны эти самые локи (и не только), это уже вопросы к арке.
Ва заблуждаетесь,
если бы все было так просто, то проблему многопоточности в луа не поднимали бы на форумах  уже лет ..надцать.
Вот, например, результат попытки решения критическими секциями (look, unlook)
и таких воплей в инете много.
--------------------
Тоже решал эту проблему, но не уверен, что нашел окончательное решение .
Потокобезопасные функции в Lua 5.3
 
добавлю свои пять копеек.
Если это особенности VMLua то разработчики ничего исправлять не будут.
VMLua написана не ими. Они лишь встраивают ее в КВИК и сделали dll интерфейса на луа с хранилищем терминала и обменом с сервером КВИК.
---------------------
Проблема многопоточности в луа - это проблема луа.
Есть различные решения этой проблемы, но они никак не связаны с КВИК.
Статус сессии.
 
Есть очень простое решения проблемы статуса сессии.
Делаем раз - синхронизируем компьютер по серверу времени.  Это позволяет нам синхронизироваться с временем биржи с погрешностью не более 0.01 сек
Делаем два - пишем константы начала и конца сессий
Делаем три - где надо и не надо просто сравниваем текущее время с константами и решаем какое сейчас состояние сессии без каких либо кодов с биржи
------------------------
Самое смешное в том,  что биржа(брокер)  свои коды формируют точно так же.
Ошибка в индикаторе при увеличении таймфрейма
 
Добавлю свои пять копеек к решению проблемы.
-----------------------------------------
Обычно такая проблема возникает,  если есть массивы, которые определяются лишь при старте индикатора.
В результате, при смене тайма, они остаются не пустыми.
В итоге нарушается индексация и возникают отсутствующие элементы
-------------------------
Проблему решаем так:
----------------------------
Создаем специальную функцию инициализации всех переменных индикатора.
-----------------------
Эту функцию вызываем в двух местах -
в  Init()  - здесь можно и не вызывать, но делаю это, так как Init как бы для этого создана. Вызывается в индикаторе один раз при запуске и не влияет на скорость исполнения.
и в onCalculate() при индексе равном 1
Например так:
--------------------------------
function OnCalculate(k)
if k==1 then
-- вызываем функцию инициализации
end
--------------------------
Если будете выполнять данное правило, то проблем при переключении тайма не будет.
Работа с OnOrder
 
Цитата
Вадим написал:
Кажется я понял, что колбэк функция возвращает два состояния заявки - старое и новое

Заявка на Покупку
Дата                                     Номер                  Флаг Dec/Hex/Bin
Thu Aug 13 21:55:00 2020: 26203598248162  25 / #19 / 00011001
Thu Aug 13 21:55:00 2020: 26203598248162  25 / #19 / 00011001
Thu Aug 13 22:12:43 2020: 26203598248162  25 / #19 / 00011001
Thu Aug 13 22:12:43 2020: 26203598248162  26 / #1A / 00011010

Заявка на Продажу
Дата                                     Номер                  Флаг Dec/Hex/Bin
Thu Aug 13 21:56:27 2020: 26203598274028  29 / #1D / 00011101
Thu Aug 13 21:56:27 2020: 26203598274028  29 / #1D / 00011101
Thu Aug 13 22:24:21 2020: 26203598274028  29 / #1E / 00011101
Thu Aug 13 22:24:21 2020: 26203598274028  30 / #1E / 00011110

В случае первого появления заявки оба состояния новые
В случае последующих изменений старое+новое состояние
Воспринимайте колбек, как сигнал на бесчисленное множество событий, из которых Вам надо очень малое число.
Поэтому не надо пытаться их все понять.
---------------
Надо всегда ставить фильтр лишь того, что нужно.
Остальное - игнорировать.
В реалии  событий может быть хоть тысяча, но вам нужно лишь два.
Вместо того , чтобы выяснять что это за событие, определитесь что же конкретно нужно Вам.
-----------------------
В итоге роботу будут безразличны  все события в мире, кроме тех, которые нужны Вам.
Нужен скрипт на LUA, Доходности облигаций по ask и bid из стакана
 
Сама постановка задачи ассоциируется примерно с таким: Надо на автомобиль поставить ракетный двигатель.
Даже страшно представить что будет с таким хотелкиным, если ему это сделать ,
но скорее всего он и сам не знает, зачем это реально надо.
Синхронизация getNumberOf и getItem
 
Цитата
Сергей написал:
Прежде всего, я нигде, вроде, не просил написать скрипт на Луа, или каком-либо еще языке, достаточно было изложить общий принцип организации выборки. Прямой, обратный, с использованием специальных функций, что-то еще. По существу последнего ответа, спасибо, хоть какая-то конкретика, по крайней мере понятно, как организована сортировка в таблице позиций. Уж, как это обработать в скрипте, дело действительно индивидуальное.
сталкивался с такой ситуацией. Ее исключить можно если контролировать размер таблицы.
--------------
Полагаю, что лучшим способом, является не лазить постоянно в хранилище терминала,
так как это очень накладная операция, а создавать свои таблицы
и отслеживать в них появление и удаление строк в соответствии с колбеками.
Страницы: Пред. 1 ... 40 41 42 43 44 45 46 47 48 49 50 ... 72 След.
Наверх