Приклад роботи з файлами QLua (Lua), BOT
Свіжі записи
Приклад роботи з файлами QLua (Lua)

Дмитре, вітаю! Зіткнувся з таким: коли запускається квік, то повинен автоматично запускається мій скрипт на lua, але скрипт видає помилку ". 32: bad argument #1 to 'write' (string expected, got nil)". Далі я запускаю його вручну і все йде як слід. Шлях до файлу прописаний як:
Що може впливати на це чи є думки тока поправити?
У Вас ось цей рядок повертає щось не то 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
може це знадобиться:
Дмитре, дякую, але ще постараюся уточнитись. Як запросити сьогодні вчорашню дату, щоб потім її асоціювати з ім'ям файлу і вважати його.
А ось знайшов: getParamEx("SPBFUT", "RIZ5", "PREVDATE").param_value); отримуємо дату попереднього торгового дня, дякую, пробуватиму
Як це не дивно, але при запиті getParamEx("SPBFUT", "RIZ5", "PREVDATE").param_type) результат 0. Чому таке може бути?
Можливо, це старий параметр, який згодом перестали використовувати, тому що в Поточній таблиці параметрів немає такої колонки.
Дмитре, підкажіть, як отриманий рядок (80549; 30) розділити на два числа, щоб записати їх у масив. Заздалегідь дякую.
Добридень! Дуже дякую за скрипт. Дуже багато корисної інформації і є над чим порозібратися.
Юрію, перепрошую, але знайшов помилку в скрипті! Неправильно розраховувався прибуток позиції з ф'ючерсу (675 рядок). У статті виправив, виправте у себе, будь ласка.
function zakritie() -- дії зворотні входу в позицію-- --так само підрахунок середніх цін виходу --розрахунок профіту end
Юрію, підкажіть, опціон потрібно купувати найближчий до поточної ціни ф'ючерсу, чи найближчий зверху, чи найближчий знизу?
Питання зняте, я зроблю в таблиці поля для введення кодів опціону та ф'ючерсу для відкриття.
Юрію, привіт! Доробив скрипт, вивчайте, там достатньобагато коду вийшло, тож, якщо з'являться питання, обов'язково ставте!
Чесно кажучи, я сподіваюся, що з Вашого прикладу, як ЗАВЖДИ, стане зрозумілим принцип роботи, і зробити зворотну операцію вийде самостійно. А відповідаючи на Ваше запитання, треба щоб скрипт записав інформацію про набрану позицію, далі хотілося, щоб скрипт записалася інформація про суму профіту і про те, що він знову готовий до набору позиції. Важко розповісти, що хочу, не розуміючи принципу роботи, але може для зручності (так у моєму скрипті) додати функцію: function zakritie()
річ у тому, що я попросив як приклад на минулому прикладі. Але мені потрібний саме запис у файл (логування), тому що на одному рахунку торгується кілька стратегій і ще ведеться торгівля руками, та й треба навчиться працювати з логуванням.
Юрію, підкажіть, будь ласка, як скрипт повинен зрозуміти, що прибуток отриманий і можна набирати новий стреддл? Тобто. схема така: Ви запускаєте скрипт, він набирає стреддл, записує у файл, що стреддл набрано. При наступному запуску скрипт читає файл, там відповідно написано, що стреддл набраний і скрипт нічого далі не робить. Вам потрібно, щоб скрипт за якоюсь подією видаляв з файлу інформацію, чи буде достатньо того, що при закритті стреддла Ви просто видалите цей файл і скрипт почне все заново?
Юрію, привіт! Змінив Ваш скрипт, вирішив, що в даному випадку немає сенсу використовувати файли, перевіряйте!
Доброго дня, чудово наткнувся на Ваш ресурс. Дуже хороший ресурс, сподіваюся продовжуватиметься. Нещодавно я поставив за мету зробити зчитування відкритих позицій з Квіка з таблиці лімітів з паперів + вільних коштів і записати певним чином у файл. У результаті зробив на Qpale (файл тут: https://dropmefiles.com/dd32j).Це потрібно для зчитування іншою програмою. Але тести показали, що це не настільки надійно, наскільки це можна зробити в QLua. Не могли б Ви мені допомогти переробити вказаний код на Qlua, боюся у мене це вийде не скоро, т.к. Qlua для мене поки що "нові ворота"))). Дякую за розуміння.
Вітаю! Дякуємо за добрі слова, ресурс обов'язково буде продовжуватися та розвиватися. Я, відверто кажучи, з QPILE взагалі не знайомий, т.к. коли я зацікавився цією конкретною тематикою, вже була QLua. Але завдання Ваше, як я бачу, не складне. Якщо Ви знаєте QPILE, то ставте конкретні питання на кшталт, як у QLua отримати такі дані, або вирішити таке завдання, з радістю Вам відповім.
Якщо Ви хочете, щоб я без Вашої участі надав Вам готове рішення, це тільки за гроші 🙂
Дмитро все зрозумів. Я не знавець QPILE, та й не програміст, просто дуже велике бажання зробити розпочате. Я збираю робота, правда не на Qlua, а надалі є такі плани. Поки що роблю у зв'язці Amibroker + Quik через бібліотеку з відомого українськомовного ресурсу Amibroker. У мене зчитування відкритих позицій виконується через файл-посередник, саме тому я і потрапив сюди. Тут багато корисної інформації, сподіваюся їй скористатися при написанні вищезгаданого скриптика на Qlua, але прочитавши частину вже каша в голові. Тоді з Вашого дозволу поставлю поки що навідні питання, можливо вдасться зробити самому, що буде не зайвим. Чи можна попросити Вас дати приклад зчитування з таблиці "Лімітів за паперами" кількість придбаних лотів за всіма інструментами цієї таблиці з лімітом T+2. Запис у файл вже тут Вами добре описана, думаю спробую сам та й вільні ДС за аналогією методу зчитування лотів теж спробую. У будь-якому разі дякую.
Це те що вам треба?
Завжди будь ласка! Просто вставте цей код у Ваш скрипт (у скрипті більше може нічого не бути), запустіть скрипт у терміналі та дивіться, що виводиться в повідомленнях.
Дякую, за наведення на статтю. Код вже кручу за аналогією з кодом із шапки цієї теми. Вже вивів повідомлення. Ще питання. Цей код виводитиме лише останнє значення з таблиці чи це обмеження спливаючого вікна? Я пробую ось так:
Правильно я розумію, що має випливати повідомлення кожні 0,4 секунди? Але у мене чомусь скрипт запускається на відтворення, але вікно виводиться 1 раз і після закриття більше не спливає. Хоча можливо так і має бути, поки що глибше не капав.
Перепрошую, мабуть зрозумів чому не крутить відтворення повідомлення по колу, зрозумів коли прочитав Вашу вступну статтю.
Якщо у Вас версія QUIK 7, то "5" "Створити вікно" -> "Всі види вікон" -> "Інше" -> "Таблиця повідомлень", це відкриє таблицю, де виводитимуться всі повідомлення. А щоб вони ще не з'являлися у вигляді спливаючих вікон, зробіть наступне: "Система" - "Налаштування" - "Основні налаштування" - "Повідомлення", зніміть там галочку "Показувати вікно повідомлень" та натисніть "ОК"
цикл for перебирає всі рядки таблиці лімітів і для кожного рядка, якщо ліміт Т0, виводить повідомлення, але оскільки повідомлення надходять дуже швидко, Ви бачите тільки останнє повідомлення, хоча їх там кілька, якщо у Вас кілька паперів Т0 у таблиці, відкрийте таблицю повідомлень , як я написав в інструкції і Вам стане зрозуміліше, як працює скрипт, і Ви зможете користуватися функцією message для налагодження роботи скрипта, виводячи потрібну інформацію в потрібних місцях роботи скрипта, а в таблиці повідомлень Ви бачитимете своєрідний лог роботи скрипта.
А ось цікавочи здатний QLua на таку річ: Є відповідно цикл, що повторюється через рівні проміжки часу, який бере значення по 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 записується в файл закривається. Дані у файлі зберігаються все - ок, але чи можна зробити щоб було так: Що б з початком нового циклу і нового значення RSI нове значення RSI не перезаписувало старе, а вставлялася на рядок нижче ? І щоб ці зміни можна було спостерігати у файлі без його закриття та подальшого відкриття?