<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Баг в работе скрипта Lua]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Баг в работе скрипта Lua форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Fri, 17 Apr 2026 04:33:50 +0300</pubDate>
		<item>
			<title>Баг в работе скрипта Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79375/topic9238/">Баг в работе скрипта Lua</a></b> <i>В работе скрипта встречается баг, из-за которого у меня ломается весь скрипт:(</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Рекомендую сделать так:<br />--------------------<br />Прочитайте файл один раз в таблицу и работайте с таблицей.<br />При закрытии скрипта сохраняйте таблицу в файл. <br />
			<i>27.08.2025 05:45:08, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79375/topic9238/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79375/topic9238/</guid>
			<pubDate>Wed, 27 Aug 2025 05:45:08 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Баг в работе скрипта Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79374/topic9238/">Баг в работе скрипта Lua</a></b> <i>В работе скрипта встречается баг, из-за которого у меня ломается весь скрипт:(</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			В вашем скрипте вы открываете файл один раз при инициализации:<br />
====code====
<pre>secondfile = io.open('fifobuys.csv', 'r+');
</pre>
=============
<p>После этого в функции OnParam вы пытаетесь пройтись по всем строкам файла</p>
====code====
<pre>for line in secondfile:lines() do … end</pre>
=============
<p>Но после первого прохода файловый дескриптор находится в конце файла.<br /><br />Следующий вызов цикла начинает чтение с конца, поэтому в итоге не читается ни одна строка – условие if tonumber(line) == uprice никогда не выполняется и скрипт «не покупает».<br /><br />Аналогично при удалении строки вы закрываете файл, потом открываете его заново. Это приводит к разного рода гонкам:<br /></p><ul><li>1‑й проход читает строку → переменная line уже содержит всё что было до конца;<br /><li>второй проход пытается прочитать ещё одну строку, но файла нет → цикл завершается сразу.<br /></ul><B>Как исправить</B><p></p><p><br />1. Читайте файл каждый раз, а не держите его открытым</p>
====code====
<pre>local function read_all_lines(filename)
&nbsp;&nbsp;&nbsp;&nbsp;local lines = {}
&nbsp;&nbsp;&nbsp;&nbsp;for line in io.open(filename, "r"):lines() do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(lines, line)
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return lines
end</pre>
=============
<p>2. Записывайте файл целиком после изменения</p>
====code====
<pre>local function write_all_lines(filename, tbl)
&nbsp;&nbsp;&nbsp;&nbsp;local f = io.open(filename, "w")
&nbsp;&nbsp;&nbsp;&nbsp;for _, l in ipairs(tbl) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f:write(l .. "&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;f:close()
end</pre>
=============
<p>3. Удаляйте строку из таблицы и перезаписывайте файл<br /></p>
====code====
<pre>local function remove_line(filename, line_to_remove)
&nbsp;&nbsp;&nbsp;&nbsp;local lines = read_all_lines(filename)
&nbsp;&nbsp;&nbsp;&nbsp;table.remove(lines, line_to_remove)&nbsp;&nbsp; -- 1‑based index
&nbsp;&nbsp;&nbsp;&nbsp;write_all_lines(filename, lines)
end</pre>
=============
<p>4. Инициализация файлов</p>
====code====
<pre>local tradeFile&nbsp;&nbsp; = io.open("FifoTrades.csv", "a")&nbsp;&nbsp; -- открываем для дозаписи

-- Если файл не существует – создаём пустой
if not tradeFile then
&nbsp;&nbsp;&nbsp;&nbsp;tradeFile = io.open("FifoTrades.csv", "w")
end</pre>
=============
<p>tradeFile используется только для записи сделок; его можно держать открытым, но важно закрывать при завершении скрипта</p><p></p> <br />
			<i>26.08.2025 23:34:15, Станислав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79374/topic9238/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79374/topic9238/</guid>
			<pubDate>Tue, 26 Aug 2025 23:34:15 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Баг в работе скрипта Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79372/topic9238/">Баг в работе скрипта Lua</a></b> <i>В работе скрипта встречается баг, из-за которого у меня ломается весь скрипт:(</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Несколько советов.<br />--------------<br />1) &nbsp;все глобальные переменные изначально равны nil.<br />поэтому можно убрать в &nbsp;OnInit()<br />следующие строки: <br /><br />price = nil -- Не трогать.<br />uprice = nil<br />dprice = nil<br />SellPrice = nil<br />KillLine = nil<br />pp = nil<br />---------------------------- &nbsp;<br />2) &nbsp;если &nbsp;переменная не равна nil, то она true. <br />поэтому вместо<br />if uprice ~= nil and dprice ~= nil then<br />можно писать:<br />if uprice &nbsp;and dprice &nbsp;then<br />=====================<br /><br />скрипт трудно читается. Поставьте вывод в лог файл и проверяйте по шагам.<br />Если учитесь программировать, то учитесь отлаживать написанное.<br />--------------------------<br />учебник по луа:<br /><noindex><a href="https://eligovision.ru/media/upload/lua.pdf" target="_blank" rel="nofollow">https://eligovision.ru/media/upload/lua.pdf</a></noindex> <br />
			<i>26.08.2025 13:34:23, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79372/topic9238/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79372/topic9238/</guid>
			<pubDate>Tue, 26 Aug 2025 13:34:23 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Баг в работе скрипта Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79370/topic9238/">Баг в работе скрипта Lua</a></b> <i>В работе скрипта встречается баг, из-за которого у меня ломается весь скрипт:(</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добрый день! Я недавно начал интересоваться программированием Луа скриптов для Квика, недавно написал свой скрипт. В нём он использует 2 базы данных: Одну для записи всех транзакций, чтобы пользователь мог их отслеживать, а вторую для записи &quot;Покупок&quot; Чтобы сам скрипт мог отлеживать текущий лимит и цены за которые он делал транзакции. Суть скрипта довольна проста: В случае роста если до этого цена падала, он сравнивает цены из второй базы данных и если ни одно число не равно текущей цене - он покупает, в случае падения если до этого цена росла и хотя бы одно число из второй базы данных меньше текущей цены - чтобы скрипт продавал и вычеркивал эту строку из базы данных. По какой-то причине когда я запускаю скрипт, он не сравнивает никакие цены, соответственно не работает корректно. Помогите мне пожалуйста, я недавно начал и в подобном плохо разбраюсь.<br />Сам скрипт:<br />unction OnInit()<br />	--Настройки, изменять при надобности.--<br />	class = &quot;QJSIM&quot; -- Тип интсрумента<br />	sec = &quot;SBER&quot; -- Код интсрумента<br />	account = &quot;NL0011100043&quot; -- Номер аккаунта, тут всё понятно<br />	LotSize = 1 -- Кол-во лотов в заявке.<br />	step = 0.01 -- Шаг цены.<br />	limit = 10 -- Лимит торговли<br />	<br />	tid = 0 -- Не трогать!<br />	trz_comment = &quot;FIFO-3 --&gt; &quot; -- Не трогать.<br />	price = nil -- Не трогать.<br />	uprice = nil<br />	dprice = nil<br />	TradeNums = {}<br />	sfilename = &quot;fifobuys&quot;<br />	SellPrice = nil<br />	KillLine = nil<br />	pp = nil<br />	secondfile = io.open(&#39;fifobuys.csv&#39;, &#39;r+&#39;);<br />	file = io.open(&quot;FifoTrades.csv&quot;, &quot;r+&quot;);<br />end<br /><br />function LimitSpot(operation, SpotPrice)<br />tid = tid+1<br />	transaction={<br />		&#91;&quot;TRANS_ID&quot;&#93;=tostring(tid),<br />		&#91;&quot;ACTION&quot;&#93;=&quot;NEW_ORDER&quot;,<br />		&#91;&quot;CLASSCODE&quot;&#93;=class,<br />		&#91;&quot;SECCODE&quot;&#93;=sec,<br />		&#91;&quot;OPERATION&quot;&#93;=operation,<br />		&#91;&quot;QUANTITY&quot;&#93;=tostring(LotSize),<br />		&#91;&quot;PRICE&quot;&#93;=tostring(SpotPrice),<br />		&#91;&quot;ACCOUNT&quot;&#93;=tostring(account),<br />		&#91;&quot;EXECUTION_CONDITION&quot;&#93;=&quot;PUT_IN_QUEUE&quot;,	-- тип заявки лимитная<br />	}<br />	res = sendTransaction(transaction)<br />	if res ~= &#39;&#39; then<br />		message(trz_comment..&#39;Transaction Error! &#39;..res)<br />		else<br />		message(trz_comment..&#39;Transaction Success! ID = &#39;..tid)<br />	end<br />end<br /><br />function math_round( roundIn , roundDig ) -- первый аргумент число для округления, второй - количество знаков после запятой <br /> &nbsp; &nbsp; local mul = 10^roundDig<br /> &nbsp; &nbsp; return ( math.floor( ( roundIn * mul ) + 0.5 )/mul )<br />end<br /><br />function main()<br />	do_main = true<br />	message(trz_comment..&quot;Start.&quot;)<br />	climit = 0<br /><br />	while do_main do<br />		sleep(1000)<br />	end<br />end<br /><br />function OnParam(class1, sec1)<br />	if class1 == class and sec1 == sec then<br />		local F = 0<br />		local current_line = 0<br />		price = math_round(getParamEx(class, &nbsp;sec, &quot;offer&quot;).param_value, 2)<br />	if uprice ~= nil and dprice ~= nil then<br />		if price &gt;= uprice then<br />			for line in secondfile:lines() do<br />				if tonumber(line) == uprice and pp == 0 then F = F+1; end<br />			end<br />			<br />			if F == 0 and limit ~= climit then LimitSpot(&#39;B&#39;, uprice); end<br />				uprice = uprice + step<br />				dprice = dprice + step<br />				message(&#39;price++ -&gt; &#39;..uprice)<br />				pp = 1<br />			else if price &lt;= dprice then<br />				for line in secondfile:lines() do<br />					current_line = current_line + 1<br />					if tonumber(line) &lt; dprice and pp == 1 then LimitSpot(&#39;S&#39;, dprice ); remove_line_from_csv(sfilename, current_line); break end<br />				end<br />						dprice = dprice-step<br />						uprice = uprice-step<br />						message(&#39;Price-- -&gt; &#39;..dprice)<br />						pp = 0<br />					end<br />				end<br />end<br />	end<br />end<br /><br />function OnTrade(trade)<br />	if trade.sec_code == sec and trade.class_code == class then<br />		if uprice == nil then<br />			uprice = trade.price + step<br />			dprice = trade.price - step<br />		end<br />		t = bit.band(tonumber(trade&#91;&#39;flags&#39;&#93;),4) -- 1 = sell 0 = buy<br />		if t == 0 then message(trz_comment..&quot;buy &quot;..trade.price); Op = &quot;Buy&quot;; climit = climit + 1;<br />			secondfile:write(trade.price..&#39;\n&#39;); <br />			secondfile:flush(); <br />		else message(trz_comment..&quot;Sell &quot;..trade.price); climit = climit - 1; Op = &quot;Sell&quot;;<br />		 end<br /><br />		for i=#TradeNums,1,-1 do<br />		if TradeNums&#91;i&#93; == trade.trade_num then return; end;<br />	end<br /><br />		-- Если мы здесь, значит сделка не была найдена в числе уже записанных<br />	-- Добавляет в массив номер новой сделки<br />	TradeNums&#91;#TradeNums + 1&#93; = trade.trade_num;<br />	-- Вычисляет операцию сделки<br />	-- Создает строку сделки для записи в файл (&quot;Дата и время;Код класса;Код бумаги;Номер сделки;Номер заявки;Операция;Цена;Количество\n&quot;)<br />	local TradeLine = 	os.date(&quot;%c&quot;, os.time(trade.datetime))..&quot;;&quot;..<br />						trade.class_code..&quot;;&quot;..<br />						trade.sec_code..&quot;;&quot;..<br />						trade.trade_num..&quot;;&quot;..<br />						trade.order_num..&quot;;&quot;..<br />						Op..&quot;;&quot;..<br />						trade.price..&quot;;&quot;..<br />						trade.qty..&quot;\n&quot;;<br />	-- Записывает строку в файл<br />	file:write(TradeLine);<br />	-- Сохраняет изменения в файле<br />	file:flush();<br />end<br />end<br /><br /><br />function remove_line_from_csv(filename, line_to_remove)<br /> &nbsp;secondfile:close()<br /> &nbsp;local input_file = io.open(filename..&quot;.csv&quot;, &quot;r&quot;)<br /> &nbsp;if not input_file then<br /> &nbsp; &nbsp;print(&quot;Ошибка открытия файла для чтения&quot;)<br /> &nbsp; &nbsp;return false<br /> &nbsp;end<br /><br /> &nbsp;local temp_filename = filename .. &quot;.tmp&quot;<br /> &nbsp;local output_file = io.open(temp_filename, &quot;w&quot;)<br /> &nbsp;if not output_file then<br /> &nbsp; &nbsp;print(&quot;Ошибка открытия временного файла для записи&quot;)<br /> &nbsp; &nbsp;input_file:close()<br /> &nbsp; &nbsp;return false<br /> &nbsp;end<br /><br /> &nbsp;local line_number = 1<br /> &nbsp;for line in input_file:lines() do<br /> &nbsp; &nbsp;if line_number ~= line_to_remove then<br /> &nbsp; &nbsp; &nbsp;output_file:write(line .. &quot;\n&quot;)<br /> &nbsp; &nbsp;end<br /> &nbsp; &nbsp;line_number = line_number + 1<br /> &nbsp;end<br /><br /> &nbsp;input_file:close()<br /> &nbsp;output_file:close()<br /> &nbsp;-- Удаляем старый файл и переименовываем временный<br /> os.remove(filename..&#39;.csv&#39;)<br /> &nbsp;os.rename(temp_filename, filename..&quot;.csv&quot;)<br /> &nbsp;message(&quot;deleted&quot;)<br /> &nbsp;secondfile = io.open(filename..&#39;.csv&#39;, &#39;r+&#39;)<br />end <br />
			<i>26.08.2025 11:19:58, DimastaBalz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79370/topic9238/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79370/topic9238/</guid>
			<pubDate>Tue, 26 Aug 2025 11:19:58 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
