<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Принципы написания скриптов]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Принципы написания скриптов форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 02 May 2026 15:32:04 +0300</pubDate>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message65328/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_j42kFJz0" href="/user/15328/" bx-tooltip-user-id="15328">Владислав</a>, Я не понимаю, что Вы подразумеваете под &nbsp;различными стратегиями, но да, всё в одном скрипте, и алгоритмы адаптируемые, их поведение зависит от состояния портфеля кошелька и от поведения рынка в данный момент времени на данном таймфрейме, от статуса, качества и текущей ликвидности тикера и ещё от ряда параметров. <br />
			<i>01.09.2022 21:26:21, Владимир.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message65328/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message65328/topic5616/</guid>
			<pubDate>Thu, 01 Sep 2022 21:26:21 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message65321/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_gIuZt52t" href="/user/14299/" bx-tooltip-user-id="14299">Владимир</a> написал:<br />Про несколько скриптов я и вообще говорить не хочу - это алгоритмический идиотизм<br />=============<br />Вы различные стратегии в одном скрипте реализуете ? <br />
			<i>01.09.2022 14:56:02, Владислав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message65321/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message65321/topic5616/</guid>
			<pubDate>Thu, 01 Sep 2022 14:56:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message65319/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_47rbJrZl" href="/user/62/" bx-tooltip-user-id="62">nikolz</a>, Ну каких, в жопу, &quot;вычислительных ресурсов&quot;, лапуль? Для такой примитивной задачи, как организация торговли через Инет вполне хватило бы даже дохленького 8086, и уж за глаза любого компа, выпущенного в 21 веке. Это Вы тут постоянно зудите про многоядерные чудовища, которые нафиг никому не нужны. А криворукие бездари сожрут с аппетитом ЛЮБЫЕ ресурсы, им всё равно будет мало. В который раз уж советую: займитесь чем-нибудь другим, кроме программирования - тем, где Вы хоть что-то соображаете. <img src="http://forum.quik.ru/upload/main/smiles/5/icon_wink.png" border="0" data-code=":wink:" data-definition="SD" alt=":wink:" style="width:16px;height:16px;" title="Шутливо" class="bx-smile" /> &nbsp; <br />
			<i>01.09.2022 13:49:38, Владимир.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message65319/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message65319/topic5616/</guid>
			<pubDate>Thu, 01 Sep 2022 13:49:38 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message65317/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<noindex><a href="https://forum.quik.ru/user/15328/" target="_blank" rel="nofollow">Владислав</a></noindex>,<br />Несколько бесплатных советов.<br />-------------------------<br />Тестирование скорости исполнения скриптов или отдельных функций делается для оценки имеющихся вычислительных ресурсов .<br />-----------------------<br />Эти оценки необходимы для разработки в дальнейшем алгоритмов работы роботов, реализующих конкретную стратегию поведения.<br />--------------- <br />Если вы начинающий писатель,<br /> то начинать надо с выбора метода торговли (если это торговый робот)<br />затем разработки алгоритма &nbsp;и реализации его.<br />----------------------------------<br />После этого наступает этап тестирования и определения адекватности его работы ожиданиям автора. <br />---------<br />Частота совершения сделок а следовательно и скорость реакции робота зависит от выбранной стратегии торговли.<br />-----------<br /> Если Вы решили заниматься скальпингом, то скорость &nbsp;сделка в &nbsp;секунду может быть низкой,<br /> а если займетесь арбитражем, то возможно &nbsp;что и &nbsp;1 сделка в минуту будет достаточно.<br />------------------ &nbsp;<br />Поэтому рекомендую начать не с написания скрипта для торговли, а с разработки алгоритма торговли и тестирования его на истории.<br />=============== &nbsp;<br />И еще, если торгуете конкретным инструментом, то можно торговать без колбеков а робота написать в индикаторе.<br />При этом скорость будет не ниже чем с колбеками а скрипт на порядок проще.<br />====================<br />Если используете колбеки, <br />то более важной задачей является синхронизация сообщений<br /> и транзакций между собой так как интернет и биржевая торговля<br />это источники асинхронных событий. &nbsp;<br />------------------<br />Если сделаете правильно, то робот будет работать без затыков и сообщениях об ошибках и всегда быстро будете получать реакцию на сделки.<br />--------------- <br />Примерно так. <br />
			<i>01.09.2022 13:12:59, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message65317/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message65317/topic5616/</guid>
			<pubDate>Thu, 01 Sep 2022 13:12:59 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message65315/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_7fJ5YOi4" href="/user/15328/" bx-tooltip-user-id="15328">Владислав</a>, Тут уже не раз обсуждалось, что сама специфика торговли в Квике через Инет говорит о том, что время реакции на что бы то ни было измеряется <B>в секундах</B>. Не в миллисекундах, не в микросекундах, не в минутах, а именно в секундах. Ну или в диапазоне от десятых долей секунды до десятков секунд. А потому все эти дурацкие &quot;тесты&quot; с ловлей микросекунд есть Бред Сивой Кобылы. Мне всегда было плевать на &quot;скорость получения ответа на транзакцию&quot;, но мой личный (зарегистрированный) &quot;рекорд&quot;, когда прерывание OnTrade пришло через 	17.5 минут (!!!) после отправки заявки (а снимаю заявки я через три минуты активности). И у меня вопрос: НА КОЙ кому сдались эти тесты скорости? Что бы они там ни показывали - И ЧТО? Поэтому Ваш оптимизм <I>&quot;Для того, что бы исключить (!) возможные несостыковки, связанные с длительностью поступления данных в таблицу сделок и таблицу поз. по. кл. счетам, скрипт делает паузу в 1000мс&quot;</I> кажется мне слишком уж оптимистичным. Про несколько скриптов я и вообще говорить не хочу - это алгоритмический идиотизм. Кстати, у меня &quot;расчет прибыли от совершенной сделки, запись этой сделки в файл и т.п.&quot; происходит не &quot;после отправки транзакции&quot;, а после прихода прерывания OnTrade. <br />
			<i>01.09.2022 11:52:33, Владимир.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message65315/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message65315/topic5616/</guid>
			<pubDate>Thu, 01 Sep 2022 11:52:33 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message65309/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_pVUf7BpM" href="/user/14299/" bx-tooltip-user-id="14299">Владимир</a>, <a class="blog-p-user-name" id="bp_m6j2znMX" href="/user/62/" bx-tooltip-user-id="62">nikolz</a>, &nbsp;<br /> Благодарю за советы. На примере кода представленного <a class="blog-p-user-name" id="bp_su5M2Mr7" href="/user/1222/" bx-tooltip-user-id="1222">Антоном</a> выше, сделал тесты скорости получения ответа на транзакцию. По итогу думаю, что в рамках нескольких скриптов действительно смысла с заморочками нет. Тем более если скрипт работает с различными таблицами в QUIK. В моем случае, после отправки транзакции, происходит расчет прибыли от совершенной сделки, запись этой сделки в файл и т.п. Для того, что бы исключить возможные несостыковки, связанные с длительностью поступления данных в таблицу сделок и таблицу поз. по. кл. счетам, скрипт делает паузу в 1000мс. При такой реализации программы, смысла в заморочках точно нет.<br />Но если речь идет о большом количестве скриптов, в которых все завязано на коллбеках, смысл думаю что есть.<br /><br />Код для тестирования скорости:<table class="forum-spoiler"><thead onclick="if (this.nextSibling.style.display=='none') { this.nextSibling.style.display=''; BX.addClass(this, 'forum-spoiler-head-open'); } else { this.nextSibling.style.display='none'; BX.removeClass(this, 'forum-spoiler-head-open'); } BX.onCustomEvent('BX.Forum.Spoiler:toggle', [{node: this}]); event.stopPropagation();"><tr><th><div>Скрытый текст</div></th></tr></thead><tbody class="forum-spoiler" style="display:none;"><tr><td><br />
