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

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

Страницы: Пред. 1 ... 44 45 46 47 48 49 50 51 52 53 54 ... 72 След.
Нужна помощь в прочтении кода на LUA
 
полагаю, что это либо разновидность скользящего,
либо зигзага,
с заглядыванием в будущее.
Поделитесь, кто как отслеживает факт "готовности свечи"?
 
Цитата
Павел Bosco написал:
Если кто пользуется CreateDataSource и свечами из него, как вы решаете задачу, чтобы максимально быстро забрать самую последнюю **законченную** свечу?
Имею в виду, в datasource поседняя свеча всё время меняется, как узнать что она уже "точно сформировалась"?
Есть ли такая возможность? Если нет, может нам попросить разработчиков наконец-то сделать её?
все очень просто.
синхронизируйте время компа по атомным часам.
свеча закрывается всегда точно по указанному кванту времени и выдается "задним числом"
т е цена закрытия свечи (close) это цена последней сделки время которой не больше времени закрытия свечи.
т е как пропикало закрыть свечу - лови подарок от сервера.
можешь не ждать а вычислить сам - можешь даже обогнать.
Пример заявки тэйк-профит и стоп-лимит
 
Цитата
AlexanderKk написал:
дайте пример тэйк-профит и стоп-лимит
transaction = {
ACCOUNT=.....
}
к сожелению, в документации не нашёл
см документацию по квику, а не по QLUA
Lua и dll на C
 
Цитата
Let_it_go написал:
Написал функцию так, чтобы цикл крутился внутри dll:
Код
  static int forLua_AddCircle(lua_State  * L) {
   double d1  =  luaL_checknumber(L,  1 ); //с чего начинать цикл
   double d2  =  luaL_checknumber(L,  2 ); //количество итераций
   double r;
   double i;
    for  (i  =  d1; i  <  =  d2; i +  + )
   {
      r  =  i  +  i;
   }
    return ( 1 );
}  

Код
  package.cpath  =   "C:\\runfast.dll" 
 require ( "runfast" )
iterations =  100000000 
 function   main ()
   start =  os.clock ()
    for  i =  1 ,iterations  do 
      r  =   runfast.AddTwoNumbers (i, i)
    end 
   finish =  os.clock () - start
    message  ( "C dll:"  .. tostring(finish),  1 )
   start =  os.clock ()
    for  i =  1 ,iterations  do 
      r  =  i + i
    end 
   finish =  os.clock () - start
    message  ( "Lua:"  .. tostring(finish),  1 )

   start =  os.clock ()
   r  =   runfast.AddCircle ( 1 ,iterations)
   finish =  os.clock () - start
    message  ( "C dll circle:"  .. tostring(finish),  1 )   
 end   
Результат:


dll с циклом всех победила.
разница в том что в lua данные в виде структур
если хотите оптимизировать луа скрипты, то следите чтобы типы не смешивались.
-------------------
если хотите ускорить вычисления то сделайте столько протоков сколько у вас ядер ,а ядер поставьте по числу инструментов
--------------------
если хотите  ускорить торговлю на бирже,  т е сделать HFT робот, то откажитесь от квика и переходите на прямое подключение к бирже.
-----------------------
Вы не там ищите ускорение,
так как тормоз в каналах связи,
в очередях у сервера брокера
и задержках рассылки биржевой информации сервером брокера
 
Lua и dll на C
 
Цитата
Лже-Дмитрий написал:
Подскажите, пожалуйста, какие накладываются ограничения в QLUA по сравнению с обычным LUA 5.1?
Имею в виду - кол-во local переменных, кол-во и размер пользовательских таблиц, кол-во модулей, размер модулей, и т.д.

Поясню, в чём проблема.
кусок кода, вызываемого по нажатию кнопки из моей .dll:
...
if (code_id == 'process_get_order_list')
then
  -- local test_tbl_ = {}
  local str_tbl_ = {}
  str_tbl_['000'] = '111'
  str_tbl_['111'] = '000'
  return 'ok',str_tbl_
end

Код стабилен. Если раскомментировать строку  'local test_tbl_ = {}' , QUIK рушится с exception'ом, либо сразу после вызова, либо при попытке завершения работы скрипта. Понятно, что сам по себе такой код
безвреден и крешиться не может, но программа разрослась, состоит уже из 8 модулей скучей функций и таблиц.

Отсюда и вопрос: каковы ограничения по сравнению с обычным LUA 5.1? Дело ещё в том, что на мной написанном имитаторе (Borland C++ 6.0 с/без Code Guard, LUA 5.1) тот же самый код стабилен.
Ваш вопрос не корректен.
QLUA - это библиотека,в которой функции для доступа к хранилищу данных на терминале и посылке приему сообщений от сервера брокера.
для того чтобы функции этой библиотеки могли работать   в квик внедрена VM LUA 5.1  
Таблица с ценами бумаг из индекса МосБиржи, Готов оплатить скрипт на Lua, который бы строил таблицу с ценами бумаг из индекса МосБиржи (включая исторические данные о цене)
 
