1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | -- Флаг поддержания работы скрипта IsRun = true; function main() -- Пытается открыть файл в режиме "чтения/записи" f = io.open(getScriptPath().."\\Test.txt","r+"); -- Если файл не существует if f == nil then -- Создает файл в режиме "записи" f = io.open(getScriptPath().."\\Test.txt","w"); -- Закрывает файл f:close(); -- Открывает уже существующий файл в режиме "чтения/записи" f = io.open(getScriptPath().."\\Test.txt","r+"); end; -- Записывает в файл 2 строки f:write("Line1\nLine2"); -- "\n" признак конца строки -- Сохраняет изменения в файле f:flush(); -- Встает в начало файла -- 1-ым параметром задается относительно чего будет смещение: "set" - начало, "cur" - текущая позиция, "end" - конец файла -- 2-ым параметром задается смещение f:seek("set",0); -- Перебирает строки файла, выводит их содержимое в сообщениях for line in f:lines() do message(tostring(line));end -- Закрывает файл f:close(); -- Цикл будет выполнятся, пока IsRun == true while IsRun do sleep(100); end; end; function OnStop() IsRun = false; end; |
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!
Дмитрий, приветствую! Столкнулся с таким вот: когда запускается квик, то должен автоматически запускается мой скрипт на lua, но скрипт выдает ошибку "...32: bad argument #1 to 'write' (string expected, got nil)". Далее я запускаю его вручную и всё идет как надо. Путь к файлу прописан как:
Что может влиять на это или есть мысли то ка поправить?
Поменял на
думал, что знак подчеркивания или путь смущают LUA, но теперь ошибка с таким вот кодом: "...:28: bad argument #1 to 'write' (string expected, got nil)". Файл не затираю перед включением, хотя делал и так и так - результат один. Вот ссылка на код: http://файлообменник.рф/02k5fslnpopl.html
У Вас вот эта строка возвращает что-то не то
money = getPortfolioInfoEx (firm_id, client_code, limit_kind)
возможно в тот момент когда скрипт запускается, в таблицу еще не подгрузились значения
Спасибо за ответ! Действительно надо сделать там проверку на nil. А цифры - это не код ошибки а номер строки, где ошибка - не зал. Буду исправляться.)))
Ваше предположение было абсолютно верно. Данная запись убрала ошибку:
Рад, что у Вас все получилось !
Это всё благодаря хорошему учителю!!!
Ну прям захвалили меня сегодня, спасибо 🙂
Здравствуйте, Денис! Ошибка переводится как: в строке 32 неверный аргумент под номером 1 в функции write (ожидалась строка, а вместо нее nil). Смотрите что Вы пытаетесь записать в файл в строке 32 и почему там nil (nil означает, что нет никакого значения)
Благодарю за пояснения в части просмотра работы ввиде лога, может пригодиться при отладке. Вот, что получилось с первого наскока
Прошу Вас посмотреть, возможно что то плохо усвоил. Есть еще вопросы: - как в начале открывания файла затирать все, что там было записано ранее, т.е. при предыдущем прогоне скрипта? - как правильно записать путь для места записи файла, например в корень диска с:?
Дмитрий! Я правильно понимаю, что куда я скопирую скрипт Qlua, туда и будет писаться файл? По крайней мере не нашел пока иного варианта с указанием пути для записи файла.
Чтобы файл гарантированно создавался в той же папке, где скрипт, нужно делать так:
f = io.open(getScriptPath().."\\param.ini", "w")
https://quikluacsharp.ru/qlua-osnovy/servisnye-funktsii-qlua-lua/
Во первых, все слеши нужно экранировать вторым слешем: f = io.open("C:\\param.ini","w");
Во вторых, чтобы создать файл на диске C, нужно запускать терминал от имени администратора.
В третьих, чтобы перезаписывать все содержимое файла достаточно открывать его в режиме записи "w", т.е.:
Каждый новый вызов этого кода будет перезаписывать существующий файл
Гениально!!!!Получилось. Просто чудесно. Завтра попытаюсь дополнить скрипт свободными денежными средствами из таблицы лимитов по ДС и всё, что я хотел готово. Хотя еще останется изучить создание таблиц из этих данных, т.е. сведение нужных данных из разных таблиц в единую. Благодарю, без Вас бы я до сих пор бы мануал пытался бы осилить. Спасибо!
Рад за Вас! Всегда пожалуйста!
А нет, кажется понял, получается main() выполнится один раз, а затем зависнет в цикле пока скрипт не остановят..
Здравствуйте, Вы правильно поняли, и делается это потому, что пока работает функция main, работает и скрипт, если не делать этот цикл, то функция main сработает 1 раз и скрипт остановится.
А если isRun будет false, то main() будет выполняться без задержки в 100мс. Правильно?
Добрый день, спасибо за помощь и информацию, которой делитесь с нами. Есть скрипт, который сохраняет в файл данные (цену и объем по Ri) из таблицы всех сделок. Файл создается ежедневно, с именем текущего дня. Нужен скрипт(профиль рынка), который бы считывал данные за предыдущий день, суммировал объемы по одной цене и выводил графически либо в таблицу. Т.е. нужно видеть цену максимального горизонтального объема за прошлый день. На данный момент вопрос встал в загрузке файла предыдущего дня, подскажите, как это сделать.
Скрипт сохранения данных:
Заранее благодарю.
Всегда пожалуйста!
Дмитрий, вопрос больше в том, как из кучи файлов выбрать тот, который нужно. Т.е. в папке лежат файлики за каждый день с именем например 09.10.15.txt. Как мне прочитать файлик 08.10.15.txt
может это пригодится:
Дмитрий, спасибо, но еще постараюсь уточниться.
Как запросить сегодня вчерашнюю дату, что бы потом ее ассоциировать с именем файла и считать его.
можете, например, getInfoParam ("TRADEDATE") -- вернет строку типа "09.10.2015"
можете из таблицы всех сделок взять дату последней сделки
А вот нашел:
getParamEx("SPBFUT", "RIZ5", "PREVDATE").param_value); получаем дату предыдущего торгового дня, спасибо, буду пробовать
Как ни странно, но при запросе getParamEx("SPBFUT", "RIZ5", "PREVDATE").param_type) результат 0. Почему такое может быть?
Возможно это старый параметр, который впоследствии перестали использовать, потому что в Текущей таблице параметров нет такой колонки.
Дмитрий, подскажите, как полученную строку (80549; 30) разделить на два числа, чтобы записать их в дальнейшем в массив.
Заранее благодарю.
Добрый день! Спасибо большое за скрипт!!! Очень много полезной информации и есть над чем поразбираться.
Юрий, прошу прощения, но нашел ошибку в скрипте! Неправильно рассчитывался профит позиции по фьючерсу (675 строка). В статье исправил, исправьте у себя, пожалуйста.
Да спасибо!
function zakritie()
-- действия обратные входу в позицию--
--так же подсчет средних цен выхода
--расчет профита
end
Юрий, подскажите, опцион нужно покупать самый ближайший к текущей цене фьючерса, или ближайший сверху, или ближайший снизу?
Вопрос снят, я сделаю в таблице поля для ввода кодов опциона и фьючерса для открытия.
Юрий, здравствуйте! Доделал скрипт, изучайте, там достаточно много кода получилось, так что, если появятся вопросы, обязательно задавайте!
Честно говоря я надеюсь, что из Вашего примера, как ВСЕГДА, станет понятен принцип работы, и сделать обратную операцию получится самостоятельно. А отвечая на Ваш вопрос, надо чтобы скрипт записал информацию о набранной позиции, далее хотелось, чтобы в скрипт записалась информация о сумме профита и о том что он опять готов к набору позиции. Тяжело рассказать что хочу, не понимая принципа работы, но может для удобства (так в моем скрипте) добавить функцию:
function zakritie()
дело в том, что я попросил как пример на прошлом примере. Но мне надо именно запись в файл (логирование), так как на одном счете торгуется несколько стратегий и еще ведется торговля руками, да и надо научится работать с логированием.
Юрий, подскажите, пожалуйста, как скрипт должен понять, что профит получен и можно набирать новый стреддл? Т.е. схема такая: Вы запускаете скрипт, он набирает стреддл, записывает в файл, что стреддл набран. При следующем запуске скрипт читает файл, там, соответственно, написано, что стреддл набран и скрипт ничего дальше не делает. Вам нужно, чтоб скрипт по какому-то событию удалял из файла информацию, или будет достаточно того, что при закрытии стреддла, Вы просто удалите этот файл и скрипт начнет все заново?
подскажите пожалуйста: что, как и когда надо записывать в файл (логировать), чтобы наша программа зайдя в позиции, могла через несколько дней (при её запуске) понимать, что позиция набрана и надо дожидаться профита . Наверное сохранение (запись) нынешних "параметров" надо поместить в функцию OnStop(), а считывание информации в Init(). Однако как это сделать не понимаю, да и еще чтобы не повторить еще один вход в позицию. Пожалуйста приведите пример (хорошо бы на Вашем примере от 29.04.2015 В 20:02 (https://quikluacsharp.ru/quik-qlua/poluchenie-obezlichennyh-sdelok-iz-quik-v-qlua-lua/#comment-101) после покупки стрэддла (купили 2 Пута + продали 1 фьючерс). Заранее спасибо.
Юрий, здравствуйте! Изменил Ваш скрипт, решил, что в данном случае нет смысла использовать файлы, проверяйте!
Добрый день, чудесным образом наткнулся на Ваш ресурс. Очень хороший ресурс, надеюсь будет продолжаться. Недавно я задался целью сделать считывание открытых позиций из Квика из таблицы лимитов по бумагам + свободных денежных средств и записать определенным образом в файл. В итоге сделал на Qpale ( файл тут: https://dropmefiles.com/dd32j . Это нужно для считывания другой программой. Но тесты показали, что это не настолько надежно на сколько это можно сделать в QLua.
Не могли бы Вы мне помочь переделать указанный код но на Qlua, боюсь у меня это получится не скоро, т.к. Qlua для меня пока "новые ворота"))). Благодарю за понимание.
Здравствуйте! Спасибо за добрые слова, ресурс обязательно будет прдолжаться и развиваться. Я, честно говоря, с QPILE вообще не знаком, т.к. когда я заинтересовался этой конкретной тематикой уже была QLua. Но задача Ваша, как я вижу, не сложная. Если Вы знаете QPILE, то задавайте конкретные вопросы типа, как в QLua получить такие-то данные, или решить такую-то задачу, с радостью Вам отвечу.
Если Вы хотите, чтобы я без Вашего участия предоставил Вам готовое решение, то это только за деньги 🙂
Дмитрий, всё понял. Я не знаток QPILE, да и не программист, просто очень велико желание сделать начатое. Я собираю робота, правда не на Qlua, а в дальнейшем есть и такие планы. Пока делаю в связке Amibroker + Quik через библиотеку с известного русскоязычного ресурса по Amibroker. У меня считывание открытых позиций выполняется через файл-посредник, вот именно поэтому я и попал сюда. Тут много полезной информации, надеюсь ей воспользоваться при написании вышеуказанного скриптика на Qlua, но прочитав часть уже каша в голове. Тогда с Вашего разрешения задам пока наводящие вопросы, возможно получится сделать самому, что будет не лишним. Можно ли попросить Вас дать пример считывания из таблицы "Лимитов по бумагам" число приобретенных лотов по всем инструментам из этой таблицы с лимитом T+2. Запись в файл уже здесь Вами хорошо описана, думаю попробую сам да и свободные ДС по аналогии метода считывания лотов тоже сам попробую. В любом случае спасибо.
Это то, что Вам нужно?
Спасибо, оперативно! С наскока пока трудно сказать, надо изучить Ваш пример, а т.к. я полный ноль в Qlua, то буду читать и образовываться по манулу. Еще раз благодарю за оперативность.
Всегда пожалуйста!
Просто вставьте этот код в Ваш скрипт (в скрипте больше может ничего не быть), запустите скрипт в терминале и смотрите что выводится в сообщениях.
Ознакомьтесь с этой статьей, для начала, если еще не видели.
https://quikluacsharp.ru/qlua-osnovy/baza-skripta-v-qlua/
Спасибо, за наводку на статью. Код уже кручу по аналогии с кодом из шапки этой темы. Уже вывел сообщение. Еще вопрос. Этот код будет выводить только последнее значение из таблицы или это ограничения всплывающего окна?
Я пробую вот так:
Правильно я понимаю, что должно всплывать сообщение каждые 0,4 секунды? Но у меня почему то скрипт запускается на воспроизведение, но окно выводится 1 раз и после закрытия больше не всплывает. Хотя возможно так и должно быть, пока глубже не капал.
Прошу прощения, кажись понял почему не крутит воспроизведение сообщения по кругу, понял когда прочитал Вашу вступительную статью.
Рекомендую Вам сделать следующее:
Если версия QUIK ниже 7, то
для более удобного просмотра информации, выводимой при помощи функции message(), используйте таблицу сообщений (меню: "Сообщения"->"Системные сообщения"->"Таблица сообщений..."). А также, снимите флажок "Показывать окно сообщений" в меню: "Настройки"->"Основные..."->"Сообщения".
Если у Вас версия QUIK 7, то
"Создать окно" -> "Все типы окон" -> "Прочее" -> "Таблица сообщений", это откроет таблицу, где будут выводиться все сообщения. А чтобы они еще не появлялись в виде всплывающих окон, сделайте следующее: "Система" - "Настройки" - "Основные настройки" - "Сообщения", снимите там галочку "Показывать окно сообщений" и нажмите "ОК"
Еще, на сайте допускается не более 10 вложенных комментариев, так что пишите новый комментарий, как комментарий к статье, а не ответ на мой комментарий, т.е. начните новую ветку. Мне приходит уведомление обо всех комментариях, так что я не пропущу.
цикл for перебирает все строки таблицы лимитов и для каждой строки, если лимит Т0, выводит сообщение, но так как сообщения приходят очень быстро, Вы видите только последнее сообщение, хотя их там несколько, если у Вас несколько бумаг Т0 в таблице, откройте таблицу сообщений, как я написал в инструкции и Вам станет понятнее как работает скрипт, и Вы сможете пользоваться функцией message для отладки работы скрипта, выводя нужную информацию в нужных местах работы скрипта, а в таблице сообщений Вы будете видеть своеобразный лог работы скрипта.
Здравствуйте,
А вот интересно способен ли QLua на такую вещь: Есть соответственно цикл повторяющийся через равные промежутки времени, который берет значения по RSIх в и записывает их в текстовый файл:
local N=getNumCandles("RSI")
t,n,i=getCandlesByIndex("RSI", 0, N-10, 10)
Znach = t[9].close
Znach1 = t[1].close
l_file=io.open("C:\\RSI\\rsi_i"..".txt", "w")
l_file:write(tostring(Znach).."\n")
l_file:close()
Но вот вопрос: Начинается новый цикл, берется новое значение RSI записывается в файл закрывается. Данные в файле сохраняются все - ок, но можно ли сделать чтобы было так: Что бы с началом новjго цикла и нового значения RSI -то новое значение RSI не перезаписывало старое, а вставлялась на строку ниже ? И чтобы эти изменения можно было наблюдать в файле без его закрытия и последующего открытия ?
Здравствуйте! Задавайте, пожалуйста, вопросы новым комментарием к статье, а не в конце существующих обсуждений, на сайте допускается максимум 10 вложенных комментариев.
Строку l_file=io.open("C:\\RSI\\rsi_i"..".txt", "w") нужно поместить до цикла, а строку l_file:close() после цикла, чтобы изменения сразу же были видны в файле, нужно после строки l_file:write(tostring(Znach).."\n") добавить строку l_file:flush()