eSKon2 написал: Добрый день. Подскажите как в индикаторе проверить что свеча незавершенная. Иначе получается, что значения сохраняемые через замыкания, постоянно обновляются во время изменения последней свечи, как результат весь индикатор считается правильно только при перерисовке с нуля, динамически он уже нормально не работает.
очень просто, если время свечи текущего отсчета равно времени предыдущего, то свеча не завершена. еще есть флаг закрытой свечи (см док на QLUA)
s_mike@rambler.ru написал: Как показывает практика, ODBC и DDE вряд ли получится заставить работать стабильно и надежно.
За ODBC не знаю, а DDE вполне себе надежно работает, если аккуратно серверную часть сделать. Другое дело, что чуть какая предобработка нужна и все равно придется подпиливать костылики на луа, и тут появляется фактор "ой, я DDE стартанул, а скрипт забыл запустить", так что в итоге все верно сказано, луа как луа или луа как интерфейс к сям-плюсам - единственный удобный вариант.
стартуйте DDE в скрипте LUA внешним скриптом например на AutoiT
danich написал: На форме ' Вывод по ODBC ' есть флаги ' Чистить таблицу ', ' Формальные имена ' и кнопки ' Н ачать ' и ' Прекратить '. Как в lua-скрипте пров ерить значения флагов и состояние кнопок ?
Старатель написал: Скрипт отправляет транзакцию на снятие заявки. Допустим, OnOrder получен раньше или OnTransReply вообще не пришел. Есть возможность установить инициатора снятия: сам скрипт, пользователь (вручную) или, может, другой бот?
если скрипт отправил заявку, то он знает это если заявку сняли но он не отправлял то тоже знает. кому надо устанавливать инициатора?
поясню откуда что берется. Данная формула берется из следующей гипотезы. Полагаем что цена отклоняется от оценки среднего значения случайным образом по гауссовскому закону плотности вероятности отклонения тогда с вероятностью 0.95 имеем 1.96*ср.квадр ----------------- Но это гипотеза не верна (доказано в прошлом веке) так как закон распределения цены не нормальный следовательно центр тяжести нельзя считать как среднее следовательно закон двух сигма не работает ------------------ Резюме: алгоритм этого индикатора такой: Берете любой фильтр например скользящее среднее вычитает его из цены сглаживаете фильтром модуль ошибки и прикручиваете к первой линии еще две никакой существенной разницы нет какие формулы вы применяете. так как особого тайного смысла как и ценности в них тоже нет. ====================== Вообще-то зачем городить расчет индикатора когда он есть в КВИКЕ поставьте метку и читайте значения в своем скрипте Зачем изобретать дырку от бублика.
Вы же не сказали сколько "быстро" и сколько у Вас сейчас. Если серьезно, то все познается в сравнении. возьмите время пинга да сервера брокера прибавьте время реакции сервера на ваше послание добавьте время проверки ваших лимитов прибавьте время кванта ваших задач на компе. добавьте время вычисления вашего скрипта луа Получите примерно от 0.2 сек до 10 сек и более то что Вы пытаетесь сделать даст Вам примерно 0.01 сек. Вам это надо?
добавлю строка row=getItem("orders",i) означает присвоить переменной row, которая определена в локальной таблице скрипта, значение функции getltem которая определена в локальной таблицы библиотеки QLUA которая определена в глобальной таблице VMLua Ну как быстрый вызов получается?
Sergey написал: Здравствуйте, подскажите пожалуйста код функции EMA, или подробный алгоритм, в нэте туча подобных алгоритмов EMA (t) = EMA (t-1) + 2 *(P(t) – EMA (t-1))
EM=Price(t)×k+EMA(y×(−k)
хоть они и разные и во всех их не могу одного понять! EMA (t) = EMA (t-1) + 2 *(P(t) – EMA (t-1))
EM=Price(t)×k+ EMA(y×(−k)
откуда мне знать чему будет равен EMA (t-1) и тд, если я его только хочу вычислить, просто для меня это звучит так, подходит ко мне человек с потерей памяти и спрашивает меня, сколько ему лет, а я ему говорю, ЛЕТ=(Лет-1) + 1 О_о так он же не знает сколько ему было лет, и сколько есть.
Кратко примерно так: это простейший фильтр EMA - это сигнал на его выходе P - это сигнал на его входе В начальный момент вы его включаете. Как телевизор EMA(t-1) - это то что было на его выходе до включения (как телевизор) - ничего т е ноль ноль был и в момент t-миллион ----------------- В программах любых фильтров делается блок инициализации, в котором вы должны задать начальные значения всех переменных В простейшем случае они равны нулю Но лучше задавать их равными сигналу в начальный момент это уменьшает переходной процесс в фильтре примерно так подробнее читайте в учебниках по теории цифровой фильтрации сигналов
биржа штрафует за ошибочные транзакции. хочу уточнить - если я вижу такое сообщение, значит моя транзакция не долетела до биржи и отбита сервером брокера?
никто вас не штрафует. либо нет денег либо нет заявки и она уже исполнена иногда такое сообщение появляется при снятии заявок хотя заявка успешно снимается.
выкиньте этот код и напишите новый. индикатор фрактал имеет очень простой алгоритм примерно так: если максимум текущей свечи меньше максимума предыдущей то ищем вершину в прошлом аналогично для минимума Подумайте над этим
Вы в одну кучу свалили множество самостоятельных задачи и пытаетесь их разом решить. их надо решать последовательно и независимо друг от друга. Тогда решите за обозримое будущее и с меньшими потерями. ========== QLUA -это лишь библиотека для VM Lua ---------------------- В своем посте вы обозначили следующие задачи: 1) Изучение языка луа 2) изучение API С для lua 3) оболочка API C для C++ 4) изучение функций библиотеки QLua 5) методы исследования рынков 6) методы построения систем реального времени обработки сигналов ------------ Подумайте над этим
проблему решил следующим образом: ----------------- local countX; ... function Init() countX=0; .... end ... function onCalculate(m) if countX>m then return else countX=m end ... end -----------
Let_it_go написал: Записываю лучшие биды и аски по акциям средней ликвидности, например Распадская RASP. Что лучше выбрать: OnParam или OnQuote? Сомнения связаны с тем, что текущая таблица транслируется срезами раз в 50 миллисекунда, то есть будут пропущенные данные. А стакан? Он транслируется срезами или безостановочно?
таблица проще. хрен редьки не слаще. на результат торговли никак не влияет, если Вы не "в яме" Кто не согласен, попробуйте доказать результатом.
Atom написал: Точнее на миллисекунду появляется и исчезает и если не подождать одну свечку, то и при удалении индикатора и снова добавлении не показывает, т.е. нужно подождать хотя бы свечу одну и потом перезапустить, чтобы отобразился знак, вот что за хрень?
Добрый день, Если вопрос уже обсуждался,просьба дать ссылку. Почему скрипт индикатора при его установке в окно рассчитывается два раза Т е если поставить вывод индекса то получим его изменение от 1 до мах два раза. ------------ Спасибо
Добрый день, возможно проблема решена, тогда просьба дать ссылку. Писал об этой проблема лет надцать назад, но воз и ныне там. -------------- Прошу разработчиков решить следующую проблему. Если в скрипте индикатора есть сравнение с nil, то выводится окно ошибки , которое фактически блокирует возможность снять скрипт особенно в период сессии на боевом квике. если это не торговый режим, то хрен редьки не слаще. Приходится ждать всю историю данных.. -------------- Поэтому просьба сделать одно из двух 1) автоматическое снятие скрипта при возникновении подобной ошибки исполнения 2) возможность перехватить ошибку и сделать аварийный выход из скрипта -------------- Спасибо
Дмитрий написал: Sergey Gorokhov,спасибо, понятно. В общем связать обезличенные (стакан) и личные (свои заявки) данные можно только по косвенным признакам, то есть цене и объёму, что и явствует из природы этих данных
попробую пояснить основы, которые дают ответ на ваш вопрос. На бирже вас вообще нет, там есть лишь брокер. Поэтому ваша заявка фиксируется брокером в своих внутренних записях и фактически возвращается в строку стакана вне зависимоcти от информации с биржи. Это Вам только кажется что Вы видите свою заявку на бирже. в действительности она даже может и не дойти до биржи, так называемый механизм встречных заявок в основном использовался на форексе, не факт что используется в КВИКЕ.Но нет проблем его реализовать.
Николай Камынин написал: вообще-то Стохастик - это примитивный полосовой фильтр
Совершенно верно. Что абсолютно не противоречит следующему
не возражаю, просто не понял, что означает "надо, чтобы Стохастик брал необходимые данные по Открытым Позициям " Кто такой стохастик в этом случае? Возможно Вы хотите отфильтровать значения данных "Открытые позиции" этим фильтром. В чем проблема? Возьмите эти данные и вычислите по формуле стохастика. или Вы хотите, чтобы это кто-то для вас сделал?
Самвел написал: Приветствую всех! Помогите пожалуйста. Суть вот в чем: Необходимо с помощью Стохастика, рассчитанного за период в один год, получить данные Открытых Позиций.(Срочный рынок). Как я понимаю, Стохастик показывает текущее положение цены закрытия в диапазоне максимальных и минимальных цен за указанный период усреднения. А нужно, что бы Стохастик брал необходимые данные по Открытым Позициям.
вообще-то Стохастик - это примитивный полосовой фильтр, с придуманной байкой о его связи с финансами на бирже. Вы в это верите? А какие-нибудь доказательства этой галиматье вы видели? Меньше верьте популярным книжкам И рекламе в интернете.
zv78 написал: Здравствуйте. Где взять какое либо описание языка, и прочую информацию для написания скриптов в Quik. Посмотрел форум. Вижу вопросы на форуме задают. А где взять FAQ и информацию для первых шагов? И не только для первых..
изучайте луа без привязки к КВИК QLUA - это библиотека функций для работы с квиком. ---------------------------- начните с этого http://ilovelua.narod.ru и еще удобно использовать SCITE - редактор текста который написан на луа. В нем можно отлаживать и исполнить скрипты луа.
Спасибо. Ну как бы без привязки он мне не особо нужен)
попробую объяснить второй раз. QLUA -это библиотека функций. Вы знаете как вызывать функции в луа, какие есть переменные, что такое библиотека, как ее подключать , как работать с фалами, с таблицами и т д? Нет, потому, что это все - включает в себя язык LUA. ------------------ А чтобы создавать торговых роботов, кроме языка программирования надо еще знать еще много чего и не первым в этом списке QLUA. Что же касается изучения QLUA ( если Вы знает язык LUA) то для этого достаточно описание QLUA, которое написали разработчики КВИК и еще описание КВИКА. ------------------ Вы же спросили про изучение луа. Я Вам про это и сказал.
наиболее надежно будет если поставить специальное приложение либо настроить службу винды на контроль за состоянием квика. кроме того, не все ошибки библиотеки QLUA перехватываются квиком. Именно эти ошибки и приводят к полному зависанию либо закрытию квика. Если надо решить эту проблему то надо ставить свой перехватчик ошибок (это на СИ с использованием API). ------------------ что же касается синтаксических ошибок то их надо отлаживать не на боевом КВИКЕ а в тестовых режимах и например в трансляторе редактора текстов SCITE.
zv78 написал: Здравствуйте. Где взять какое либо описание языка, и прочую информацию для написания скриптов в Quik. Посмотрел форум. Вижу вопросы на форуме задают. А где взять FAQ и информацию для первых шагов? И не только для первых..
изучайте луа без привязки к КВИК QLUA - это библиотека функций для работы с квиком. ---------------------------- начните с этого http://ilovelua.narod.ru и еще удобно использовать SCITE - редактор текста который написан на луа. В нем можно отлаживать и исполнить скрипты луа.
s_mike@rambler.ru написал: Из встроенного языка это невозможно. Просьбы об этом были ещё лет 5 назад, разработчикам наплевать.
Специально для Вас проверил сегодня, прав ли я. Действительно, я прав, а Вы как и предполагалось врете и обманываете всех. ---------------------- Вот результаты эксперимента. В индикатор, который у меня отображается в боевом квике я поставил вывод индекса в лог файл. Квик я обычно запускаю примерно за 10 минут до торгов (автоматически запускается) лог файл имеет вид: ... 01/25/19 10:51:57 5855 01/25/19 10:51:57 5856 01/25/19 10:51:57 5857 01/25/19 10:51:57 5858 01/25/19 10:51:57 5859 01/25/19 10:51:57 5860 01/25/19 10:59:49 5861 01/25/19 11:00:05 5862 01/25/19 11:00:05 5862 01/25/19 11:00:05 5862 01/25/19 11:00:05 5862 01/25/19 11:00:05 5862 01/25/19 11:00:05 5862 01/25/19 11:00:06 5862 01/25/19 11:00:06 5862 01/25/19 11:00:06 5862 01/25/19 11:00:06 5862 01/25/19 11:00:07 5862 01/25/19 11:00:07 5862 ... Как видим из лог файла никакого сброса и рестарта не происходит. О чем я ранее написал. ------------------------- Еще раз повторю для автора темы. У вас все сделано верно. То что хотите тоже можно сделать.
s_mike@rambler.ru написал: Считать только на той свече, которая является последней.
Я так и делаю и работает до начала нового дня, как только начинается новый день предыдущие линии остаются
когда начинаются новые торги графики не рестартуются. Поэтому у Вас все правильно. Но если вам мешают линии ранее нарисованные, то сотрите их, либо сделайте рестарт графика а в скрипте поставьте условие рисования линий по времени и дате.
ну как же не рестартуются?
смена торгового дня всегда приводит через процедуру очистки (даже колбек даден - oncleanup).
посмотрите на досуге, как утром в момент подключения все ваши графики становятся черными, ресетятся все экранные таблицы и начинается перестроение графиков.
я вам даже индикатор напишу, вот он:
function oncalculate(i) message(tostring(i)) end
запустите его на ночь и посмотрите, как происходит пересчет графиков и не обманывайте никого.
откройте квик до начала торгов. новые торги начнутся без изменения нарисованных графиков. Но настаивать не буду, возможно Вы и правы - у вас графики стираются, но у меня - нет.
и еще... не знаю зачем Вам 300 стаканов. Прием и сохранения информации из стаканов это самая затратная операция. Если будете скальпировать то реально не более 3-5 инструментов. Если вы хотите делать биржевой сканер, то его можно сделать по ТТП
Николай Камынин написал: обновление множества стаканов вы получите в пакете, но информация в них будет не одновременная. следующее обновление будет примерно не ранее чем через 0.1 сек. Кроме того в винде квант для задачи не менее 10 мс т е квик получит время процессора не ранее чем через 10 мс Еще есть алгоритм Нейгла который может дать вам задержку до 0.2 с Успехов
спасибо за советы. я не до конца понял смысл поэтому кое-что переспрошу. вторая мысль о том, что передавать во вне данные для анализа (а потом обратно для сделок) это медленно, мне понятна.
но вот что значит "обновление множества стаканов вы получите в пакете, но информация в них будет не одновременная. следующее обновление будет примерно не ранее чем через 0.1 сек." ???
я правильно понял что:
1) много стаканов (более 100) вы запрашивали, и Квик не виснит от этого? 2) почему пакет с "изменениями стаканов" не будет одновременный? я себе это так представляю: за последнюю 0.1 секунду из 300 стаканов обновился только один(или 2), поэтому он в данном пакете целиком и прилетит. когда обновятся следующие прилетят также и они. Само собой эти данные по времени будут чуть отставать от данных Квика в таблице текущих котировок.
Ваш ответ выглядит наиболее экспертным, поэтому надеюсь Вас не затруднит мне его чуть прояснить. спасибо.
Попробую ответить. Так как подробно отвечать очень долго, то я упрощенно объясню. 1) программа квик - это программа подачи вами заявки брокеру. Все остальное, что в ней реализовано - это бесплатное приложение. (Это не я придумал, это разработчики так позицируют QUIK уже 20 лет) 2) все ваши заявки идут через сервер брокера для подтверждения лимитов а потом уже на сервер биржи. Время обработки одной транзакции сервером брокера примерно 1 мс. Но есть очередь и в ней вы не всегда первый. Поэтому если Вы даже мгновенно получите стакан и мгновенно отреагируете, то на бирже будете не первым. HFT роботы всегда будут впереди вас и будут вас иметь. 3) информация с биржи передается как бы двумя потоками. один - это общедоступная информация, т е то, что для всех одно и тоже - это и стаканы и потоки обезличенных сделок. Эта информация передается с биржи с определенным интервалом , пакетами. Т е Вы в пакете получаете кучу всего, что произошло за время после предыдущего пакета. стаканы с биржи передаются в виде изменений в стакане. как я понимаю, эти изменения перерабатывает сервер брокера и в каком-то виде передает в терминал квика. ----------------------- Так как QUIK - это не программа для высокоскоростной торговли а лишь см п1, то все информация поступает сравнительно медленно. Мои измерения показали, что допустимо считать задержку принятой информации на величину не менее 0.1 сек. Вот исходя из этой задержки и следует планировать работу торгового робота. В реальности задержка может доходить до 1-3 секунд. ------------------------- Рекомендую не пытаться делать на квике HFT, а создавать программу, которая способно играть при любых задержках. ----------------------- Пакеты обновляются на бирже несинхронно, поэтому сколько и когда обновятся сказать невозможно. Приходят заявки на биржу и они ставятся в очередь. Биржа одна , а игроков тысячи и среди них сотни HFT роботов, которые ставят и снимают завки меньше чем за 10 мс. ------------------------ Примерно так.
s_mike@rambler.ru написал: Считать только на той свече, которая является последней.
Я так и делаю и работает до начала нового дня, как только начинается новый день предыдущие линии остаются
когда начинаются новые торги графики не рестартуются. Поэтому у Вас все правильно. Но если вам мешают линии ранее нарисованные, то сотрите их, либо сделайте рестарт графика а в скрипте поставьте условие рисования линий по времени и дате.
обновление множества стаканов вы получите в пакете, но информация в них будет не одновременная. следующее обновление будет примерно не ранее чем через 0.1 сек. Кроме того в винде квант для задачи не менее 10 мс т е квик получит время процессора не ранее чем через 10 мс Еще есть алгоритм Нейгла который может дать вам задержку до 0.2 с Успехов
ранее с Lua/Qpile я не работал. Сейчас прочел хелп по обоим инструментам и пытаюсь оценить подойдут они мне или нет.
Цель: получать данные по большому количеству стаканов 300-500 инструментов. Причем по не самым ликвидным инструментам, так что обновленных значений по этой массе будет около 10 в секунду, с редкими всплесками до 100 в секунду. то есть сам по себе пул информации небольшой по меркам Квика.
для меня доступны два способа: 1) Получать данные по стаканам в LUA и отдавать данные по изменившимся инструментам в таблицу Квик оттуда через DDE во вне (без изменений данных) 2) Делать тоже самое но с обработкой (агрегированием данных стакана) в Lua и уже потом выводить во вне
Общие Вопрос насколько такой план осуществим? Что посоветуете?
Конкретные вопросы: 1) не начнет ли Квик тормозить, сразу после того как я закажу данные стаканов по 300-ам инструментам ( железо современное, но в хелпе написано, что через интерфейс Квик максимум 200 стаканов можно открыть) 2) Из Lua данные отдавать во вне можно только возвращая их в таблицы Квик и оттуда через DDE(ODBC)? или можно как-то напрямую,(как)? 3) Параметры из вне в Lua передают через текстовые файлы? или есть способ лучше?
Всем кто откликнется заранее спасибо.
мечтать не вредно, но бесполезно. Рекомендую считать время обновления информации 0.1...0.5 сек. Остальные расчеты сделайте сами
на самом деле в теме написана не рекурсия, а бесконечный цикл вызова функции с ожиданием события подключения. Это новон слово в программировании. Я бы так не догадался сделать цикл.
Подставим костылик очередной. Только закешировать значения исходного графика при этом имеет смысл...
можно еще проще есть время текущее сравнивайте время свечи с ним (как говорится - используйте определение свечи) и принимайте решение --------- еще вариант - не стройте графиков в пустоту. Не занимайтесь иллюзиями - будущее предсказать невозможно, а воображать его бессмысленно.
и еще... Свеча бывает пустая - т е в ней нет сделок. Но интервал для нее будет выделен. Момент начала не пустой свечи в действительности равен времени первой сделки, но на графике и параметрах свечи это будет начало интервала. Все это потому, что свечи - это упрощенное отображения сделок. А упрощение можно делать до полного безобразия кому и как вздумается.
Николай Камынин написал: синхронизируйте время компа по атомным часам.свеча закрывается всегда точно по указанному кванту времени и выдается "задним числом"т е цена закрытия свечи (close) это цена последней сделки время которой не больше времени закрытия свечи.т е как пропикало закрыть свечу - лови подарок от сервера.можешь не ждать а вычислить сам - можешь даже обогнать.
Что даст вам такой фокус, если в начале нового интервала на вашем "синхронизированном" компе сервер пришлёт данные, относящиеся к предыдущему интервалу времени? Априори нельзя точно сказать, когда закрылась свеча, пока не откроется новая. Причём данные разных потоков не синхронизированы. Т.е., если терминал, например, получил обезличенную сделку с нового интервала, это ещё не значит, что на графике свеча закрылась. Более того, в QUIK обезличенные сделки с одной торговой площадки могут обогнать сделки с другой площадки. Не проверял, но подозреваю, что на графиках та же история. Поскольку данные графиков формируются на стороне сервера по обезличенным сделкам, то теоретически возможен вариант, когда на одном графике (одной торговой площадки) ещё продолжает формироваться старая свеча, а на другом графике (другой торговой площадки) - уже открылась новая свеча.
Вы не правы. Поясню в чем у вас ошибка. --------------------------------- Начну с определения ,которое я написал ранее и поясню подробнее. Что такое свеча? Это сжатое отображение сделок на заданном интервале времени и переход от неравномерной временной шкалы к равномерной,. ------------------------- Т е исходные данные - это поток обезличенных сделок т е цена и время сделки . Чтобы уменьшить объем данных и отобразить эти данные графически применяются различные методы сжатия ------------------------------ один из них - это свечи - которые по сути своей есть отсчеты четырех функций от исходного потока. -------------------------------- Эти отсчеты отображаются на равномерной временной оси. -------------------- Функции вычисляются следующим образом поток сделок разделяется на интервалы таймы по оси времени. Т е в каждый интервал попадут сделки время которых больше левой границы интервала но меньше или равно правой ( знак равенства ставим либо справа либо слева по желанию) Далее в этом интервале берем первую сделку, последнюю , максимум и миниму. Вот и получилась свеча. ------------------------ Каким же образом определить закрытие свечи. Очень просто. Это граница временного интервала. Сделки время которых за этой границей - это новая свеча. именно так и определяет сервер биржи. ----------------------------------- Таким образом, смотрим точное время и когда оно ровно границе - свеча закрылась. Это реальное время. Если Вы синхронизируетесь с атомными часами и биржа тоже с ними синхронизируется. То Вы точно знаете в какой момент реального времени свеча закрыта. ------------------------------------------------------------ После этого момента с сервера брокера к Вам поступят свечи, время которых может быть меньше чем время закрытия свечи и вы их включите в закрытую свечу, но это уже будет не реальное время, а прошлое. ------------------------------------------- С таким же успехом к Вам могут прийти данные вчерашнего дня, которые у вас отсутствовали и вы тоже их включите в прошлые закрытые свечи. --------------------------- Поэтому Все сделки ,,которые Вы получите после границы закрытия свечи по атомным часам с временем меньшим чем реальное - покажут Вам отставание Вашей псевдо реальной торговли от реальности. ------------------------------------ Вы уж определитесь, что Вы хотите узнать -реальность или историю(прошлое). От этого будет зависеть и способ определения времени закрытия свечи на Вашем компьютере.
Николай Камынин написал: Вы сами поняли что написали?У вас в определении функции Restore() нет формальных параметрова в ее вызове Restore(slot_2) появляются
Я то понял, что написал, а вы если помочь не можете, то и не паясничайте!!! Извините, что в функцию в примере параметр забыл вписать, но вы и так прекрасно все поняли, что я написал, а если не поняли, то так понятней?
Код
function Save (slot)
local t = {}
_G[slot] = t
for i = 1 , количества_чего_то do
t[i] = Get_Моя_Функция(которая сохраняется)
end
end
function Restore (Slot)
local t = _G[Slot]
for i = 1 , # t do
Set_Моя_Функция_которая_восстанавливает(t[i])
--t[i] = nil -- если надо очистить
end
end
Код
Save(slot_1)
код
Save(slot_2)
код
Restore(slot_2)
код
Save(slot_3)
код
Restore(slot_3)
код
Restore(slot_1)
так никто и не понял что вы хотите сделать. Пока не объясните что надо словами, а не вашими примерами ------------ могу лишь подсказать что в луа таблицы не копируются я передаются указателем поэтому предположу что ваша задача решается проще, но понять ее из ваших примеров невозможно.
function Save (slot)
local t = {}
_G[slot] = t
for i = 1 , количества_чего_то do
t[i] = Get_Моя_Функция(которая сохраняется)
end
end
function Restore ()
local t = _G[Slot]
for i = 1 , # t do
Set_Моя_Функция_которая_восстанавливает(t[i])
t[i] = nil -- если надо очистить
end
end
Код
Save(slot_1)
код
Save(slot_2)
код
Restore(slot_2)
код
Save(slot_3)
код
Restore(slot_3)
код
Restore(slot_1)
Вы сами поняли что написали? У вас в определении функции Restore() нет формальных параметров а в ее вызове Restore(slot_2) появляются --------------------------------------------- " это не рыба, не заливная рыба, это стрихнин какой-то"
Павел Bosco написал: Добрый день, столкнулся с такой проблемой в последнее время: думал чтобы поменьше грузить Quik, запустить внутри lua, через средства C отдельный поток std::thread и в нём спокойно обрабатывать запросы стороннего приложения, некий сервер квик-данных реализовать.
Но наткнулся на неприятную проблему, несмотря на то что потковая функция, pipe_thread спокойно работает, если её исполнить в основном main потоке (там тот же самый цикл по while (!stopped)), когда я запускаю её в отдельном потоке, я вижу как квик начинает тормозить: медленно открываются все окна, время начинает драматически отставать, и вообще происходят странные вещи: открытый квик и открые часы Windows 10 начинают "замирать", т.е. показывают секунды 1, 2, 9, 15, вместо 1, 2, 3, 4 ...
Может быть кто-нибудь сталкивался с этим? Не было ли в последней версии каких-то критических изменений связанных с синхронизацией и многопоточностью? Сейчас код выглядит так:
Код
int main(lua_State * L){
//// тут мы создаём новый state для отдельного потока
//// см https://kristianrumberg.wordpress.com/ 2010 / 11 / 21 / 135 /
//// https://stackoverflow.com/questions/ 17817452 /lua - 5 - 2 - 2 - broken - threading - system/ 17818481 # 17818481
//// https://forum.quik.ru/ message s/forum10/ message 10476/topic212/ # message 10476
//lua_gc(L, LUA_GCSTOP, 0 );
//lua_State * tL = lua_newthread(L); // здесь tl кладётся в т.ч. стек L
//int thread_L_ref = luaL_ref(L, LUA_REGISTRYINDEX); // создаётся ссылка на объект на верхушке стека
//lua_pushvalue(L, - 1 );
//lua_gc(L, LUA_GCRESTART, 0 );
//stopped = false ;
//std::thread pipeThread(pipe_thread, tL);
//lua_function < lua_Number > lua_Sleep(L, "sleep" );
// while ( ! stopped) {
// lua_Sleep( 1000 );
//}
// pipeThread.join ();
//lua_unref(L, thread_L_ref);
pipe_thread(L);
message (L, "QPIPE: скрипт остановлен" );
return 0 ;
}
Если закомментировать вызов pipe_thread и расскомментировать код, который создаёт отдельный поток, то будут тормоза. Может быть кто-нибудь решал похожую задачу?
давно это было. делал доп потки. ничего не тормозило. Если не читали, то советую проштудировать Джеффри Рихтер .Создание эффективных WIN32 приложений с учетом специфики 64 разрядной версии Windows.