Цитата
Ilya написал:
Мне нужен будет исходный текст.
могу сделать по подробному тех заданию с указанием вами цены и сроков.
С исходным текстом будет на порядок дороже.
Тайминг функциональности QUIK из луа, как правильно замерить
 
Цитата
BlackBoar написал:
Цитата
   s_mike@rambler.ru написал:
ваш запрос к терминалу на получение стакана ставится в терминале в очередь на обработку. И наверняка с низким приоритетом.
Кстати. Я на самом деле не могу ничего возразить ибо понятия не имею что в недрах терминала происходит.
Но вот тот факт что время отклика почти прямо пропорционально размеру стакана наводит на мысль что основные накладные расходы таки при его формировании.
Мысль неконструктивная, способа послиять на формирование стакана не видно. Просто любопытно.
относительно стакана могу предположить следующее
Так как данные стакана с биржи передаются в виде изменений стакана, то в терминале стакан хранится очевидно в виде списка.
Вот из этого списка и формируется таблица луа.
--------------------------
Ваши замеры близки к истине. Попробуйте еще измерить для сравнения время пустого цикла на луа
-----------------------
Но эти замеры мало что дают для оценки быстродействия робота.
Проблема в том что данные с сервера QUIK приходят блоками в которых собирается инфа за некоторое время.
Возникает вопрос на сколько реально полученные данные запаздывают от их появления на бирже.
Собственно успешность HFT робота и зависит от этого запаздывания.
Попробуйте оценить это время и сравнить его со скоростью обработки полученных данных.
% lua hello.lua
 
в винде запустите cmd
и в нем вызывайте lua
% lua hello.lua
 
Цитата
Let_it_go написал:
Хочу систематизировать знания по Луа, читаю книгу Иерузалмиски
Сразу какие-то непонятки:


у меня возникает такая проблема. Почему?


файл лежит в корне луа там где lua.exe

Для работы с луа советую поставить SciTE.
Это текстовый редактор, который написан на луа.
Позволяет легко писать и запускать скрипты на луа и не только.
Есть сборки SCiTe со встроенным отладчиком.
Защита luac-кода от декомпиляции
 
Я вообще сомневаюсь, что на форуме есть у кого-то действительно работающий робот с очень ценным алгоритмов, который надо шифровать.
Поэтому не заморачивайтесь этой проблемой раньше, чем ваш робот проработает год самостоятельно.
Ну а впаривать буратинам игрушечных "прибыльных" роботов можете без шифрования.
Защита luac-кода от декомпиляции
 
Цитата
Денис написал:
Цитата
Николай  Камынин   написал: Когда-то  делал защиту для скриптов на QLUA на уровне запуска задания и подключения dll. Такую защиту снять сложно.
Посмотрите в эту сторону.
Николай  Камынин  , спасибо за совет! Такая защита, с dll, уже реализована. Но я понимаю, что при долгой и кропотливой работе данный скрипт взломать возможно.
Хотелось бы усилить защиту на уровне lua-кода, пусть даже обфусцированного. Чтобы его нельзя было привести к исходному коду.
Нужно понять, какую lua-структуру не могут восстановить декомпиляторы? Есть мысли?
Хм, Вы способны взломать 128 бит код защиты?
тогда просто поставьте ключ в 1024 бит.
Я про такую защиту вам написал.
Вы ее уже реализовали?  
Нашел баги, если вы будете каждые 10 мск пересчитывать число строк в таблице
 
Цитата
Boris Litvinov написал:
Цитата
Алексей Ч   написал:
Алексей Ч
Что та похожее и происходит. То что в моменте, а этого для бота более чем достаточно, транслируют пустую таблицу. При этом идет торговая сессия это очевидно! То что это происходит на серверах КВИК а не других платформах, так же доказано!
Повторюсь, если это кому то будет нужно, и для тех кто пишет подобные ТС. Этот костыль придется прикручивать не зависимо от языков и приводов. Иначе  ваши позиции будут скидываться, и перенабираться вновь!
Проблема второй день теста, решина! Но то что speep 2000 давит при нулевой позе фьюча и по другому решить не смог это печаль!
Но не не печальнее пере набора позы!
Всем спасибо!
давно это было, но я не использую sleep в потоках в том числе и в main QLUA.
попробуйте использовать ожидание событий в потоке а не sleep.
подробнее, как это сделать см книгу Джеффри Рихтер( для тех, кто не знает)
lua наследование, lua ооп
 
https://habr.com/post/182018/
Глобальные таблицы Lua на C++
 
Цитата
Let_it_go написал:
На stackoverflow ответили:
Надо использовать map
Код
   # include  < iostream >  # include  < map > 
 # include  < string > 

int main ()
{
  std::map < std::string, int >  period_muvinga;

  period_muvinga[ "GAZP" ]  =   23 ;
  period_muvinga[ "SBER" ]  =   19 ;
  period_muvinga[ "GMKN" ]  =   20 ;

  //  Iterate over all the key,value pairs  in  map
  //
   for  (const auto  &  p: period_muvinga)
    {
      // Extract key from pair
      std::string ticker  =  p.first;

      // Extract value from pair
      int period  =  p.second;

      std::cout  <  <  ticker  <  <   " = "   <  <  period  <  <  std::endl;
    }
   return   0 ;
}  