====code====
<pre>_G.client = {}
_G.client.account &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "SPBFUT000he"
_G.client.class_code &nbsp;&nbsp;&nbsp;= "SPBFUT"
_G.client.sec_code &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "BRV2"
_G.time = 0

local function toftime(a)
&nbsp;&nbsp;&nbsp;local aa = a.hour
&nbsp;&nbsp;&nbsp;aa = aa * 60
&nbsp;&nbsp;&nbsp;aa = aa + a.min
&nbsp;&nbsp;&nbsp;aa = aa * 60
&nbsp;&nbsp;&nbsp;aa = aa + a.sec
&nbsp;&nbsp;&nbsp;aa = aa * 1000000
&nbsp;&nbsp;&nbsp;aa = aa + a.mcs
&nbsp;&nbsp;&nbsp;return aa
end

function OnTransReply (trans_reply)
&nbsp;&nbsp;&nbsp;if trans_reply.sec_code == _G.client.sec_code then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local x = toftime(os.sysdate()) - toftime(_G.time)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnTransReply: "..(x).."мкс&nbsp;&nbsp;"..(x / 1000).."мс&nbsp;&nbsp;"..(x / 1000000).."с")
&nbsp;&nbsp;&nbsp;end
end

function OnTrade (trade)
&nbsp;&nbsp;&nbsp;if trade.sec_code == _G.client.sec_code then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local x = toftime(os.sysdate()) - toftime(_G.time)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnTrade: "..(x).."мкс&nbsp;&nbsp;"..(x / 1000).."мс&nbsp;&nbsp;"..(x / 1000000).."с")
&nbsp;&nbsp;&nbsp;end
end

function sendMarketOrder (client, quantity, comment)
 &nbsp;&nbsp;&nbsp;local number = getNumberOf("trades")
