<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi. форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Fri, 17 Apr 2026 23:48:33 +0300</pubDate>
		<item>
			<title>Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30259/topic3542/">Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_7hEJ3bdz" href="/user/1097/" bx-tooltip-user-id="1097">Andrey Perchits</a> написал:<br />Тем не менее, должен заметить, что проблема до конца не решается. Судя по официальной информации, диапазон поддерживаемых целых чисел ограничен 100 000 000 000 000. &nbsp; <noindex><a href="https://www.lua.org/pil/2.3.html" target="_blank" rel="nofollow">https://www.lua.org/pil/2.3.html</a></noindex> <br />=============<br />Тогда уже, если развить тему, то число, указанное в документации Lua, не совсем точное. Не знаю почему так.<br /><br />На самом деле границы диапазона взаимно-однозначного перевода целых чисел между типами double и __int64 составляют:
====code====
<pre>&#91;±9007199254740992&#93; (&#91;±2^53&#93;)</pre>
=============
Это чуть более чем в 90 раз больше, чем по документации Lua:
====code====
<pre>&nbsp;&nbsp;100,000,000,000,000 (max: lua docs)
9,007,199,254,740,992 (max: double-precision IEEE 754)</pre>
=============
То-есть, в строковом представлении число длиной в 15 десятичных цифр точно. (16 цифр неполностью)<br /><br />Судя по описанию торговой платформы ASTS (Фондовый и Валютный рынки МосБиржи), которое я нашёл,<br />идентификационный номер заявки в Торговой Системе — поле ORDERNO, имеет тип INTEGER и размер 12.<br />То-есть задаётся строкой длиной в 12 символов, или соответственно числом длиной 12 цифр.<br />Что на приблизительно 2-е цифры больше чем максимально-возможное значение 32-хбитного типа int,<br />но гораздо меньше, чем максимально-возможное точное целочисленное значение типа double:<br />
====code====
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4,294,967,296 (2^32) — тип int
9,007,199,254,740,992 (2^53) — тип double
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;000,000,000,000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;— поле ORDERNO, тип INTEGER, 12 цифр</pre>
=============
Так что, получается, что типа lua_Number (от же double) достаточно для точной передачи номера заявки в торговой системе Фондового и Валютного рынков МосБиржи. <br />
			<i>05.04.2018 18:38:07, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30259/topic3542/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30259/topic3542/</guid>
			<pubDate>Thu, 05 Apr 2018 18:38:07 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30243/topic3542/">Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_gy72bqzh" href="/user/901/" bx-tooltip-user-id="901">Suntor</a> написал:<br /><br />====quote====<br /> SG &nbsp; написал:<br />У вас переполнение типа int. Номера заявок и сделок - это 64-битные целые числа.<br />=============<br />SG прав...<br /><br />ошибка в строчке:
====code====
<pre>&nbsp;&nbsp;int N&nbsp;&nbsp;=&nbsp;&nbsp;lua_tonumber(L,&nbsp;&nbsp;-&nbsp;&nbsp;1 );&nbsp;&nbsp;</pre>
=============
добавлю только, что судя по определению:
====code====
<pre>&nbsp;&nbsp;typedef double lua_Number;
lua_Number lua_tonumber (lua_State&nbsp;&nbsp;* L, int index);
&nbsp;&nbsp;</pre>
=============
произошло преобразование значения типа double превышающего максимально возможное значение типа int, в результате чего было получено значение INT_MIN из &lt;climits&gt; (limits.h)
====code====
<pre>&nbsp;&nbsp; # define INT_MIN&nbsp;&nbsp;&nbsp;&nbsp; ( -&nbsp;&nbsp;2147483647&nbsp;&nbsp; -&nbsp;&nbsp; 1 ) / *&nbsp;&nbsp;minimum (signed) int value&nbsp;&nbsp;* /&nbsp;&nbsp;</pre>
=============
<br />=============<br />Тем не менее, должен заметить, что проблема до конца не решается. Судя по официальной информации, диапазон поддерживаемых целых чисел ограничен 100 000 000 000 000. &nbsp;<noindex><a href="https://www.lua.org/pil/2.3.html" target="_blank" rel="nofollow">https://www.lua.org/pil/2.3.html</a></noindex> <br />
			<i>05.04.2018 12:39:42, Andrey Perchits.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30243/topic3542/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30243/topic3542/</guid>
			<pubDate>Thu, 05 Apr 2018 12:39:42 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30240/topic3542/">Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вы правы господа, не думал что order_num превысит int. <br />
			<i>05.04.2018 10:29:02, Андрей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30240/topic3542/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30240/topic3542/</guid>
			<pubDate>Thu, 05 Apr 2018 10:29:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30232/topic3542/">Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_HhCzQoHr" href="/user/2799/" bx-tooltip-user-id="2799">SG</a> написал:<br />У вас переполнение типа int. Номера заявок и сделок - это 64-битные целые числа.<br />=============<br />SG прав...<br /><br />ошибка в строчке:
====code====
<pre>int N = lua_tonumber(L, -1);</pre>
=============
добавлю только, что судя по определению:
====code====
<pre>typedef double lua_Number;
lua_Number lua_tonumber (lua_State *L, int index);
</pre>
=============
произошло преобразование значения типа double превышающего максимально возможное значение типа int, в результате чего было получено значение INT_MIN из &lt;climits&gt; (limits.h)
====code====
<pre>#define INT_MIN&nbsp;&nbsp;&nbsp;&nbsp; (-2147483647 - 1) /* minimum (signed) int value */</pre>
============= <br />
			<i>05.04.2018 00:17:58, Suntor.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30232/topic3542/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30232/topic3542/</guid>
			<pubDate>Thu, 05 Apr 2018 00:17:58 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30230/topic3542/">Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			У вас переполнение типа int. Номера заявок и сделок - это 64-битные целые числа. <br />
			<i>04.04.2018 23:18:29, SG.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30230/topic3542/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30230/topic3542/</guid>
			<pubDate>Wed, 04 Apr 2018 23:18:29 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30218/topic3542/">Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Чуть не забыл часть кода:
====code====
<pre>void msg_ToQuik(lua_State *L, std::string msg, int num)
{
&nbsp;&nbsp;&nbsp;lua_settop(L, 0);
&nbsp;&nbsp;&nbsp;lua_getglobal(L, "message");
&nbsp;&nbsp;&nbsp;lua_pushfstring(L, msg.c_str());
&nbsp;&nbsp;&nbsp;lua_pushnumber(L, num);
&nbsp;&nbsp;&nbsp;lua_call(L, 2, 0);
}
</pre>
============= <br />
			<i>04.04.2018 17:53:02, Андрей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30218/topic3542/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30218/topic3542/</guid>
			<pubDate>Wed, 04 Apr 2018 17:53:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30215/topic3542/">Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Причем, если брать фьючерсы вместо акций,то скрипт работает верно. <br />
			<i>04.04.2018 17:49:01, Андрей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30215/topic3542/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30215/topic3542/</guid>
			<pubDate>Wed, 04 Apr 2018 17:49:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message30214/topic3542/">Ошибка получения параметра &quot;order_num&quot; поля таблицы &quot;orders&quot; через lua_CApi.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Здравствуйте, данный вопрос является продолжением начатой мною темы:<noindex><a href="https://forum.quik.ru/forum10/topic3539/" target="_blank" rel="nofollow">https://forum.quik.ru/forum10/topic3539/</a></noindex><br />Которая перешла в несколько иное русло. <br /><br />Как уже писал в данной теме, я не смог удалить ордер из за того, что не получилось передать в качестве параметра требуемый order_num.<br /><br />Когда я протестировал два одинаковых скрипта (один на чистом lua, а другой на lua_CApi ) - то обнаружил интересную закономерность (либо я криворукий... поправте в случае нахождения ошибки) <br /><U><B><I>первый скрипт - на qlua - возвращает верное значение lua_CApi. Второй (скрипт близнец) - на С++ с использованием lua_CApi - возвращает значение order_num: -2147483648<br /></I></B></U><br />Ниже представляю оба тестовых скрипта:<br />большая просьба как к админам, так и просто к тем кто пишет ботов на С++ так же как и я поправить или же прокомментировать мои ошибки, или же как можно обойти встречную мною ситуацию:<br /><br />Qlua:
====code====
<pre>function main()
&nbsp;&nbsp;&nbsp;for i = getNumberOf("orders")-1,0,-1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T = getItem("orders",i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if T.sec_code == "ROSN" and
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bit.test(T.flags,0) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(tostring(T.order_num));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;
&nbsp;&nbsp;&nbsp;end;
end;
</pre>
=============
<br /><br />lua_CApi + C++:
====code====
<pre>#include &#60;Windows.h&#62;
#include &#60;thread&#62;

#define LUA_LIB
#define LUA_BUILD_AS_DLL
extern "C" {
#include "Lua&#92;lauxlib.h"
#include "Lua&#92;lua.h"
}




BOOL APIENTRY DllMain(HANDLE hModule, DWORD&nbsp;&nbsp;ul_reason_for_call, LPVOID lpReserved)
{
&nbsp;&nbsp;&nbsp;return TRUE;
}

static struct luaL_reg ls_lib&#91;&#93; = {
&nbsp;&nbsp;&nbsp;{ NULL, NULL }
};

#include &#60;bitset&#62;
extern "C" LUALIB_API int luaopen_test_addition(lua_State *L)
{
&nbsp;&nbsp;&nbsp;auto _test = &#91;&#93;(int bit_num, int bit_test)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::bitset&#60;16&#62; bits(bit_num);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return bits&#91;bit_test&#93; == 1;
&nbsp;&nbsp;&nbsp;};
&nbsp;&nbsp;&nbsp;lua_settop(L, 0);
&nbsp;&nbsp;&nbsp;lua_getglobal(L, "getNumberOf");
&nbsp;&nbsp;&nbsp;lua_pushfstring(L, "orders");
&nbsp;&nbsp;&nbsp;lua_call(L, 1, 1);

&nbsp;&nbsp;&nbsp;int length = (int)lua_tonumber(L, -1);
&nbsp;&nbsp;&nbsp;lua_settop(L, 0);
&nbsp;&nbsp;&nbsp;for (size_t i = 0; i &#60; length; i++)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_getglobal(L, "getItem");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pushfstring(L, "orders");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pushnumber(L, i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_call(L,2,1);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_getfield(L, -1, "sec_code");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::string sc = lua_tostring(L, -1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_remove(L, -1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_getfield(L, -1, "flags");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int f = lua_tonumber(L, -1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_remove(L, -1);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (sc.compare("ROSN") == 0 &#38;&#38; _test(f, 0))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_getfield(L, -1, "order_num");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int N = lua_tonumber(L, -1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_remove(L, -1);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg_ToQuik(L, std::to_string(N), 1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_settop(L, 0);
&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;return 0;
}
</pre>
============= <br />
			<i>04.04.2018 17:47:11, Андрей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message30214/topic3542/</link>
			<guid>http://forum.quik.ru/messages/forum10/message30214/topic3542/</guid>
			<pubDate>Wed, 04 Apr 2018 17:47:11 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