Для других целей - более сложных - мне остаётся не понятным в какой части dll объявлять этот массив.
Замысел вкратце.
Объявить массив map с названием average_bid. Вопрос где это делать?
Ключи массива - тикеры акций. объявляются вместе с массивом.
Значения массива - векторы, накапливающие биды за 100 колбеков OnQuote. Это я умею. Цель - посчитать среднее арифметическое бидов за 100 приходов колбека.
---
Использовать OnInit пока не хочу, потому что у меня в нём и так уже в Луа 50 строчек кода, объявляющих таблицы и переменные.
Вы удивитесь, но с большой вероятностью у вас обработка таблиц будет медленнее, чем в луа.
Причина тому в индексе У вас - стринг, а в луа хеш.
lua наследование, lua ооп
 
https://habr.com/post/259265/
Нашел баги, если вы будете каждые 10 мск пересчитывать число строк в таблице
 
Вы не поверите, но понять что же Вы нашли я не смог.
-----------------------
Давайте сначала отделим мух от котлет
--------------------
1) что такое 10 мск (мск - это что?) московское время международный стандарт или что-то другое?
--------------------------
2) Вы очевидно знаете, что для луа официально есть только C (CИ ) а не С++ и тем более не С#.
Поэтому для начала либо рассказывайте какие обертки вы применяете и как вы их проверили на глюки.
-------------------------------
3) Вы очевидно знаете, что данные приходят блоками При этом могут приходить и пропущенные строки.
Тот факт что у вас на тесте работает а в реале глючит намекает на такую возможность
-------------------------------------
4) Вы знаете, что в интернете все приходит асинхронно и потом склеивается пакет
-------------------------------
5) Вы знаете, что на компе используется алгоритм Нейгла и он может вам создавать плавающие задержки
-------------------------------
6) Вы знаете, что квик вообще работает на теме минимум 10 мс (миллисекунд) Этот тайм обычно используется как минимальный квант для задач.
------------------------------
Если Вы этого не знаете, то примите к сведению
И расскажите медленно что Вы и как тестируете и почему решили что это баги КВИКА а не вашей программы.
Поместить колбек в dll
 
Цитата
Let_it_go написал:
Цитата
Алексей   написал:
OnQuote()
   runfast.OnQuote()
end
Спасибо за ответ, но этот вариант не подходит. При каждом срабатывании колбека скрипт будет обращаться к dll. Луа в КВИК встроена настолько кривобоко, что это получается долго.
Луа:
Код
      for  i =  1 , 10000000   do      
          r  =  i + i
    end   
Луа+dll на Си++
Код
      for  i =  1 ,iterations  do 
      r  =   runfast.AddTwoNumbers (i, i)   
   end   
Второй код работает в 3,6 раза медленнее, чем первый из-за постоянного перекидывания данных из Луа в Си.
Ваш вариант предусматривает те же самые задержки.

Мне нужно колбек OnQuote полностью упаковать внутрь dll. Вызвать его один раз, и потом он крутится только внутри dll
вообще-то это прикольно.
Вы написали пример из разряда "как не надо писать программы"
В вашем примере операция сложения занимает промерно 1% всего времени
Если вы решили переносить в си
то очевидно что надо переносить весь цикл
в си вместо сложения использовать сдвиг
тогда и будет быстрее.
---------------------------------------
Что же касается вызов колбека в СИ то это не очень вам поможет так как это в квике делается достаточно эффективно.
Надо оптимизировать обработку стакана, так как это работа с таблицами поиском в них заменой и уделением И вот там Вы можете существенно ускорить.
-----------------------
 
Стек при 2 функциях (dll)
 
риск возникает при одновременном обращении потоков к одним и тем же данным да и то если эти данные изменяются потоками.
Возникновение таких проблем полностью зависит от того, как Вы написал эти библиотеки.
Поэтому никто кроме Вас не знает - есть у Вас эти риски или нет.
Судя по вопросам - скорее есть чем нет.
Стек при 2 функциях (dll)
 
Цитата
Let_it_go написал:
Уточнение. Функции длл-библиотеки могут вызываться из разных потоков квика, то есть есть риск одновременной работы с ними, а значит и со стеком
В одновременном использовании кода библиотек потоками риска нет
Защита luac-кода от декомпиляции
 
Цитата
Денис написал:
Здравствуйте!
Мне встречались luac-скрипты которые не приводятся к исходному виду декомпиляторами. Декомпиляторы просто формируют новый пустой lua-файл.
При этом, обычные запакованные luac-скрипты этими же декомпиляторами (6 штук) довольно точно распаковываются.

Вопрос простой, что нужно добавить в lua-код чтобы стандартные декомпиляторы не смогли его разобрать? Или, как сделать так, чтобы декомпиляторы возвращали пустой файл, вместо исходного кода?

P.S. Я слышал что декомпиляторы не умеют работать с динамическими таблицами. Возможно, в этом кроется решение.

Эксперты, помогите пожалуйста решить задачу.
любую защиту можно снять.
Когда-то  делал защиту для скриптов на QLUA на уровне запуска задания и подключения dll. Такую защиту снять сложно.
Посмотрите в эту сторону.
Опционный робот на LUA под Квик, Простой опционный робот
 