&nbsp;&nbsp;&nbsp;local transaction = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;"TRANS_ID"&#93;&nbsp;&nbsp;&nbsp;= '1',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;"CLASSCODE"&#93;&nbsp;&nbsp;&nbsp;= client.class_code,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;"SECCODE"&#93;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= client.sec_code,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;'ACCOUNT'&#93;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= client.account,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;'OPERATION'&#93;&nbsp;&nbsp;&nbsp;= quantity &#62; 0 and 'B' or 'S',
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;'QUANTITY'&#93;&nbsp;&nbsp;&nbsp;= tostring(math.abs(quantity)),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;"ACTION"&#93;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "NEW_ORDER",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;"TYPE"&#93; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= "M",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;'PRICE'&#93;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = "0",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;"CLIENT_CODE"&#93; = comment
&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;_G.time = os.sysdate()
&nbsp;&nbsp;&nbsp;local result = sendTransaction(transaction)
&nbsp;&nbsp;&nbsp;if result == '' then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for count = 1, 30000 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local new_number = getNumberOf("trades")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if new_number ~= number then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i = new_number -1, 0, -1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local item = getItem("trades", i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if item.trans_id == tonumber(transaction.TRANS_ID) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local x = toftime(os.sysdate()) - toftime(_G.time)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("sendMarketOrder: "..(x).."мкс&nbsp;&nbsp;"..(x / 1000).."мс&nbsp;&nbsp;"..(x / 1000000).."с&nbsp;&nbsp;"..count)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;local fields = ""
&nbsp;&nbsp;&nbsp;for k, val in pairs(transaction) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val = tostring(val)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fields = fields == '' and fields..k.." = ".."&#92;""..val.."&#92;"" or fields..", "..k.." = ".."&#92;""..val.."&#92;""
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;PrintDbgStr("sendMarketOrder: Ошибка транзакции: "..result..' '..fields)
&nbsp;&nbsp;&nbsp;return false
end

function main()
&nbsp;&nbsp;&nbsp;for i = 1, 10 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("i: "..i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendMarketOrder(_G.client, 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(3000)
&nbsp;&nbsp;&nbsp;end
end 
</pre>
=============
</td></tr></tbody></table><br />Результаты тестирования:<br /><table class="forum-spoiler"><thead onclick="if (this.nextSibling.style.display=='none') { this.nextSibling.style.display=''; BX.addClass(this, 'forum-spoiler-head-open'); } else { this.nextSibling.style.display='none'; BX.removeClass(this, 'forum-spoiler-head-open'); } BX.onCustomEvent('BX.Forum.Spoiler:toggle', [{node: this}]); event.stopPropagation();"><tr><th><div>Скрытый текст</div></th></tr></thead><tbody class="forum-spoiler" style="display:none;"><tr><td>i: 1<br />OnTransReply: 75969мкс &nbsp;75.969мс &nbsp;0.075969с<br />OnTrade: 96518мкс &nbsp;96.518мс &nbsp;0.096518с<br />OnTrade: 96518мкс &nbsp;96.518мс &nbsp;0.096518с<br />OnTrade: 96518мкс &nbsp;96.518мс &nbsp;0.096518с<br />sendMarketOrder: 109026мкс &nbsp;109.026мс &nbsp;0.109026с &nbsp;8<br />i: 2<br />OnTransReply: 70408мкс &nbsp;70.408мс &nbsp;0.070408с<br />OnTrade: 90597мкс &nbsp;90.597мс &nbsp;0.090597с<br />OnTrade: 90597мкс &nbsp;90.597мс &nbsp;0.090597с<br />OnTrade: 90597мкс &nbsp;90.597мс &nbsp;0.090597с<br />sendMarketOrder: 100623мкс &nbsp;100.623мс &nbsp;0.100623с &nbsp;7<br />i: 3<br />OnTransReply: 67757мкс &nbsp;67.757мс &nbsp;0.067757с<br />OnTrade: 87404мкс &nbsp;87.404мс &nbsp;0.087404с<br />OnTrade: 87404мкс &nbsp;87.404мс &nbsp;0.087404с<br />OnTrade: 87404мкс &nbsp;87.404мс &nbsp;0.087404с<br />sendMarketOrder: 101410мкс &nbsp;101.41мс &nbsp;0.10141с &nbsp;7<br />i: 4<br />OnTransReply: 66431мкс &nbsp;66.431мс &nbsp;0.066431с<br />OnTrade: 90952мкс &nbsp;90.952мс &nbsp;0.090952с<br />OnTrade: 90952мкс &nbsp;90.952мс &nbsp;0.090952с<br />OnTrade: 90952мкс &nbsp;90.952мс &nbsp;0.090952с<br />sendMarketOrder: 97962мкс &nbsp;97.962мс &nbsp;0.097962с &nbsp;7<br />i: 5<br />OnTransReply: 83531мкс &nbsp;83.531мс &nbsp;0.083531с<br />OnTrade: 90940мкс &nbsp;90.94мс &nbsp;0.09094с<br />OnTrade: 90940мкс &nbsp;90.94мс &nbsp;0.09094с<br />OnTrade: 91912мкс &nbsp;91.912мс &nbsp;0.091912с<br />sendMarketOrder: 98926мкс &nbsp;98.926мс &nbsp;0.098926с &nbsp;7<br />i: 6<br />OnTransReply: 99965мкс &nbsp;99.965мс &nbsp;0.099965с<br />OnTrade: 107081мкс &nbsp;107.081мс &nbsp;0.107081с<br />OnTrade: 108077мкс &nbsp;108.077мс &nbsp;0.108077с<br />OnTrade: 108077мкс &nbsp;108.077мс &nbsp;0.108077с<br />sendMarketOrder: 116085мкс &nbsp;116.085мс &nbsp;0.116085с &nbsp;8<br />i: 7<br />OnTransReply: 67507мкс &nbsp;67.507мс &nbsp;0.067507с<br />OnTrade: 86958мкс &nbsp;86.958мс &nbsp;0.086958с<br />OnTrade: 86958мкс &nbsp;86.958мс &nbsp;0.086958с<br />OnTrade: 86958мкс &nbsp;86.958мс &nbsp;0.086958с<br />sendMarketOrder: 100985мкс &nbsp;100.985мс &nbsp;0.100985с &nbsp;7<br />i: 8<br />OnTransReply: 116537мкс &nbsp;116.537мс &nbsp;0.116537с<br />OnTrade: 125012мкс &nbsp;125.012мс &nbsp;0.125012с<br />OnTrade: 126023мкс &nbsp;126.023мс &nbsp;0.126023с<br />OnTrade: 126023мкс &nbsp;126.023мс &nbsp;0.126023с<br />sendMarketOrder: 132022мкс &nbsp;132.022мс &nbsp;0.132022с &nbsp;9<br />i: 9<br />OnTransReply: 53859мкс &nbsp;53.859мс &nbsp;0.053859с<br />OnTrade: 78750мкс &nbsp;78.75мс &nbsp;0.07875с<br />OnTrade: 78750мкс &nbsp;78.75мс &nbsp;0.07875с<br />OnTrade: 78750мкс &nbsp;78.75мс &nbsp;0.07875с<br />sendMarketOrder: 85303мкс &nbsp;85.303мс &nbsp;0.085303с &nbsp;6<br />i: 10<br />OnTransReply: 67412мкс &nbsp;67.412мс &nbsp;0.067412с<br />sendMarketOrder: 82183мкс &nbsp;82.183мс &nbsp;0.082183с &nbsp;6<br />OnTrade: 84179мкс &nbsp;84.179мс &nbsp;0.084179с<br />OnTrade: 85175мкс &nbsp;85.175мс &nbsp;0.085175с<br />OnTrade: 85175мкс &nbsp;85.175мс &nbsp;0.085175с</td></tr></tbody></table> <br />
			<i>01.09.2022 10:24:17, Владислав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message65309/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message65309/topic5616/</guid>
			<pubDate>Thu, 01 Sep 2022 10:24:17 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message65283/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_J5IjSrKt" href="/user/15328/" bx-tooltip-user-id="15328">Владислав</a>, Лучше всего организовать ОДИН скрипт, работающий в ОДНОМ потоке и использующий ОДИН коллбек, а не заниматься всей этой фигнёй. Размер кода у меня в данный момент 37050 байт (это с диалогом, работой с файлами, обработкой коллбеков и всем остальным для срочного и фондового рынка), так что дробить его на куски не вижу ни малейшего смысла. <br />
			<i>30.08.2022 21:16:00, Владимир.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message65283/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message65283/topic5616/</guid>
			<pubDate>Tue, 30 Aug 2022 21:16:00 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message65280/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<noindex><a href="https://forum.quik.ru/user/15328/" target="_blank" rel="nofollow">Владислав</a></noindex>,<br />вроде бы уже писал, но повторю.<br />------------------- <br />чтобы не дублировать колбеки надо обеспечить возможность скриптам обращаться к общим данным.<br />это можно сделать различными методами.<br />-------------------------<br />Реализую это с помощью <B>memory mapping.</B><br />Кроме того, для реализации неблокирующей синхронизации потоков использую <B>shared memory.<br /></B>Для параллельной работы с множеством инструментов использую<B> пул потоков.</B><br />------------------<br />Примерно так. <br />
			<i>30.08.2022 19:24:34, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message65280/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message65280/topic5616/</guid>
			<pubDate>Tue, 30 Aug 2022 19:24:34 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message65279/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_ctlUbjIS" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br /> Существующая структура QLUA имеет существенный недостаток.<br />Все колбеки вызываются из одного потока и каждый из них повторяется в различных скриптах.<br />В итоге получается дублирование одних и тех же действий многократно.<br />Я устранил эту проблему и сделал механизм при котором колбеки в скриптах не повторяются, <br />а скрипты могут запускать функции друг у друга и получать данные из других скриптов..<br />-------------------------<br />В итоге не только повышается скорость, но и размер кода сокращается в десятки раз.<br />=============<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_SfJY4xid" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Тот механизм, о котором я написал, позволяет очень просто делать много роботов &nbsp;по различным алгоритмом для одного инструмента.<br />Колбеки не дублируются в скриптах &nbsp;<br />Каждый колбек существует в своем скрипте и вызывается всего один раз квиком для получения данных вне зависимости от числа роботов.<br />Роботы получают требуемые данные от этого скрипта. т е потоки синхронизируются и обмениваются данными , а также чтобы не дублировать код, могут запускать функции других скриптов через механизм колбеков между скриптами.<br />Сравнительно просто в этом варианте отдавать данные совершенно независимым процессам.<br /><br />=============<br />Здравствуйте. Подскажите пожалуйста, как реализовать подобный механизм ? <br />
			<i>30.08.2022 17:08:53, Владислав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message65279/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message65279/topic5616/</guid>
			<pubDate>Tue, 30 Aug 2022 17:08:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46769/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Любопытства ради небольшой тест, тксть поверим теорию практикой (вариант с длл писать лень)<br />
====code====
<pre>function add_global(a, b)
&nbsp;&nbsp;&nbsp;return a + b
end

local function add_clocal(a, b)
&nbsp;&nbsp;&nbsp;return a + b
end

function main()
&nbsp;&nbsp;&nbsp;local count = 10000000
&nbsp;&nbsp;&nbsp;local function toftime(a)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local aa = a.hour
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa = aa * 60
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa = aa + a.min
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa = aa * 60
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa = aa + a.sec
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa = aa * 1000000
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aa = aa + a.mcs
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return aa
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;local function add_flocal(a, b)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return a + b
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;-- perform 'count' function-level function calls
&nbsp;&nbsp;&nbsp;local sum = 0
&nbsp;&nbsp;&nbsp;local tm = os.sysdate()
&nbsp;&nbsp;&nbsp;for i = 0, count - 1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = add_flocal(sum, i)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;local tflevel = toftime(os.sysdate()) - toftime(tm)
&nbsp;&nbsp;&nbsp;-- perfrom 'count' chunk-level function calls
&nbsp;&nbsp;&nbsp;sum = 0
&nbsp;&nbsp;&nbsp;tm = os.sysdate()
&nbsp;&nbsp;&nbsp;for i = 0, count - 1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = add_clocal(sum, i)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;local tclevel = toftime(os.sysdate()) - toftime(tm)
&nbsp;&nbsp;&nbsp;-- perform 'count' global function calls
&nbsp;&nbsp;&nbsp;sum = 0
&nbsp;&nbsp;&nbsp;tm = os.sysdate()
&nbsp;&nbsp;&nbsp;for i = 0, count - 1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = add_global(sum, i)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;local tglobal = toftime(os.sysdate()) - toftime(tm)&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;-- perform 'count' inlined pseudocalls
&nbsp;&nbsp;&nbsp;sum = 0
&nbsp;&nbsp;&nbsp;tm = os.sysdate()
&nbsp;&nbsp;&nbsp;for i = 0, count - 1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = sum + i
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;local tinline = toftime(os.sysdate()) - toftime(tm)
&nbsp;&nbsp;&nbsp;-- show results
&nbsp;&nbsp;&nbsp;message("Function call overheads:&#92;n" ..
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;&nbsp;function-level function: " .. (tflevel - tinline) / count .. "us&#92;n" ..
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;&nbsp;chunk-level function&nbsp;&nbsp; : " .. (tclevel - tinline) / count .. "us&#92;n" ..
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;&nbsp;global function:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : " .. (tglobal - tinline) / count .. "us&#92;n")
end
</pre>
============= <br />
			<i>06.07.2020 04:04:34, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46769/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46769/topic5616/</guid>
			<pubDate>Mon, 06 Jul 2020 04:04:34 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46767/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_cQ47dOFw" href="/user/2250/" bx-tooltip-user-id="2250">Иван Ру</a> написал:<br />Но если я читаю бид-аск 20 раз за секунду, по 10-ти инструментам, позволительно ли это делать в отдельной функции?<br />=============<br />Вызов функции не то чтобы тяжелая операция. Грубо ориентировочно наброшу цифр.<br /><br />Если функция находится в длл, луа перед ее вызовом снимает лок, а после - снова захватывает, это самая тяжелая часть вызова (самого по себе вызова, не тела функции). Пара EnterCriticalSection/LeaveCriticalSection занимает порядка 100нс, новее железо - меньше. Всем остальным оверхедом вызова в сравнении с этим можно пренебречь, т.е. время на порядок меньше. Ок, чтобы получить оверхед в одну секунду, надо сделать порядка 10 миллионов вызовов функций из длл в одном цикле без слипов и прочих ожиданий.<br /><br />Если функция написана на луа, лок не выпускается и остается только то, чем мы выше пренебрегли. Предполагая разницу на один порядок, получим, что секундный оверхед будет достигнут на порядка 100 миллионах вызовов.<br /><br />Резюме: вообще не о чем париться. <br />
			<i>06.07.2020 01:03:41, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46767/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46767/topic5616/</guid>
			<pubDate>Mon, 06 Jul 2020 01:03:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46759/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Простой пример. Торгую я (вы) фьючерсами. Скрипт не трогаем, хотим чтобы он работал сам многие дни. Значит у нас периодически, желательно ежедневно, надо инициировать инструментов вплоть до выбора их корректного названия кода, на основе соответствующей таблицы из Квик, которая периодически меняется/обновляется.<br />У меня эта задача реализована так - в двух случаях, 1) при смене даты, 2) при проходе через временную точку 9 часов 40 минут вызывается функция инициализации инструментов-стратегий. Задача делается отчасти с помощью подгружаемого модуля, который сравнивает короткие коды инструментов, их календарный индекс с данными настроек стратегии в роботе. <br /> Раньше вызов этих функций делал в OnInit и Main, теперь - только в main. Правда периодически случается что дата на сервере меняется после 10.00 !! По крайней мере такие данные прилетают... <br />Интересно, кто как решает типовые задачи, какую архитектуру при этом &nbsp;использует. Например, чтение последней цены, бид-аск - в пределах main (быстрее) или вызовом отдельной функции. Ну ок, у вас отдельная функция, что функционально, пардон за тавтологию. Но если я читаю бид-аск 20 раз за секунду, по 10-ти инструментам, позволительно ли это делать в отдельной функции? <br />Все относительно, но все же - какое количество вызовов сторонней функции позволительно для ресурсов мощной машины на ваш взгляд (очень грубой оценки достаточно). <br />
			<i>05.07.2020 16:48:18, Иван Ру.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46759/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46759/topic5616/</guid>
			<pubDate>Sun, 05 Jul 2020 16:48:18 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46756/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_dPbWxVaF" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/2250/" target="_blank" rel="nofollow">Иван Ру</a></noindex> написал:<br />- Целесообразно ли минимизировать использование колбэков и как?<br />=============<br /> Это вопрос архитектурный. Варианта два.<br /><br />Первый - это event-driven архитектура, тут колбеки движущая сила всего, пришел колбек - это событие, вы это событие как-то обрабатываете, если обработка предполагает что-то тяжелое - вы только запускаете операцию и возвращаетесь из колбека, а о ее завершении вам сообщит другой колбек, уже ваш собственный.<br /><br />Второй это поллинг, ваш мейн шаг за шагом следует какому-то плану. Где ему нужны какие-то данные, он их заказывает и ждет ответа, где нужно что-то отправить он отправляет и ждет ответа. Уже по описанию видно, насколько шустро оно будет работать, хотя есть, несомненно, задачи, в которых и так сойдет. Другой недостаток - вы видите какое-то событие только в тот момент, когда решили на него посмотреть, а оно может уже часа два как произошло. Например, пока вы считали что-то и готовили транзакцию, квик потерял соединение, но вы еще об этом не знаете и продолжаете готовиться к своей сделке века, которая закончится ничем, бо нет коннекта. Утрирую для наглядности.<br /><br />Третий вариант это как тут часто в вопросах попадается, когда смешали все в кучу и получилась, естественно, куча<br />=============<br />Что касается этого аспекта - выбор я уже давно сделал в пользу второго варианта, коллбэки я либо не использую, либо они играют второстепенную роль. Колбэк я считаю вариантом не надежным (задержки, не сработал и т.п.), в то время как обработка в теле main позволяет не только получать данные, но и разные статусы, например, соединения нет, торгов нет, данные ни фига не получены, или они получены, но вряд ли актуальны. Картина получается куда полнее. С учетом того, что скорость транзакции у меня составляет порядка 150 мс, мне достаточно раз в 50 мс пробежаться по нужным параметрам в main, не вижу особого смысла в коллбэках разве только как в страховке или способе финальной верификации данных (о транзакции).<br />Меня больше интересует архитектура в плане разделения на модули и классы, степени их универсальности, способе подгрузки, компоновки рабочей стратегии из разных элементов конструктора. <br />
			<i>05.07.2020 16:34:26, Иван Ру.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46756/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46756/topic5616/</guid>
			<pubDate>Sun, 05 Jul 2020 16:34:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46754/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_1UKxepum" href="/user/2250/" bx-tooltip-user-id="2250">Иван Ру</a> написал:<br />- Целесообразно ли минимизировать использование колбэков и как?<br />=============<br />Это вопрос архитектурный. Варианта два.<br /><br />Первый - это event-driven архитектура, тут колбеки движущая сила всего, пришел колбек - это событие, вы это событие как-то обрабатываете, если обработка предполагает что-то тяжелое - вы только запускаете операцию и возвращаетесь из колбека, а о ее завершении вам сообщит другой колбек, уже ваш собственный.<br /><br />Второй это поллинг, ваш мейн шаг за шагом следует какому-то плану. Где ему нужны какие-то данные, он их заказывает и ждет ответа, где нужно что-то отправить он отправляет и ждет ответа. Уже по описанию видно, насколько шустро оно будет работать, хотя есть, несомненно, задачи, в которых и так сойдет. Другой недостаток - вы видите какое-то событие только в тот момент, когда решили на него посмотреть, а оно может уже часа два как произошло. Например, пока вы считали что-то и готовили транзакцию, квик потерял соединение, но вы еще об этом не знаете и продолжаете готовиться к своей сделке века, которая закончится ничем, бо нет коннекта. Утрирую для наглядности.<br /><br />Третий вариант это как тут часто в вопросах попадается, когда смешали все в кучу и получилась, естественно, куча. <br />
			<i>05.07.2020 01:27:36, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46754/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46754/topic5616/</guid>
			<pubDate>Sun, 05 Jul 2020 01:27:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46753/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_BeUjnnNY" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Я вам предлагаю для примера посмотреть алгоритм БПФ либо нейронной сети <br />=============<br />Не спорю, тяжелая вычислялка, пригодная для распараллеливания, от потоков выиграет. Но такое на луа писать несколько самонадеянно, даже и в виде длл. Если данные в виде луа-таблицы, мы больше потеряем на доступе к ней, тут нужны плейн массивы. В сухом остатке на долю луа остается периодически подбрасывать новые данные по мере их приезда с сервера, а для этого много потоков не нужно и даже вредно, сеть-то сама по себе труба в одну нитку. Равно и в обратную сторону, можно натыкать миллион транзакций и они встанут в очередь на сокете и ничего более. В данном случае асинхронность лучше многопоточности, а у этого подхода есть ограничительный фактор - целевая аудитория может ниасилить. <br />
			<i>05.07.2020 01:10:37, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46753/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46753/topic5616/</guid>
			<pubDate>Sun, 05 Jul 2020 01:10:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46752/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ребята, вы о высоком, признаться я уже не все понимаю.<br />Если вернуться к реальности, где основная масса, включая меня - любители, а не профессионалы в программировании, и мы имеем, то что имеем, остаются интересные вопросы с потенциально возможными интересными ответами.<br /><br />- Целесообразно ли минимизировать использование колбэков и как?<br />- Стоит ли писать общие классы-таблицы для роботов?<br />- Как конкретно оптимально подгружать универсальные функции...<br />И т.п. и т.д. <br />
			<i>04.07.2020 23:18:05, Иван Ру.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46752/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46752/topic5616/</guid>
			<pubDate>Sat, 04 Jul 2020 23:18:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46751/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_9OpOnhSM" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Это, конечно, похвально написать свой RabbitMQ, но, в результате, получится схема не меньшей сложности. Т.е. мы пишем свой терминал. Он будет собирать события терминала, исполнять команды скриптов и читать их ответы, передавать им поток данных.<br /><br />При этом мы итак находимся внутри такого окружения... Что мешает написать скрипт исполняющий сразу несколько алгоритмов, по многим инструментам. Будет один скрипт, одно окружение.<br />А колбеки Квика слишком ненадежная конструкция. Проще без них. Хотя, конечно, от части из них отказаться сложно, как, например, OnTransReply.<br />=============<br />вообще-то я написал о том, что сделал сам лет ...надцать назад, <br />т е фактически сразу как внедрили VMlua в квик.<br /> А перед этим примерно года за два я сам в переписке с руководством разработчика предлагал внедрить вместо QPILE LUA. <br />не утверждаю, что они меня послушались, но в результате появился луа в квике.<br />---------------------<br />Тот механизм, о котором я написал, позволяет очень просто делать много роботов &nbsp;по различным алгоритмом для одного инструмента.<br />Колбеки не дублируются в скриптах &nbsp;<br />Каждый колбек существует в своем скрипте и вызывается всего один раз квиком для получения данных вне зависимости от числа роботов.<br />Роботы получают требуемые данные от этого скрипта. т е потоки синхронизируются и обмениваются данными , а также чтобы не дублировать код, могут запускать функции других скриптов через механизм колбеков между скриптами.<br />Сравнительно просто в этом варианте отдавать данные совершенно независимым процессам.<br />----------------------- <br />Но если не мечтать о вечном,<br /> то проще всего делать роботов как индикаторы. <br />
			<i>04.07.2020 23:11:47, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46751/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46751/topic5616/</guid>
			<pubDate>Sat, 04 Jul 2020 23:11:47 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46750/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_tE1kT2mt" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />Каждый скрипт условно можно разделить на три части1) действия вне колбеков и функции main - это отдельный поток и VM Lua2) функция main каждого скрипта - это отдельный поток и VMLua3) вызов и исполнение &nbsp;функций колбек осуществляется &nbsp;в одном основном потоке термина.<br />=============<br /> Не совсем оно так, стейт для тела скрипта и колбеков один и выполняется в основном потоке квика, стейт для мейна второй и выполняется в специально для него созданном потоке. То есть ваш п.1 лишний, нет отдельного стейта для тела.<br /><br />Ваши мысли насчет 128 ядер это из разряда давайте загрузим проц бесполезной работой, чо он простаивает-то. В любом случае ваши 100500 потоков будут сериализоваться на доступе к общим ресурсам, т.е. в основном (в таком количестве) они будут крутить спинлок. Для примера предлагаю прогу из directx sdk, где можно отрисовать одно и то же либо одним потоком, либо многими. Запустите и убедитесь, что проц оно жрет в N раз больше, а fps растет процентов на 5.<br />=============<br />Я вам предлагаю для примера посмотреть алгоритм БПФ либо нейронной сети &nbsp; <br />
			<i>04.07.2020 22:58:48, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46750/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46750/topic5616/</guid>
			<pubDate>Sat, 04 Jul 2020 22:58:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46748/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Это, конечно, похвально написать свой RabbitMQ, но, в результате, получится схема не меньшей сложности. Т.е. мы пишем свой терминал. Он будет собирать события терминала, исполнять команды скриптов и читать их ответы, передавать им поток данных.<br /><br />При этом мы итак находимся внутри такого окружения... Что мешает написать скрипт исполняющий сразу несколько алгоритмов, по многим инструментам. Будет один скрипт, одно окружение.<br />А колбеки Квика слишком ненадежная конструкция. Проще без них. Хотя, конечно, от части из них отказаться сложно, как, например, OnTransReply. <br />
			<i>04.07.2020 16:57:45, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46748/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46748/topic5616/</guid>
			<pubDate>Sat, 04 Jul 2020 16:57:45 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46746/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_w4OJ7EQT" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Каждый скрипт условно можно разделить на три части1) действия вне колбеков и функции main - это отдельный поток и VM Lua2) функция main каждого скрипта - это отдельный поток и VMLua3) вызов и исполнение &nbsp;функций колбек осуществляется &nbsp;в одном основном потоке термина.<br />=============<br />Не совсем оно так, стейт для тела скрипта и колбеков один и выполняется в основном потоке квика, стейт для мейна второй и выполняется в специально для него созданном потоке. То есть ваш п.1 лишний, нет отдельного стейта для тела.<br /><br />Ваши мысли насчет 128 ядер это из разряда давайте загрузим проц бесполезной работой, чо он простаивает-то. В любом случае ваши 100500 потоков будут сериализоваться на доступе к общим ресурсам, т.е. в основном (в таком количестве) они будут крутить спинлок. Для примера предлагаю прогу из directx sdk, где можно отрисовать одно и то же либо одним потоком, либо многими. Запустите и убедитесь, что проц оно жрет в N раз больше, а fps растет процентов на 5. <br />
			<i>04.07.2020 14:23:29, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46746/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46746/topic5616/</guid>
			<pubDate>Sat, 04 Jul 2020 14:23:29 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46743/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_PWdAwB2V" href="/user/2250/" bx-tooltip-user-id="2250">Иван Ру</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br /> &nbsp;<br />====quote====<br /> <noindex><a href="/user/2250/" target="_blank" rel="nofollow">Иван Ру</a></noindex> &nbsp;написал:<br />Интересно мнение форумчан - как предпочитаете писать скрипты - все в одном файле или в виде конструктора - с подгрузкой отдельных файлов:<br />1. Отдельных функций/процедур (выставление заявки, считывание определенных данных и т.п.)<br />2. Отдельных классов (стратегия, позиция и т.п.)<br />=============<br /> &nbsp;Существующая структура QLUA имеет существенный недостаток.<br />Все колбеки вызываются из одного потока и каждый из них повторяется в различных скриптах.<br />В итоге получается дублирование одних и тех же действий многократно.<br />Я устранил эту проблему и сделал механизм при котором колбеки в скриптах не повторяются, <br />а скрипты могут запускать функции друг у друга и получать данные из других скриптов..<br />-------------------------<br />В итоге не только повышается скорость, но и размер кода сокращается в десятки раз.<br />=============<br /> Признаться, все более склоняюсь в сторону такой модели, в первую очередь из-за разрастания скрипта и усложнения его логики из-за чего работа и модификация скрипта становится все более затруднительной...<br />Полагаю можно использовать такую структуру: <br />- базовый скрипт, который определяет статус сессии и агрегирует информацию из коллбэков<br />- описание классов (стратегия, позиция и т.п.)<br />- типовые универсальные модули, например, удаление устаревшей части данных таблиц (цены, бид аск и т.п.), ежедневное определение ключевых временных точек сессии в формате posix, визуализация и логгирование информации и т.п.<br />- собственно скрипты с описанием стратегий, логики определение сигналов на вход и выход и сопутствующих действий...<br /><br />Если кто-то поделится своим видением организационной структуры - буду признателен<br /><br />Поясню свое прежнее беспокойство - у меня большинство скриптов работает одновременно с большим числом инструментов, предполагается большой объем расчетов, опасаюсь, что в тех случаях когда они осуществляются не в теле основного потока (main), а путем многократного вызова функции, это может негативно сказаться на быстродействии скрипта.<br />=============<br />Проблема усложняется тем, что разработчики не утруждают себя документацией по API к их библиотеке,<br /> нигде не описывают интерфейс взаимодействия скриптов с терминалом на уровне API C for LUA.<br />На основе ответов основного разработчика QLUA(не будем показывать пальцем) , &nbsp;<br />по-моему мнению, схема взаимодействия скриптов с терминалом следующая:<br />-------------------------------<br />Каждый скрипт условно можно разделить на три части<br />1) действия вне колбеков и функции main - это отдельный поток и VM Lua<br />2) функция main каждого скрипта - это отдельный поток и VMLua<br />3) вызов и исполнение &nbsp;функций колбек осуществляется &nbsp;в одном основном потоке термина.<br />---------------------------<br />В итоге получаем следующее.<br />Если Вы не профессионал , то скорее всего будете много делать в колбеках &nbsp;- так проще .<br />Все колбеки будете вызывать в каждом из скриптов.<br />-------------------------------<br />Получается прикольно.<br />Даже если у Вас суперкомпьютер с 128 ядрами , то все колбеки будут тупо работать на одном ядре и в одном потоке, <br />в котором крутится еще и основное ядро терминала КВИК.<br />------------------<br />Сейчас версию 7 заменяют на версию 8<br />В итоге XP с одним ядром не работает вообще. Но зато у Вас теперь win10 64 бита и ядер хоть 128.<br />А что реально в сухом остатке?<br />--------------------------<br />Представим что на телегу прикрутить двигатель от болида формулы 1, а впереди телеги все та же лошадь &nbsp;.<br />Вопрос, насколько быстрее эта телега теперь довезет Вас из пункта А в пункт В? <br />-----------------------------------------<br />Конечно есть решение костыльное - ничего не делать в колбеках, &nbsp;а делать все в main.<br />Но резонно спросить разработчиков, а о чем думали они когда разрабатывали концепцию встраиваемой виртуальной машины?<br />--------------------------------<br />Да и это костыльное решение не решает проблему многократного дублирования кода в различных скриптах.<br />--------------------------------- <br />На самом деле все могло &nbsp;быть существенно проще и исполняться существенно быстрее, но именно это никому не требуется. <br />--------------------------<br />На рынке всегда решается лишь одна задача, за разработку инструмента для решения которой платят разработчикам, - &nbsp;как у буратины отобрать пять золотых.<br />-----------------------------------<br />В итоге для целей конструирование игрушечных роботов,<br /> чем занимаются посетители данного форума, <br /> все сделано просто замечательно. <br />============================================================<WBR/>&shy;======================== <br />&quot;Теперь попросим на трибуну начальника транспортного цеха. Пусть доложит об изыскании внутренних резервов. &quot;<br /> &nbsp; <br />
			<i>04.07.2020 14:00:19, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46743/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46743/topic5616/</guid>
			<pubDate>Sat, 04 Jul 2020 14:00:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46735/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_r7I6AuST" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/2250/" target="_blank" rel="nofollow">Иван Ру</a></noindex> написал:<br />Интересно мнение форумчан - как предпочитаете писать скрипты - все в одном файле или в виде конструктора - с подгрузкой отдельных файлов:<br />1. Отдельных функций/процедур (выставление заявки, считывание определенных данных и т.п.)<br />2. Отдельных классов (стратегия, позиция и т.п.)<br />=============<br /> Существующая структура QLUA имеет существенный недостаток.<br />Все колбеки вызываются из одного потока и каждый из них повторяется в различных скриптах.<br />В итоге получается дублирование одних и тех же действий многократно.<br />Я устранил эту проблему и сделал механизм при котором колбеки в скриптах не повторяются, <br />а скрипты могут запускать функции друг у друга и получать данные из других скриптов..<br />-------------------------<br />В итоге не только повышается скорость, но и размер кода сокращается в десятки раз.<br />=============<br />Признаться, все более склоняюсь в сторону такой модели, в первую очередь из-за разрастания скрипта и усложнения его логики из-за чего работа и модификация скрипта становится все более затруднительной...<br />Полагаю можно использовать такую структуру: <br />- базовый скрипт, который определяет статус сессии и агрегирует информацию из коллбэков<br />- описание классов (стратегия, позиция и т.п.)<br />- типовые универсальные модули, например, удаление устаревшей части данных таблиц (цены, бид аск и т.п.), ежедневное определение ключевых временных точек сессии в формате posix, визуализация и логгирование информации и т.п.<br />- собственно скрипты с описанием стратегий, логики определение сигналов на вход и выход и сопутствующих действий...<br /><br />Если кто-то поделится своим видением организационной структуры - буду признателен<br /><br />Поясню свое прежнее беспокойство - у меня большинство скриптов работает одновременно с большим числом инструментов, предполагается большой объем расчетов, опасаюсь, что в тех случаях когда они осуществляются не в теле основного потока (main), а путем многократного вызова функции, это может негативно сказаться на быстродействии скрипта. <br />
			<i>04.07.2020 12:03:37, Иван Ру.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46735/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46735/topic5616/</guid>
			<pubDate>Sat, 04 Jul 2020 12:03:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46730/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br />Все колбеки вызываются из одного потока и каждый из них повторяется в различных скриптах.<br />В итоге получается дублирование одних и тех же действий многократно.<br />=============<br /><br />Согласен с предыдущим оратором. <br />
			<i>04.07.2020 07:56:22, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46730/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46730/topic5616/</guid>
			<pubDate>Sat, 04 Jul 2020 07:56:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46725/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_6dAGsN6s" href="/user/2250/" bx-tooltip-user-id="2250">Иван Ру</a> написал:<br />Интересно мнение форумчан - как предпочитаете писать скрипты - все в одном файле или в виде конструктора - с подгрузкой отдельных файлов:<br />1. Отдельных функций/процедур (выставление заявки, считывание определенных данных и т.п.)<br />2. Отдельных классов (стратегия, позиция и т.п.)<br />=============<br />Существующая структура QLUA имеет существенный недостаток.<br />Все колбеки вызываются из одного потока и каждый из них повторяется в различных скриптах.<br />В итоге получается дублирование одних и тех же действий многократно.<br />Я устранил эту проблему и сделал механизм при котором колбеки в скриптах не повторяются, <br />а скрипты могут запускать функции друг у друга и получать данные из других скриптов..<br />-------------------------<br />В итоге не только повышается скорость, но и размер кода сокращается в десятки раз. <br />
			<i>03.07.2020 18:04:53, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46725/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46725/topic5616/</guid>
			<pubDate>Fri, 03 Jul 2020 18:04:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46724/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Медленней чем, что? У меня код с использованием десятка библиотек выполняется с одной итерация цикла где-то за 150-250 мс. При этом 60 мс - это установленная задержка.<br />Вариантов то нет, если надо писать сложный код. Это будут классы, модули, функциоанальный подход и т.д. Иначе будет совсем не разобраться через некоторое время, открыв свой же код.<br /><br />Это относится не только к скриптам для Квика. Это общая практика программирования.<br /><br />====quote====<br />Вызов отдельной функции требует больше времени, чем исполнения кода в основном потоке<br />=============<br />А где, собственно, это функция вызывается... Все выполняется в дополнительном потоке Квика - функции main. Функцию можно только упрекать в расходовании памяти на дополнительные локальные переменные, но скорость то тут причем.<br /><br />А универсальное пишем как раз для того, чтобы писать скрипты быстро и удобно. Иначе код придется писать с нуля каждый раз. А если ошибка, то что, исправлять в каждом файле. <br />
			<i>03.07.2020 17:13:43, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46724/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46724/topic5616/</guid>
			<pubDate>Fri, 03 Jul 2020 17:13:43 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46719/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_BYAlR69g" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Когда у Вас скрипт на тысячи, десятки тысяч строк, то писать в одном файле это смело.<br />А когда у Вас уже написано много скриптов, то придешь к модулям, т.к. каждый раз писать одно и тоже - это тоже смело.<br />При этом модуль - это не команда dofile в глобальном окружении, а нормальный модуль, подключаемый через require.<br />=============<br />Я тоже думаю об этом, но вижу определенные минусы - если блок кода выносишь в отдельную функцию / подключаемый модуль, мы теряем в загрузке памяти и скорости.<br />Вызов отдельной функции требует больше времени, чем исполнения кода в основном потоке. Универсальный функционал модуля требует бОльшего числа полей, которые должны удовлетворять самые широкие потребности.<br />Вот и интересно, кто как пишет, в каких ситуациях какие варианты предпочитают. Используют ли подгружаемые классы-таблицы... и т.п. <br />
			<i>03.07.2020 16:18:02, Иван Ру.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46719/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46719/topic5616/</guid>
			<pubDate>Fri, 03 Jul 2020 16:18:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46689/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Когда у Вас скрипт на тысячи, десятки тысяч строк, то писать в одном файле это смело.<br />А когда у Вас уже написано много скриптов, то придешь к модулям, т.к. каждый раз писать одно и тоже - это тоже смело.<br />При этом модуль - это не команда dofile в глобальном окружении, а нормальный модуль, подключаемый через require. <br />
			<i>02.07.2020 17:20:49, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46689/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46689/topic5616/</guid>
			<pubDate>Thu, 02 Jul 2020 17:20:49 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Принципы написания скриптов</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message46681/topic5616/">Принципы написания скриптов</a></b> <i>Разделять или объединять?</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Интересно мнение форумчан - как предпочитаете писать скрипты - все в одном файле или в виде конструктора - с подгрузкой отдельных файлов:<br />1. Отдельных функций/процедур (выставление заявки, считывание определенных данных и т.п.)<br />2. Отдельных классов (стратегия, позиция и т.п.) <br />
			<i>02.07.2020 11:44:46, Иван Ру.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message46681/topic5616/</link>
			<guid>http://forum.quik.ru/messages/forum10/message46681/topic5616/</guid>
			<pubDate>Thu, 02 Jul 2020 11:44:46 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
