Тут должно быть немного очевидно что эти файлы делают и зачем они нужны. Бороться с этим не надо, если вам эти файлы не нужны то просто игнорируйте их.
Mixa, О том что признак окончания зависит от определения разграничения между архивными и текущими данными, а такового разграничения нет. Мозгами подумайте как это чисто технически должно было бы работать вообще, псевдокодом хотя бы изложите - тогда и будет разговор. А то сейчас это полемика уровня "прицепите карбюратор к дизелю".
Тут вопрос стоит в том, что нет разницы между "архивными" и "текущими" данными - это что называется абстрактный конструкт. Что вообще понимается под "текущие данные"? Наиболее актуальные? Тогда очень старые данные могут быть "текущими" если ничего нового не пришло. Которые соответствуют текущему моменту времени? Тогда вообще все данные будут "архивными" потому что к моменту прихода данных к вашему терминалу они уже устарели. Которые не старше ХХХ времени? Тогда старые данные могут считаться "текущими", которые теперь еще и представляют собой большой блок данных а не одну запись, плюс это конфликтует с понятием об актуальных данных которые могут быть очень старые.
Тут проблема не в технической реализации, а в том что вы расплывчатые фантазии из страны бабочек и единорогов пытаетесь натянуть на действительность с железобетонной логикой.
Поясните пожалуйста, если main с бесконечным циклом без С-функций, в конце каждой итерации sleep это будет работать так: 1. Если выполняется код до sleep и приходит колбэк, то колбэк не будет выполняться, пока не начнет выполняться sleep. 2. При начале выполнения sleep, начнут выполняться накопленные колбеки, при этом в основном потоке дальше sleep выполнение не пойдет, пока не выполнятся все накопленные колбеки?
Да. Тут надо уточнить что использование динамической памяти тоже снимает лок - создание новых объектов и строк. При использовании полностью статической памяти и отсутствии манипуляции строк, лок не должен сниматься. Еще надо уточнить что каждый луа-скрипт имеет свой отдельный тред, но колбеки выполняются из главного треда квика, так что пока колбек (любой из них) выполняется или стоит в ожидании, весь терминал будет висеть.
Решение очень простое: не используйте одни и те же данные в разных потоках. Один из примеров практической реализации такого принципа это двойная буферизация.
Сирануш, всего-то делов погуглить - у каждого автопроизводителя имеется целая куча автомобилей у которых вскрылись пожароопасные дефекты во время эксплуатации. И ничего, живут как-то.
Это как бы к тому, что косяки неизбежны, и критиковать людей по поводу их наличия это как минимум глупо.
Владимир, при исполнении прерывания планировщика задач изымается управление из текущей задачи и передаётся в одну из стоящих в очереди. Если ничего не выполнялось и процессор простаивал, значит просто запускается стоящая в очереди задача у которой вышел таймер остановки.
Айдар, технология которую вы имеете ввиду называется CPU spin - когда вместо ожидания процессор загружен циклом, который ничего не делает и только проверяет, настало ли время прервать самого себя. Это как правило обеспечивает высокую точность времени возврата из паузы, но соответственно использует 100% процессора.
Владимир, возврат управления от ОС в приостановленную программу это и есть прерывание по таймеру.
Sleep передаёт управление процессором обратно операционной системе, с указанием вернуть управление программе не менее чем через указанный период. Операционная система ставит процессор в режим простоя когда он ничем не используется.
BlaZed, я имел ввиду все имеющиеся данные а не только текущие. А так можно отслеживать OnParam, можно GetParam в цикле использовать, можно вообще по данным стакана всё это определять.
local fileInput = { }
local file, err = io.open ( "path/to/my/file.txt", "r" )
if not file then error ( err ) end
for line in file:lines ( ) do
fileInput[ #fileInput + 1 ] = line
end
doThingsWith ( fileInput )
Dr Wed написал: где искать функции для работы с фалами? Как, например, выгрузить в файл результаты работы скрипта?
В самом Lua. Есть встроенная библиотека io, в ней есть функции open которая открывает файл, в объкте файла есть функция write которая пишет в файл данные. Сразу оговорюсь что не нужно пользоваться бинарными файлами, используйте простой текст - так гораздо проще плюс файлы можно редактировать без затруднений.
Примерно таким способом можно сбросить в файл одноуровневый массив или строку.
Код
scriptResults = runMyScript ( )
local file, err = io.open ( "path/to/my/file.txt", "w" )
if not file then error ( err ) end
file:write ( type ( scriptResults ) == "table" and table.concat ( scriptResults , "\n" ) or scriptResults )
file:close ( )
Код прочтения в массив данных из файла разделенных построчно.
Код
local fileInput = { }
local file, err = io.open ( "path/to/my/file.txt", "r" )
if not file then error ( err ) end
for line in file:lines ( ) do
fileInput = line
end
doThingsWith ( fileInput )
Dr Wed, за исключением пользовательских графических таблиц и скриптов индикаторов, графический интерфейс и программный интерфейс (Lua API) полностью развязаны и не имеют возможности друг с другом общаться. Можете считать программную часть квика отдельной и невзаимосвязанной с графической частью.
Dr Wed, я инструкцию проштудировал, вроде как других способов нет. Единственная альтернатива которую я вижу это брать данные из открытого графика внутри скрипта индикатора, который к этому графику подцеплен.
Было бы ПО с открытым исходным кодом, можно было бы самому сделать. У меня как то было такое что в трекере программы которой я пользовался 10!!! лет висел фичреквест, который успешно игнорировался, и в один прекрасный день оно мне тоже потребовалось. Если гора не идет к магомеду, подумал я, и сам выполнил нужный функционал и отправил пулреквест разработчикам, который они вскоре приняли. Не то чтобы сильно важный был функционал, но мне много людей спасибо на том сказали.
Это опять же вопрос к тому, что торговый клиент не должен иметь графического интерфейса, а иметь только цифровой интерфейс, давая возможность любому терминалу присоединиться к нему и обмениваться данными и командами, чтобы соответственно разработкой терминала могли заниматься отдельные люди в том числе пользователи.
Евгений, разработкой программного обеспечения занимались когда-нибудь? У вас свой план разработки, у пользователей - разношерстные пожелания. Пожелания вносятся на планёрку, там обсуждается вопрос о соотношении усилий к пользе, на этом же основании либо это вносится в баклог как часть плана разработки, либо кладется в долгий ящик.
Andrey Bezrukov написал: возможность использования функции CreateDataSource, а также вызов callback-функций, связанных с источником данных, полученным через CreateDataSource
Maksimus, в плане программирования Луа сходен с Си. Разница состоит главным образом в отсутствии строгой типизации - любая переменная может иметь любое значение. Таким образом можно довольно легко делать например именованные структуры данных просто записав произвольные величины в произвольные ячейки массива, деревья данных просто записывая другой массив внутрь имеющегося массива, или делать ООП объекты просто навесив функций на массив. Всё это осуществимо и в Си, но довольно муторно из-а строгой типизации. Еще конечно память тут автоматическая, но это в целом эквивалентно просто использованию статической памяти в Си, с поправкой на то что можно локальные объекты передавать наружу из функций.
Maksimus, можете собственно создать графическую таблицу и туда эти данные затолкать. Тут одна особенность правда есть - сначала надо создать таблицу и добавить колонки, потом создать окно, и уже потом добавлять строки. Иначе не работает.
Maksimus, ну да, результат выдается таблицей. Из таблицы надо значения выдёргивать по мере надобности. Чтобы просто всё подряд высыпать можно вот такой например код использовать.
Код
for k, v in pairs ( money ) message ( string.format ( "%s=%s", k, v ) ) end
Язык прекрасный на самом деле: можно писать как на Си, можно писать как на Паскале, можно писать как Питоне, можно писать как на Джаваскрипте. Встроенные хештаблицы и возможность ставить значения пустых полей по умолчанию через другую таблицу либо вообще функцию. Бинарные строки и отсутствие борьбы с нуль-терминатором, и такие сверхбыстрые строковые сравнения что можно вместо числовых констант строковые использовать. Сборщик мусора быстрый и хирургически точно управляемый. Можно загружать бинарные библиотеки написанные на С++, а через специализированые инструменты - даже при отсутствии у библиотек Луа интерфейса.
Нули у вас потому что неверные параметры заданы. По-хорошему должно ошибку выбрасывать, но в Арке у людей туго с идиоматичным кодом на Луа, так что вот такие перлы повсюду. Советую вам обращаться к табличным данным напрямую через getItem.
Код
for i = 1, getNumberOf ( "money_limits" ) do
money = getItem ( "money_limits", i )
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, если не стесняетесь добавить в логику ценовой политики рассчет стоимости плеча и сделок репо, то шорты нетрудно добавить - они просто инверсия лонгов. Не считая ситуаций когда прибыль съедается комиссией, где по лонгам потери там по шортам прибыли.
Старатель, действительно, мне почему-то показалось что в инструкции было написано что эта функция доступна из скрипта индикатора. Наверное перепутал с getDataSourceInfo.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, мой робот не реалтаймовый, и я как раз говорил что гораздо важнее иметь получше алгоритм чем побыстрее торговый аппарат. Экономический алгоритмист из меня примерно никакой так что я задействую машинное обучение - результаты пока так себе, но прогресс есть.
BlaZed, сделки будут совершаться по рыночной цене в любом случае, устанавливая цену регулируется в целом только то, в какой момент (или вообще) будет совершена сделка. Лучшая цена сделки обычно движется в одном и том же направлении и после принятия решения совершить сделку можно просто ждать, пока это направление не поменяется. В зависимости от настройки гистерезиса можно и прозевать несколько делений от лучшей цены, но можно и не застрять на локальном минимуме.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
TGB написал: Если заменить в выше написанном «реалтаймовость» на высокочастотность (смотрите ее описание в сети) , то, с написанным, я, в основном, согласен.
HFT требует реалтаймовость, одно без другого не работает. Я говорил про обычного робота который использует вместо обычной среды - реалтаймовую. В отсутствие джиттера это позволило бы не прозевать пару лишних тиков и получить чуть лучшую сделку по сравнению с роботом, у которого система может вызвать случайные задержки по несколько миллисекунд.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир написал: Сами же участники, как правило, легко затыкают подобным шавкам пасть.
На примере вас двоих тут скорее ситуация вида игры в шахматы с голубем - после нескольких попыток даже самые отбитые аутисты перестанут пытаться, а голубь все равно будет считать себя безсомненным победителем всегда и везде в любом случае.
Начните с прочтения документации QUIK, там относительно подробно написано что надо делать. Как программировать на Lua там конечно не написано, но для этого есть отдельные ресурсы - онлайн-книга Programming In Lua например. Один нюанс с которым у меня возникли трудности это количество графиков - нужно чтобы количество обозначенных линий в таблице настроек совпадало с числом, возвращаемым из OnInit (например с помощью "return #Settings.line" ), и фактически возвращаемые числа из OnCalculate должны иметь такой же порядковый номер как и обозначеные линии. Вместо чисел можно возвращать nil, тогда в этой точке будет разрыв соответствующего графика. Свечкообразные графики не поддерживаются.
Телеграм-бот должен работать на сервере, так что на Lua врядли много чего получится. Так или иначе нужно получить доступ к боту, который может передавать сообщения, которые он принимает через интернет, например по web API. В его документации надо будет вычитать, как ему отправлять сообщения; надо будет установить LuaSocket и с его помощью отправлять к боту соответствующие сигналы.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, мне не платят чтобы вам лекции по информатике читать. Направление я показал - дальше сами, гугол в помощь. Сделать свой компилятор лиспа это кстати типовая часть обучения в области компиляторов, ничего особого тут нет.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, вот такие как вы профессиАналы делают сборщик мусора простым инкрементом, а потом недоумевают почему память течёт. Интересно что вы создателя Лиспа сюда упомянули, при том что в Лиспе сферический в вакууме сборщик мусора, и который тормозит исполнение скрипта, и сканирует все переменые на предмет референсов, и не может поймать острова памяти, и вручную не выключается.
То что ручная работа с памятью быстрее работает это ни у кого сомнений не возникает. Равно как и то, что теперь стоимость лишних серваков из-за медленных языков и в частности сборки мусора гораздо меньше стоимости человекочасов разработчиков, которые могут в таком объеме вручную памятью управлять. С ростом аппаратных мощностей снизился и входной порог в области программирования. Платить больше там где можно получить тот же результат дешево или вообще бесплатно - логически нецелесообразно и экономически неэффективно для всей системы.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, длина среза торговых данных, с которыми работает робот - один из гиперпараметров. По аналогии можете представить какие другие переменные являются гиперпараметрами.
Вы видимо плохо себе представляете что такое сборщик мусора. Работать не останавливая основной тред они не могут принципиально, так как нужно подсчитать сколько референсов имеется на каждый объект и это невозможно сделать когда соседний тред меняет эти референсы.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, все сборщики мусора работают в фоне и активируются с некоторой, в целом хаотичной, периодичностью, и во время работы полностью тормозят выполнение основной программы. Это создаёт неприемлимый джиттер даже в системах с низкими требованиями к реалтаймовости - выполнение цикла ГЦ может занимать несколько десятков миллисекунд за раз. Кто помнит перевернувшийся раллийный автомобиль под управлениям робота на джаве? ГЦ завесил программу на долю секунды, именно столько и потребовалось чтобы прошляпить критический момент. А по поводу чего я там не понимаю - давайте не будем отрицать что способность робота вести торговлю в плюс (и размер этого плюса) целиком зависит от настройки гиперпараметров алгоритма.
TGB, робот который торгует в реалтаймовом режиме. Определение реалтаймовости сами найдете я думаю.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
TGB написал: 1) программа торгового робота не является программой реального времени); 2) что торгового робота в Windows, в QUIKе написать невозможно.
Программа, работающая на железке без RTOS и/или написанная на языке со сборщиком мусора - не работает в реальном времени. Написать робота в таких условиях можно, но говорить что он риалтаймовый - нельзя, в определение риалтаймовости не вписывается.
Я считаю реалтаймовость для торговых роботов вещью спорной полезности. Способность отреагировать в строго определенный (и короткий) промежуток времени и совершить транзакцию по цене максимум на 1-2 пункта лучше чем нериалтаймовый робот это ничтожный прирост эффективности на фоне общей турбулентности рынка и вариативности результатов торговли в зависимости от прочих параметров. Занимаясь целенаправленной разработкой таких вещей вы скорее всего потратите больше денег чем заработаете на этой разнице за всё последующее время торговли, исключая уровень оборота миллионами долларов в сутки и выше.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир, как раз таки программистам с мозгами юникод проблем не создает никаких, а какая польза с универсального формата должно быть очевидно даже слепому.