Цитата
Дмитрий написал:
Добрый день!
Не подскажите где можно найти опционного робота на Луа под Квик.
Алгоритм след-ий.
Выбираешь Инструмент, дату экспирации.
Прописываешь роботу уровень, соответственно выбираешь Пут или Колл, и он на этом уровне покупает заявку по стакану (желательно что бы был стоп по стакану не более стольких то пунктов.).
Так же выбор купить или продать фьюч. для хеджа.
Ну и что бы можно было закрыть позицию.

В интернете что-то не нашел подходящего.
В интернете есть лишь игрушки для буратин, но буратины в опционы не лезут,
так как даже они понимают, что в опционах им будет кирдык.  
Поэтому разводящие таких роботов не рекламируют и бесплатно не раздают, так как нет выгоды.  
Коммерческий вопрос., Сколько стоит написать скрипт?
 
Цитата
Иван написал:
Здравствуйте. У меня вопрос совсем не технический. А вот сколько это стоит написать скрипт? И вообще - по какому принципу оценивается стоимость программы? Кто знает - подскажите пожалуйста. Заранее всем спасибо.
Ответ на Ваш вопрос очень простой.
Ровно такой же, как ответ на вопрос: -Сколько стоит автомобиль?  
Срабатывание OnQuote
 
Цитата
Let_it_go написал:
Цитата
Николай  Камынин   написал:
----------------
Оптимизируйте прием данных стакана в колбеке тогда не будет видимого торможения
под оптимизируйте вы что имеете в виду?
-переписать логику на Си
-перенести логику в main
-оптимизировать расчёты внутри колбека или что то другое?

Я уже многое сделал, например стал отфутболивать слепки стакана, если изменения произошли в дальних котировках. Мне требуются только ближайшие. Плюс я думаю просто игнорировать избыточные слепки, которые являются излишними и не успевают быть обработанными. Это временно решит проблему пока я напишу dll под Си.
Рекомендую хронометрировать вашу программу обработки стакана а после этого решать что и как изменить.
Возможно Вам достаточно использовать лучшую цену?
Вы измерьте время прихода данных и время их обработки.
После этого Вы возможно вообще измените свой подход к обработке данных.
И зачем Вам 60 стаканов.Если Вы делаете HFT то ваш робот по сравнению с профессиональными будет как черепаха в сравнении с самолетом.
А если Вы делаете обычного робота то стаканы практически бесполезны.
 
Срабатывание OnQuote
 
На ваши Вопросы вы не получите ответов так как много нюансов
Рекомендую сделать тестовую систему и определить реальные задержки данных
Для этого синхронизируйте часы компа с атомными часами и измеряйте время прихода сделок с их временем совершения на бирже
Тогда увидите истину.
------------------------------------------
Истина в стакане..
Срабатывание OnQuote
 
Цитата
Let_it_go написал:
Возможна ли такая ситуация:
в стакане произошли два изменения одновременно, и колбек OnQuote сработал только один раз?
Или раз заявки идут одна за другой очередью, то будет гарантированно два срабатывания колбека?
С биржи стакан приходит лишь то что изменилось Но QLUA вам отдает весь стакан т е после его коррекции
Данные с сервера КВИК приходят к Вам блоками
Поэтому Вам кажется что  все поступает быстро
На самом деле в одном блоке могут быть сделки и 1 мс назад и 20 мс назад.
--------------------
60 стаканов - это запаздывание реальное от 100 до 1000 мс  без учета запаздывания обработки на вашем компе
----------------
Оптимизируйте прием данных стакана в колбеке тогда не будет видимого торможения
collectgarbage
 
Цитата
Let_it_go написал:
Добрый день.
Пытаюсь победить странную проблему с роботом. После того как робот поработает час, заявки на биржу улетают очень долго: между отправкой и получением реплая до 5 секунд. Стоит выключить робота и включить по новой, как проблема решается, заявки улетают быстро.
---
В функции main стоит collectgarbage
Она чистит мусор везде? Может быть нужно поставить её в другие колбеки, которые открывают новый поток?
У меня из трудоёмких колбеков работают OnQuote (60 инструментов) и OnAllTrade.
Рекомендую не использовать сборщик явно и особенно в main если памяти хватает. Частый запуск его будет кушать ресурсы процессора
OnQuote вешает квик
 
Цитата
Let_it_go написал:
У меня сейчас стоит windows server 2003. Он потребляет меньше всего ресурсов.
Может быть перейти на Windows server 2016? У него системные требования выше, но наверное и быстродействие выше. За 13 лет в плане скорости могли сделать большой шаг вперёд.
Для начала сделайте следующее.
1) уберите лишние параметры и проверьте отключение опционов.
т е в окне настройки посмотрите сколько инструментов и сколько параметров Вы выбрали (указано явно количество)
2) Выгрузите все лишние приложения и службы (проверьте сколько свободной памяти при работе квик и какая загрузка процессора)
3) Установите в параметрах КВИК минимальное время отклика (10 мс)
4) Отключите алгоритм нейгла
5) При работе КВИК делайте следующее
1) выгружайте браузер
2) не запускайте другие приложения
3) сворачивайте окна, которые не смотрите. Если хотите ускорить квик, то сверните его.
Сворачивайте стаканы если хотите ускорить их обработку.
------------------------
Не понятно почему у вас стоит сервер. Посмотрите как он загружен другими задачами.
--------------------------------
Напишите обработку данных от стакана на СИ Можно конечно и на СИ++, но для луа арi для СИ. а использовать обертки лишь замедляет работу.
-----------------------------
Можно сделать в квике лишь прием данных а обработку вынести в отдельные задачи на СИ или С++.
-----------------
В квике время обработки стакана можно уменьшить примерно в 10-100 раз если написать обработку на СИ в виде DLL.
---------------
По-возможности не используйте обращение к хранилищу КВИК, а храните все необходимые Вам данные в специально выделенных массивах.
----------------
Я например все храню в отдельных таблицах луа, либо в двоичных массивах.
===================
Но хочу заметить следующее.
КВИК - это изначально терминал для подачи поручений брокеру, а не платформа для создания HFT роботов
Поэтому априори Вы должны усвоить что на квике Вы получаете информацию которая запаздывет относительно биржи на 100-500 мс.
Ваши заявки в пики обрабатываются в очереди на сервере броккера со скоростью примерно 1000 транзакций в секунду.
Т е если у брокера на каждый сервер несколько тысяч клиентов, то Ваша хаявка будет стоять в очереди несколько секунд.
-----------------------------
Поэтому реально можно делать робота который по инструменту может послать примерно до 10 поручений в секунду с запаздыванием примерно на 0.1-0.2 секунды относительно реального времени событий на бирже (и это еще будет хорошо)
OnQuote вешает квик
 
Цитата
Let_it_go написал:
Здравствуйте. Последние дни на рынке паника. Активность резко возросла. Я в КВИКе подписываюсь на стаканы 5 фьючерсов и 50 акций. Обрабатываю их в OnQuote. В июне-июле не было никаких проблем из за вялого рынка. Но в среду-четверг-пятницу пошла жесть. КВИК подвисает намертво. Пришлось отказаться от акций, оставил два фьючерса Si и RTS, но даже их пришлось разнести по разным КВИКам. Два фьючерса в одном скрипте в одном КВИке всё равно вешали КВИК. Сейчас на 1 квик у меня по 1 скрипту, в котором 1 инструмент. Благодаря этому удалось вернуться к работе.
---
Прошу дать совет, как решить эту проблему.
1. Я уже перенёс из OnQuote много функций, которые теперь обрабатываются в main, но там по прежнему остаётся обработка таблиц, несколько циклов и немного математики. Время, за которое проходит одна итерация внутри OnQuote около 20 миллисекунд.
2. На виртуалке поставил более быстрые ядра. Сейчас конфигурация такая:

Обидно, что даже в моменты пиковой нагрузки загрузка процессора даже близко не подходила к 100%, то есть были свободные ядра. При этом более быстрые ядра не решили проблему, квик всё равно подвисал.
3. Работает сборщик мусора луа, проблем с памятью не наблюдалось.
---
Можно ли OnQuote направлять на разные ядра процессора? например с помощью модуля многопоточности луа LuaLanes?
---
Можно ли запустить в одном скипте несколько OnQuote? В один принимать фьючерсы, в другой акции например?
---
Буду благодарен за любые советы и подсказки.
обработка стаканов - это самая затратная операция в КВИК.
На все ваши вопросы кратко можно ответить - Можно, но все зависит от Вашего уровня знаний
1) программирование потоков под виндой
2) владение API C для луа
3) умение программировать на СИ
------------
В качестве примера могу кратко рассказать что делал я.
1) Я реализовал каждый колбек в отдельном скрипте луа.
Это позволяет
1) использовать минимум колбеков вне зависимости от числа роботов
2) фактически запустить столько потоков (main) сколько скриптов
3) колбеки QLUA работают в одном потоке и их распараллелить невозможно. А вот дальнейшую работу с полученными данными я делаю в различных скриптах. А каждый скрипт - это отдельный поток.
4) Существенно ускорить можно если правильно организовать обработку данных. Ошибка многих любителей писать роботов в использовании циклов и постоянной обработки истории. Это надо и можно избежать.
Примерно так.
Импортировать часть функций
 
Цитата
s_mike@rambler.ru написал:
Цитата
Let_it_go   написал:
Добрый день.
При торговле я использую огромную библиотеку функций на луа. Там около 3000 строчек, десятки функций. Далеко не все они нужны.
Я эту библиотеку подключаю с помощью
Код
    require  "TradeLib"     
Можно ли импортировать не все функции, а только часть?
Наподобие того как в питоне делается:
Цитата
fr om TradeLib import (SendLim it, GetPrice)
И второй вопрос. Если я загружаю всю эту библиотеку в 3000 строчек, то происходит ли чрезмерная загрузка памяти, замедление работы или ещё что-нибудь плохое? Может быть не стоит и волноваться?
Спасибо.
Неиспользуемые функции занимают память и практически не влияют на скорость исполнения. Считайте, чтo 3000 строк это 100 килобайт в каждом скрипте - мелочи, нет смысла волноваться.
В действительности все не так однозначно.
Луа функции описываются в таблице gFunctionTable[] в конце библиотеки.
Если функций 3000 и они все одной библиотеке то и таблица будет содержать 3000 строк описания функций.
Полагаю, что  запуск функций может потребовать их поиск в этой таблице.
А это уже не только память но и время.
not enough memory
 
Цитата
Let_it_go написал:
Робот работает на виртуалке Windows Server 2003
Я обрабатываю луа-скриптом таблицу с гигантским количеством полей (запись слепков стакана за 10 дней и более).
Робот при добавлении очередного дня-таблицы со слепками в общую огромную таблицу вылетает с ошибкой
not enough memory, хотя оперативной памяти хватает.
Я добавлял на виртуалку ещё 1 ГБ опер.памяти, чтобы наверняка хватало, но всё равно скрипт вылетает с этой ошибкой.
Гуглил эту ошибку в интернете, нашёл такую ветку с обсуждением этой темы:
https://github.com/minetest/minetest/issues/2988
Нашёл там такую фразу Lua has no problem consuming 2GiB, but LuaJIT bails at 1GiB.
Вот:

Я, увы, не сильно понял в чём дело и что такое LuaJIT. Но у меня вылетает скрипт как раз на 1 гигабайте оперативки.
Прошу подсказать решение проблемы.
Также я не понял что это за код, который советует использовать комментатор. Он превращает числа в строки? Но как я это могу применить у себя?
Заранее спасибо.
У Вас явно плохо написан скрипт.
-----------------------------
Вот несколько советов :
------------------------------.
1) перед загрузкой очередной порции данных поставьте collectgarbage()
-------------------------------------
2) Возможно у Вас не хватает памяти на диске
--------------------
3) измените формат хранения данных
------------------------
4) грузите в память лишь то что обрабатываете,
остальное стирайте из памяти сборщиком мусора
---------------
5) сделайте обработку на C в виде dll для луа.
----------------
6) измените алгоритм обработки данных.
Определение инструмента в индикаторе
 
getDataSourceInfo
Функция предназначена для получения информации об источнике данных для
индикатора.  
Определение инструмента в индикаторе
 
getDataSourceInfogetDataSourceInfo

Функция предназначена для получения информации об источнике данных для  индикатора.  

TABLE info getDataSourceInfo() Функция возвращает таблицу Lua с параметрами:  
ВАЖНО! Для корректной работы функции getDataSourceInfo, вызываемой из функции Init, необходимо
перезапустить Рабочее место QUIK после добавления индикатора на график.

ПараметрТипОписание
intervalNUMBERТекущий интервал (тайм-фрейм) графика
class_codeSTRINGКод класса источника данных
sec_codeSTRINGКод бумаги источника данных
paramSTRINGНаименование параметра Таблицы текущих торгов, по которому строится график.  Если поле пустое, то график строится на основании Таблицы обезличенных сделок
Направление прошлой сделки
 
Цитата
Suntor написал:
Цитата
Николай  Камынин   написал:
Есть такое правило на рынке - Рынок двигают рыночные цены.
Т е направление рынка - это направление движения цены. Рыночная цена всегда смещает цену в стакане.
Под «рыночной ценой» вы что здесь имели ввиду?
Цитата
Николай  Камынин   написал:
Поэтому попробуйте следить за ценой на вершине стакана.
«вершина стакана» — это где?
Цитата
Николай  Камынин   написал:
Но если рынок не двигают большие деньги ,
то всегда на движение вверх будет ответное движение вниз и наоборот. это делает маркет-мейкер, ему за это деньги платят.
Кто платит деньги маркет-майкеру и как он это делает «ответные движения»? расскажите поподробнее...
Рыночная цена - это сленг, означает рыночная заявка  т е заявка покупки или продажи по существующим на рынке ценам.
Такая заявка всегда. это покупка по лучшей цене предложения или продажа по лучшей цене спроcа.
----------------------
Под вершиной стакана я понимаю лучшую цену предложения и лучшую цену спроса - спред (линия в стакане) между ними и есть вершина стакана.
-------------------------
Маркет-мейкеру платит биржа. Сколько и за что вы можете посмотреть на сайте биржи.
Упрощенно это выглядит так:
Задача маркет мейкера - сужение спреда или иначе создание ликвидности (видимости торговли).
Поэтому когда рыночная заявка бъет в лучшую цену - спред расширяется, маркет-мейкер (если нет никого)
бьет в противоположную сторону - т е сжимает спред.
invalid key to next
 
Цитата
Dmitry написал:
Цитата
Николай  Камынин   написал:
ошибка в итераторе next (table, index)
index выходит за границу таблицы, либо таблица пустая, либо таблица не существует
--------------------------------------
Можно поставить  итератор внутрь проверки
например так
if table and #table >0 and #table>=index  then
--действия с итератором  nex(table,index)
...
end
Спасибо, понаставил такие проверки перед всеми next и for, но это к сожалению не помогло
Возможно, что ошибка возникает внутри функции библиотеки QLUA. .
Можно предположить (без текста скрипта сложно гадать) что ошибка возникает при запуске скрипта, когда что-то у Вас еще не инициализировано.
Попробуйте определить все начальные значения в функции init.
Если скрипт не секретный, то покажите , возможно что-то будет понятно где проблема.
Направление прошлой сделки
 
Цитата
Андрей написал:
Доброго времени суток. У меня тут вопрос, от куда (кроме таблицы всех сделок) можно получить информацию о направлении прошлой сделки (за последний тик) т.е. мне нужно знать была ли покупка или же продажа на прошлом тике.
Таблица всех сделок вроде дает эту информацию, однако мне нужно сделать так, что бы не нужно было в квике открывать не какие таблицы. т.е. запустил робота, и он сам тягает эту информацию.
Есть такое правило на рынке - Рынок двигают рыночные цены.
Т е направление рынка - это направление движения цены. Рыночная цена всегда смещает цену в стакане.
Поэтому попробуйте следить за ценой на вершине стакана.
Но если рынок не двигают большие деньги ,
то всегда на движение вверх будет ответное движение вниз и наоборот. это делает маркет-мейкер, ему за это деньги платят.
Поэтому не заморачивайтесь особенно этим вопросом.
invalid key to next
 
Цитата
Dmitry написал:
Приветствую!

Пробую освоить qlua, скрипт получился уже приличного размера, но иногда стал останавливаться и в окошке "Ошибки выполнения скрипта"
получаю ошибку:
Цитата
invalid key to 'next'
Вопрос, как понять откуда это приходит, т.к. ни номера строки, ни какого другого намека не выдается.
ошибка в итераторе next (table, index)
index выходит за границу таблицы, либо таблица пустая, либо таблица не существует
--------------------------------------
Можно поставить  итератор внутрь проверки
например так
if table and #table >0 and #table>=index  then
--действия с итератором  nex(table,index)
...
end
Написал простой код, что не так?
 
Информация к размышлению для тех кто изобретает грааль.
Свеча - это индикатор, который  на графике  строится как бы с заглядыванием  вперед.
поэтому на истории легко строить и обнаружители трендов и прибыльные стратегии, особенно используя индикаторы заглядывающие вперед.
К таким индикаторам относятся зигзак и фрактал.
поэтому не надо от скользящей средней или от арифметического среднего ждать чудес.
Это самые простейшие цифровые фильтры с очень плохими фильтрующими свойствами.
-------------------------
Умным -горе от ума, глупым - радость от безумья.
Обращение к внешним сервисам
 
В квик встроена стандартная VM Lua вер 5.1
QLUA - это библиотека к LUA версии 5.1
Поэтому любые сторонние библиотеки, которые работают на LUA 5.1 будут работать в квике.
Написал простой код, что не так?
 
можно сделать так:
Код
function OnCalculate(index)
high2=high1
high1=high
high=H(index)
if high1  and high2 then
     vrem=(high1+high2)/2   --- или так       vrem=(high+high1)/2
end   
   return high , high1, vrem
end
Можно ли объединить скрипт с программой
 
Вариант такой
1) Пишите на LUA индикатор, который отображает
" перебирает построчно текстовый файл с бумагами и поочередно выбирает каждую и выводит на экран максимумы к текущему графику"
2) Пишите на AUTOIT скрипт которому первая программа передает данные отображаемой бумаги и этот скрипт выводит очередной график на экран.
-------------------------
Полагаю Вам сложно будет сделать п 2)  Поэтому можно упростить хотелку и выводить не график очередной бумаги, а ее название.
В таком варианте все может делать скрипт на луа п 1)
Что приходит в OnTransReply ?
 
Цитата
Nikolay написал:
Цитата
Sergey Gorokhov   написал:
Nikolay  ,

Проверьте в таблице транзакций терминала QUIK нет ли ошибки при отправке транзакций.
Дело в том что рыночные заявки на покупку могут быть запрещены.
Если так то в таблице транзакций Вы увидите сообщение об этом.
Сообщите Ваш UID чтобы мы могли проверить права.
Добрый день.
ID U0120866

Не уверен, что есть ошибки, т.к. если убрать обработку ожидания  while trans_Status == nil do sleep(1) end, то все работает.
Получается, что если ждать когда придет OnTransReply - зависает скрипт, т.к. ответа нет.
Убираю ожидание все проходит без ошибок.

Как я и говорил выше, на срочной сеции этот же код работает нормально.
Полагаю, что у Вас  неправильное представление о работе с колбеками.
При использовании  колбеков нет надобности ждать.
Колбеки для этого и создаются.
Т е все события у нас асинхронные, поэтому их не надо ждать, а надо на них реагировать.
Если событий нет, то система бездельничает и ничего не ждет, так как нам заранее неизвесно когда и какое событие будет.
Подумайте над этим и смените логику скриптов.
--------------------------
В качестве совета.
Не надо делать кучу скриптов, пишите свои торговые стратегии в одном, так как все колбеки вызываются последовательно и им передается одно и тоже, то нет смысла множить копии колбеков в разных скриптах.
CreateDataSource, не грузятся данные при формир. через CreateDataSource
 
можно попробовать так.
=============================
в main ставите однократную подписку на данные:
if DS==nil then    DS = CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL) end
==============================
там, где используете эти данные ставите условие:
if DS and DS:Size() ~= 0 then
-- обработка данных
end
------------------------
При этом нет надобности в каких-либо задержках, все будет работать без тормозов.
Подключение сторонних библиотек в Lua скрипте
 
Цитата
Евгений написал:
Добрый день.
Делал все по инструкции из темы  https://forum.quik.ru/forum10/topic561/

Сам скрипт:
Код
  package.cpath  =   getScriptPath ()  ..   "\\lib\\?.dll;"   ..  package.cpath
package.path  =   getScriptPath ()  ..   "\\lua\\?.lua;"   ..  package.path
 local  smtp  =   require ( "socket.smtp" )
  

В итоге появляется ошибка:
Код
  error loading module  'socket.core'  from file  'C:\Robots\SS\lib\socket\core.dll' :
   Не найден указанный модуль.
  

Подскажите где мог допустить ошибку?
Скорее всего у Вас нет библиотеки , которая нужна этой библиотеке.
Для решения проблемы надо посмотреть зависимости этой библиотеки.
два робота, два колбека
 
Цитата
Let_it_go написал:
Добрый день.
Прошу дать совет.
У меня два робота. У каждого своя стратегия, но каждому из них нужен минутный график фьючерса РТС. Оба робота подписываются на него с помощью колбека.
Код
   function   DataSource (class,sec,interval)
   ds[sec]  =   CreateDataSource (class,sec,interval)
   ds[sec]: SetUpdateCallback ( function ( .. .) mycallbackforallstocks(class,sec, .. .)  end )
    return  ds[sec]
 end   
Индикаторы у них разные, поэтому расчёт индикаторов не дублируется.
Тем не менее вопрос: не происходит ли двойной работы по получению графика? Если да, то как этого избежать? И стоит ли этого избегать (может быть это маленькая нагрузка, которую можно игнорировать).
Спасибо
Поместите стратегии в один скрипт и Вы уменьшите размер кода и нагрузку на CPU от роботов в два раза .
Зачем их вообще делать в разных скриптах,
если у них 90% программы одинаковые
и лишь генератор торговых сигналов разный?
QUIK для HFT
 
Цитата
Let_it_go написал:
Прошу подсказать.
У меня с программированием дела плохи. Еле-еле освоил Луа. Учить другие языки нет сил.
Скорости КВИКа для отправки заявок мне уже не хватает. Нужен полноценный HFT.
Возможно ли реализовать прямой доступ на биржу так чтобы у меня визуально всё осталось по старому: КВИК и Луа?
Спасибо за ответ.
Полноценный HFT стоит очень дорого.
Кроме того дорого будет стоит его обслуживание и каналы связи.
Некоторую информацию об этом можно найти в инете.
КВИК разрабатывался как инструмент подачи заявок брокеру.
Данный форум не то место, где обсуждается HFT,
здесь обсуждаются ляпы новичков и новых версий терминала QUIK.
Взаимодействие OLua и Lua под Виндой
 
Цитата
s_mike@rambler.ru написал:
Цитата
Николай  Камынин   написал:
Что же касается исполнения луа программы в КВИКЕ и вне его то исполняются одинаковое время так как в квике ровно таже VM Lua.
в теории одинаково. На практике нет. В терминале скрипты исполняются медленнее.
можете привести конкретные данные? На сколько процентов медленнее?
Полагаю, что медленнее может быть  лишь по причине того, что скрипт в квике не самостоятельная задача.
Других причин не видно.
Вообще-то интересно как Вам удалось функции библиотеки QLUA запустить независимо от квика?
Lua Dll на C++
 
Рекомендую проштудировать книгу
Дж.Рихтер Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows
В ней есть ответы на все Ваши вопросы с примерами и готовыми решениями.
Взаимодействие OLua и Lua под Виндой
 
Скорее всего надо переписать сам скрипт ,изменить алгоритм или переписать его на СИ как dll.
Что же касается исполнения луа программы в КВИКЕ и вне его то исполняются одинаковое время так как в квике ровно таже VM Lua.
Задержка может быть лишь из-за загрузки процессора либо другими приложениями либо работой самого квика в реале.
--------------------
В любом случае Вы не там копаете.  
Помогите найти ошибку., После срабатывания стопзаявки
 
Цитата
sav 312 написал:



Чтобы искать быстро, могу посоветовать искать не сначала таблицы сделок,
а с конца,
так как искомая сделка скорее всего последняя.
Unknown error
 
Это ошибка, которую никто не ловит.
как правило ошибка на уровне нативного кода или на уровне ОС.
возможно что ошибка железа, например перегрев CPU, сбой памяти где находится программа пользователя и т д
-------------------------------------
"О сколько нам открытий чудных готовят просвещенья дух и опыт, сын ошибок трудных.."
Страницы: Пред. 1 ... 44 45 46 47 48 49 50 51 52 53 54 ... 72 След.
Наверх