<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[QUIK -> DDE &mdash; Ошибка в параметрах даты]]></title>
		<link>https://quik2dde.ru/viewtopic.php?id=347</link>
		<atom:link href="https://quik2dde.ru/extern.php?action=feed&amp;tid=347&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Ошибка в параметрах даты».]]></description>
		<lastBuildDate>Tue, 25 May 2021 10:03:36 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3134#p3134</link>
			<description><![CDATA[<div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>.....</p></blockquote></div><div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>.....</p></blockquote></div><p>Парни, благодарю вас за помощь!<br />Каждый из вас в чём-то прав по своему.<br />Главное что на данный момент всё заработало, пусть и не идеально на 100%.<br /><span class="postimg"><img src="https://b.radikal.ru/b20/2105/6b/f7f870c6c8c2.jpg" alt="https://b.radikal.ru/b20/2105/6b/f7f870c6c8c2.jpg" /></span><br />Буду рад с вами пообщаться в новых темах.</p>]]></description>
			<author><![CDATA[null@example.com (RRR)]]></author>
			<pubDate>Tue, 25 May 2021 10:03:36 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3134#p3134</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3131#p3131</link>
			<description><![CDATA[<p>Взаимно, kalikazandr, выводы сделал, и дискутировать с вами более не намерен.<br />Удачи вам!</p>]]></description>
			<author><![CDATA[null@example.com (BlaZed)]]></author>
			<pubDate>Tue, 25 May 2021 08:08:35 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3131#p3131</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3130#p3130</link>
			<description><![CDATA[<p>Уважаемый BlaZed, мне не интересно ваше мнение, совсем.<br />Автор топика уже понял, что не так в коде. Диалог окончен.</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Tue, 25 May 2021 07:47:35 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3130#p3130</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3129#p3129</link>
			<description><![CDATA[<div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>Допустим у меня 300 акций, 3 фьюча и 4500 опционов, по каждому я хочу получить дни, часы, минуты из соответствующих источников. Про то, что столько источников одновременно не протянет квик пропустим.</p></blockquote></div><p>Естественно, пропустим. Если вы берете 100500 источников, которые не потянет квик, то причем тут вообще код lua.</p><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>Считаем время, после которого ваш бот &quot;включится&quot;.<br />Запустите свой код после вечернего клиринга, а лучше, после дисконекта, ждать вы будете минут 20, а цикл рассчитан на 10 сек., т.е. порядка 120 инструментов включатся и получат БОЛТ, вместо данных.</p></blockquote></div><p>Вы хоть пробовали делать то, что предлагаете? Уверен что нет.<br />Еще раз и медленно.<br />Это не торговый робот, а аналитика. Ему не надо постоянно работать, запустил, данные увидел, сделал вывод.<br />Если это не первый запуск скрипта, то данные будут в локальном архиве, откуда без проблем их можно получить.<br />Да и откуда цифры про 20 минут?</p><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>Если у вас работает, это не значит, что код рабочий. Факторов задержки данных может быть много.<br />Я живу в 14 км от ЦОД, у меня оптика в ПК и инет 1Гб/с, и я не пользуюсь такими циклами, потому что это не рабочее решение.</p></blockquote></div><p>Вот есть люди, которые что-то делают, а есть такие, которые только критикуют.<br />Если считаешь это &quot;не рабочим&quot; решением, то предоставь свое &quot;рабочее&quot; в котором не будет надуманных вами проблем.</p><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>ЗЫ: я самоучка и могу ошибаться, т.к. я не знаю тонкостей луа, которые мне не нужны в торговле, но то что я знаю, это наверняка, спорить со мной бесполезно wink</p></blockquote></div><p>Да я уже вижу, что спорить тут бесполезно.<br />Придумываете несуществующие проблемы, а сами даже проверить свои же слова действием не в состоянии. Зато уверенности на 146%</p>]]></description>
			<author><![CDATA[null@example.com (BlaZed)]]></author>
			<pubDate>Tue, 25 May 2021 05:53:06 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3129#p3129</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3128#p3128</link>
			<description><![CDATA[<div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>Мой цикл ожидает загрузку данных в источник по каждому инструменту <strong>не более ~10 секунд</strong>, чего более чем <br />Ну поставьте тогда не 100 итераций, а 1000, суть то остается такой же надо просто дождаться загрузки данных в источник.</p></blockquote></div><p>Допустим у меня 300 акций, 3 фьюча и 4500 опционов, по каждому я хочу получить дни, часы, минуты из соответствующих источников. Про то, что столько источников одновременно не протянет квик пропустим. Считаем время, после которого ваш бот &quot;включится&quot;.</p><p>Запустите свой код после вечернего клиринга, а лучше, после дисконекта, ждать вы будете минут 20, а цикл рассчитан на 10 сек., т.е. порядка 120 инструментов включатся и получат БОЛТ, вместо данных.</p><p>Если у вас работает, это не значит, что код рабочий. Факторов задержки данных может быть много.<br />Я живу в 14 км от ЦОД, у меня оптика в ПК и инет 1Гб/с, и я не пользуюсь такими циклами, потому что это не рабочее решение.<br />ЗЫ: я самоучка и могу ошибаться, т.к. я не знаю тонкостей луа, которые мне не нужны в торговле, но то что я знаю, это наверняка, спорить со мной бесполезно <img src="https://quik2dde.ru/img/smilies/wink.png" width="15" height="15" alt="wink" /></p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Mon, 24 May 2021 20:58:43 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3128#p3128</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3127#p3127</link>
			<description><![CDATA[<div class="quotebox"><cite>RRR пишет:</cite><blockquote><p>Вот только не пойму, почему получается корявый стоп лосс...</p></blockquote></div><p>Если имеется ввиду отсутствие десятичных разрядов на реальном счете, то вторая часть коммента [url]https://quik2dde.ru/viewtopic.php?pid=3118#p3118[/url] должна помочь с этим.</p>]]></description>
			<author><![CDATA[null@example.com (BlaZed)]]></author>
			<pubDate>Mon, 24 May 2021 20:46:56 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3127#p3127</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3126#p3126</link>
			<description><![CDATA[<div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>Ваш цикл сделает 99 итераций (~= 10 секунд) и закончит свое выполнение, т.к. n = 100, если в источнике не появились данные, а они там не успеют появиться. По этому ваше решение - не работает.</p></blockquote></div><p>Мой цикл ожидает загрузку данных в источник по каждому инструменту <strong>не более ~10 секунд</strong>, чего более чем достаточно даже для плохого соединения.<br />И это решение отлично работает.</p><p>Да и с чего вы решили что &quot;они там не успеют появиться&quot;?<br />Вы по диалапу с антарктиды что ли в интернет ходите?<br />Ну поставьте тогда не 100 итераций, а 1000, суть то остается такой же надо просто дождаться загрузки данных в источник.</p>]]></description>
			<author><![CDATA[null@example.com (BlaZed)]]></author>
			<pubDate>Mon, 24 May 2021 20:34:40 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3126#p3126</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3125#p3125</link>
			<description><![CDATA[<div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>Еще раз взгляните на мой while, только повнимательнее, может быть поймете что чушь сморозили.</p></blockquote></div><p>Чушь не морозят, ее обычно порют свинопасы. <br />Ваш цикл сделает 99 итераций (~= 10 секунд) и закончит свое выполнение, т.к. n = 100, если в источнике не появились данные, а они там не успеют появиться. По этому ваше решение - не работает.</p><div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>Тут согласен, код так себе, но как бы автор кода в первом посте упомянул что он не спец, какие вопросы то?</p></blockquote></div><p>В первом посте не автор кода, если вы не заметили, то код писал С# -вец, а RRR лишь автор поста и разбирается в чужом говнокоде, в котором, еще раз отмечу, разбираться нечего - выкинуть в помойку и написать свое, рабочее решение.</p><div class="quotebox"><cite>RRR пишет:</cite><blockquote><p> Вот только не пойму, почему получается корявый стоп лосс...</p></blockquote></div><p>Потому что на &quot;0&quot; делить нельзя.</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Mon, 24 May 2021 20:05:15 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3125#p3125</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3124#p3124</link>
			<description><![CDATA[<div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>................................</p></blockquote></div><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>..........................</p></blockquote></div><p>Парни спасибо за советы. Завтра попробую пофиксить,посмотрю что получится.<br />И да, это пока просто анализатор. Что бы он начал торговать нужно ещё руки приложить.<br />Вот только не пойму, почему получается корявый стоп лосс...</p>]]></description>
			<author><![CDATA[null@example.com (RRR)]]></author>
			<pubDate>Mon, 24 May 2021 19:29:45 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3124#p3124</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3123#p3123</link>
			<description><![CDATA[<div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>Предлагаете все возможные проверки в код вкорячивать?</p></blockquote></div><p>Точно, если нет желания слить депо в моменте.</p></blockquote></div><p>А так понимаю, вы или код не смотрели, или смотрели но ничего не поняли.<br />Подсказка, это не торговый робот, это анализ данных.</p><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>Аргументы будут?</p></blockquote></div><p>А какие нужны? то что ваш цикл выполнит 100 итераций и что? должно что то поменяться? может данные поступят за это время? ну может быть, с утра, до торговой сессии, а ну как вечером?<br />Достаточно аргументов?</p></blockquote></div><p>Еще раз взгляните на мой while, только повнимательнее, может быть поймете что чушь сморозили.</p><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>Кста код, приведенный автором - может быть и не весь (мне это не известно), но работать будет.</p></blockquote></div><p>Не будет, не определен рабочий цикл типа while is run do</p></blockquote></div><p>Что, правда? Вам бы подучить qlua, желательно с самых азов.<br />Вот помня ваши ранние посты, считал что вы спец.<br />А сейчас такую чушь порите, что возникают сомнения ваш ли это аккаунт.</p><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>Смотрите внимательнее. Хотя смотреть там особо нечего, создатель кода не знает луа, судя по бессмысленным вызовам встроенных функций, тем более не знает qlua.</p></blockquote></div><p>Тут согласен, код так себе, но как бы автор кода в первом посте упомянул что он не спец, какие вопросы то?</p>]]></description>
			<author><![CDATA[null@example.com (BlaZed)]]></author>
			<pubDate>Mon, 24 May 2021 18:38:40 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3123#p3123</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3122#p3122</link>
			<description><![CDATA[<div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>Предлагаете все возможные проверки в код вкорячивать?</p></blockquote></div><p>Точно, если нет желания слить депо в моменте.<br /></p><div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>Аргументы будут?</p></blockquote></div><p>А какие нужны? то что ваш цикл выполнит 100 итераций и что? должно что то поменяться? может данные поступят за это время? ну может быть, с утра, до торговой сессии, а ну как вечером?<br />Достаточно аргументов?</p><div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>Кста код, приведенный автором - может быть и не весь (мне это не известно), но работать будет.</p></blockquote></div><p>Не будет, не определен рабочий цикл типа while is run do<br />Смотрите внимательнее. Хотя смотреть там особо нечего, создатель кода не знает луа, судя по бессмысленным вызовам встроенных функций, тем более не знает qlua.</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Mon, 24 May 2021 18:19:00 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3122#p3122</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3121#p3121</link>
			<description><![CDATA[<div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>Я бы не был так уверен. С датасорсем не все просто. А если дисконект? Нужно отписаться после соединения, а потом заново подписаться.</p></blockquote></div><p>Предлагаете все возможные проверки в код вкорячивать? Об этом разговора не было.<br />Была конкретная проблема, найдено решение под указанную проблему.<br /></p><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>Ваш while точно - нет!</p></blockquote></div><p>Аргументы будут?<br /></p><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>Кста код, приведенный автором - не весь и работать не будет совсем.</p></blockquote></div><p>Кста код, приведенный автором - может быть и не весь (мне это не известно), но работать будет.</p>]]></description>
			<author><![CDATA[null@example.com (BlaZed)]]></author>
			<pubDate>Mon, 24 May 2021 17:25:15 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3121#p3121</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3120#p3120</link>
			<description><![CDATA[<div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>Тут все предельно просто.<br />Скрипт начинает работать со свечами не дождавшись пока инструменты подпишутся на график. Как следствие попытка получить дату 0 свечи, которой даже не существует, ну и т.д.</p><p>Достаточно добавить в ranked_watch_list.lua после datasource:SetEmptyCallback() ожидание подписки на график, типа такого<br /></p><div class="codebox"><pre><code>local n=0
while(datasource:Size()==0)and(n&lt;100)do sleep(100) n=n+1 end</code></pre></div></blockquote></div><p>Я бы не был так уверен. С датасорсем не все просто. А если дисконект? Нужно отписаться после соединения, а потом заново подписаться.<br />Ваш while точно - нет!<br />Кста код, приведенный автором - не весь и работать не будет совсем.</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Mon, 24 May 2021 16:49:34 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3120#p3120</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3118#p3118</link>
			<description><![CDATA[<p>Тут все предельно просто.<br />Скрипт начинает работать со свечами не дождавшись пока инструменты подпишутся на график. Как следствие попытка получить дату 0 свечи, которой даже не существует, ну и т.д.</p><p>Достаточно добавить в ranked_watch_list.lua после datasource:SetEmptyCallback() ожидание подписки на график, типа такого<br /></p><div class="codebox"><pre><code>local n=0
while(datasource:Size()==0)and(n&lt;100)do sleep(100) n=n+1 end</code></pre></div><br /><p>PS: Ну и в utils.lua замени<br /></p><div class="codebox"><pre><code>--  result.scale = tonumber(getParamEx2(classCode, secCode, dbName).param_value)
  result.scale = string.format(&quot;%.0f&quot;,getParamEx2(classCode, secCode, dbName).param_value)</code></pre></div><p>чтобы на заполнение стоплосса не ругалось<br />а в ranked_watch_list.lua точку поставить забыл<br /></p><div class="codebox"><pre><code>--  SetCell(tId, rowId, 2, string.format(&quot;%&quot;..tostring(security.params.scale)..&quot;f&quot;, security.stopLoss), security.stopLoss)
SetCell(tId, rowId, 2, string.format(&quot;%.&quot;..tostring(security.params.scale)..&quot;f&quot;, security.stopLoss), security.stopLoss)</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (BlaZed)]]></author>
			<pubDate>Mon, 24 May 2021 13:30:06 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3118#p3118</guid>
		</item>
		<item>
			<title><![CDATA[Re: Ошибка в параметрах даты]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3112#p3112</link>
			<description><![CDATA[<div class="quotebox"><cite>BlaZed пишет:</cite><blockquote><p>Но не видя кода что-то большее сказать практически не возможно.</p></blockquote></div><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>lua сам прекрасно разбирается с типом данных.</p></blockquote></div><p>Вы абсолютно правы.<br />Сейчас сброшу код, там три файла, в один не получилось запилить. <br />Хотя судя по тому что не работает и в три тоже не особо получилось.<br />Если отключить эту строчку выходит вот что<br /> <span class="postimg"><img src="https://a.radikal.ru/a14/2105/9f/b156600315d8.jpg" alt="https://a.radikal.ru/a14/2105/9f/b156600315d8.jpg" /></span><br />А так таблица выглядит на реале. И стоп-лосс как-то коряво считает.</p><p><span class="postimg"><img src="https://c.radikal.ru/c01/2105/54/ae2ab5a45c71.jpg" alt="https://c.radikal.ru/c01/2105/54/ae2ab5a45c71.jpg" /></span><br />main.lua<br /></p><div class="codebox"><pre><code>package.path = getScriptPath() .. &#039;/?.lua;&#039; .. package.path
local RankedWatchList = require(&#039;ranked_watch_list&#039;)
local settings = {
  color = {
    new = RGB(0, 255, 0),
    old = RGB(255, 255, 0),
    out = RGB(255, 0, 0)  },
    daysBack = 0,
    top = 8,               --Количество лучших которое будем искать
    period = 5,            -- Период за который будем считать
}
local getWatchList = function ()  -- Список акций для отбора добавляем в ручную
  return {
    QJSIM = {                    
      &quot;RASP&quot;,&quot;HYDR&quot;,&quot;GMKN&quot;, &quot;LKOH&quot;,&quot;MVID&quot;,&quot;CHMF&quot;,&quot;MFON&quot;,&quot;NVTK&quot;,&quot;ALRS&quot;,&quot;NLMK&quot;,&quot;RTKM&quot;,&quot;SNGSP&quot;,&quot;ROSN&quot;,&quot;IRAO&quot;,&quot;FEES&quot;,&quot;PHOR&quot;,&quot;RSTI&quot;,&quot;MAGN&quot;,&quot;SIBN&quot;,&quot;TRNFP&quot;,&quot;SBERP&quot;,&quot;VTBR&quot;,&quot;SNGS&quot;,&quot;GAZP&quot;,&quot;MGNT&quot;,&quot;MTSS&quot;,&quot;TATN&quot;,&quot;MSNG&quot;,&quot;SBER&quot;,&quot;MOEX&quot;,&quot;AFLT&quot;,&quot;MTLR&quot;
    }---------------------------------------- или TQBR для реала
  }
end
function main ()
  local tId = AllocTable()
  AddColumn(tId, 0, &quot;Ticker&quot;, true, QTABLE_STRING_TYPE, 8) -- акции 
  AddColumn(tId, 1, &quot;Close&quot;, true, QTABLE_DOUBLE_TYPE, 10) -- цена закрытия
  AddColumn(tId, 2, &quot;StopLoss&quot;, true, QTABLE_DOUBLE_TYPE, 10) -- рекомендуемая цена стоп-лоса
  AddColumn(tId, 3, &quot;Prev. close&quot;, true, QTABLE_DOUBLE_TYPE, 10) -- звкрытие на прошлой неделе
  AddColumn(tId, 4, &quot;% diff&quot;, true, QTABLE_DOUBLE_TYPE, 10) -- % изменения
  AddColumn(tId, 5, &quot;Rank&quot;, true, QTABLE_INT_TYPE, 10) -- классифицирование
  AddColumn(tId, 6, &quot;Prev. Rank&quot;, true, QTABLE_INT_TYPE, 10) -- предыдущее значение, классификация
  AddColumn(tId, 7, &quot;Avg. daily vol&quot;, true, QTABLE_DOUBLE_TYPE, 15) -- средн.суточный объем за 2 недели
    CreateWindow(tId)
        local rankedWatchList = RankedWatchList:new(getWatchList(), settings)
        rankedWatchList:renderToTable(tId)
end</code></pre></div><p>utils.lua<br /></p><div class="codebox"><pre><code>local utils = {}
function utils.getPercentDiff (x0, x1)-- получение %-й разницы
  return 100 * (x1 - x0) / x0
end
function utils.formatDate (dt) -- дата
 message(&quot;dt.year=&quot;..dt.year..&quot; dt.month=&quot;..dt.month..&quot; dt.day=&quot;..dt.day)
 return os.date(&quot;%d.%m.%Y&quot;, os.time{year = dt.year, month = dt.month, day = dt.day})    --ошибка в параметрах даты
end
function utils.formatDateTime (dateTime) --дата и время
  return os.date(&quot;%d.%m.%Y %H:%M:%S&quot;, dateTime and os.time{year = dateTime.year, month = dateTime.month, day = dateTime.day, hour = dateTime.hour, min = dateTime.min, sec = dateTime.sec} or os.time())
end
function utils.calculateStopLossPrice (args) --расчёт стоплосса
  return args.close - (2 * args.avgDailyVol * args.close / 100.0)
end
function utils.getSecurityParams (classCode, secCode) --получение параметров
    local dbName = &quot;SEC_SCALE&quot;
    local result = {}
  if ParamRequest(classCode, secCode, dbName) then
  result.scale = tonumber(getParamEx2(classCode, secCode, dbName).param_value)
  else
    error(string.format(&quot;Не удалось выполнить запрос на получение параметров: ParamRequest(class_code=%s, sec_code=%s, db_name=%s)&quot;, classCode, secCode, dbName))
      message(&quot;Не удалось выполнить запрос на получение параметров: ParamRequest(class_code=%s, sec_code=%s, db_name=%s)&quot;, classCode, secCode, dbName)
  end
  if not CancelParamRequest(classCode, secCode, dbName) then
    error(string.format(&quot;Не удалось выполнить запрос на отмену получения параметров: CancelParamRequest(class_code=%s, sec_code=%s, db_name=%s)&quot;, classCode, secCode, dbName))
      message(&quot;Не удалось выполнить запрос на отмену получения параметров: CancelParamRequest(class_code=%s, sec_code=%s, db_name=%s)&quot;, classCode, secCode, dbName)
  end
    return result
end
    return utils</code></pre></div><p>ranked_watch_list.lua</p><div class="codebox"><pre><code>package.path = getScriptPath() .. &#039;/?.lua;&#039; .. package.path
local utils = require(&#039;utils&#039;)
local RankedWatchList = {
  list = nil,
  info = nil
}
function RankedWatchList:new (securitiesList, settings)
  local daysBack = settings.daysBack or 0
  local period = settings.period
  local public = {}
    function public:refresh ()
  
    self.list = {}
    self.info = {}
  --------------------------------------------- открытые источники данных для ценных бумаг в списке
    for classCode, secCodes in pairs(securitiesList) do
      for _, secCode in ipairs(secCodes) do
        local datasource = CreateDataSource(classCode, secCode, INTERVAL_D1)
        datasource:SetEmptyCallback()
        table.sinsert(self.list, {
          classCode = classCode,
          secCode = secCode,
          datasource = datasource,
          params = utils.getSecurityParams(classCode, secCode)
        })
      end
    end
    sleep(1000)
-------------------------------------------------------------------------создаём таблицу
    for _, security in ipairs(self.list) do
        local datasource = security.datasource
        local lastCandleIndex = datasource:Size() - daysBack
      if not self.info.reportDateTime then 
        self.info.reportDateTime = datasource:T(lastCandleIndex)
      end
        local periodAgoCandleIndex = lastCandleIndex - period
      if not self.info.periodAgoDateTime then 
        self.info.periodAgoDateTime = datasource:T(periodAgoCandleIndex)
      end
        local closePeriodAgo = datasource:C(periodAgoCandleIndex)
      local closeTwoPeriodsAgo = datasource:C(periodAgoCandleIndex - period)
        local twoPeriods = 2 * period
      local avgDailyVolSum = 0.0
      for i = lastCandleIndex, lastCandleIndex - twoPeriods + 1, -1 do
        avgDailyVolSum = avgDailyVolSum + math.abs(utils.getPercentDiff(datasource:C(i - 1), datasource:C(i)))
      end
      local avgDailyVol = avgDailyVolSum / twoPeriods
        local close = datasource:C(lastCandleIndex)
        datasource:Close()
      security.datasource = nil
      security.close = close
      security.closePeriodAgo = closePeriodAgo
      security.difference = utils.getPercentDiff(closePeriodAgo, close)
      security.differencePeriodAgo = utils.getPercentDiff(closeTwoPeriodsAgo, closePeriodAgo)
      security.avgDailyVol = avgDailyVol
      security.stopLoss = utils.calculateStopLossPrice({close = close, avgDailyVol = avgDailyVol})
    end
     table.ssort(self.list, function (a, b) return a.differencePeriodAgo &gt; b.differencePeriodAgo end)
    for i, entry in ipairs(self.list) do
      entry.prevRank = i
    end
     table.ssort(self.list, function (a, b) return a.difference &gt; b.difference end)
      return self
  end
  function public:renderToTable(tId)
      Clear(tId)
      local nowDateTimeAsString = utils.formatDateTime()
      local reportDateAsString
    if daysBack == 0 then
      reportDateAsString = nowDateTimeAsString
    else
      reportDateAsString = utils.formatDate(self.info.reportDateTime)
    end
    SetWindowCaption(tId, string.format(&quot;[%s] Лучшие акции от %s до %s&quot;, nowDateTimeAsString, utils.formatDate(self.info.periodAgoDateTime), reportDateAsString)) -- Выдаёт ошибку в названии от и до не вводится от которой даты считает
     for rank, security in ipairs(self.list) do
      local rowId = InsertRow(tId, -1)                      --Заполним столбцы данными
      SetCell(tId, rowId, 0, security.secCode)
      SetCell(tId, rowId, 1, tostring(security.close), security.close)
      SetCell(tId, rowId, 2, string.format(&quot;%&quot;..tostring(security.params.scale)..&quot;f&quot;, security.stopLoss), security.stopLoss)   --ОШИБКА   _invalid option &#039;%.&#039; to &#039;format&#039;)
      SetCell(tId, rowId, 3, tostring(security.closePeriodAgo), security.closePeriodAgo)
      SetCell(tId, rowId, 4, string.format(&quot;%.2f&quot;, security.difference), security.difference)
      SetCell(tId, rowId, 5, tostring(rank), rank)
      SetCell(tId, rowId, 6, tostring(security.prevRank), security.prevRank)
      SetCell(tId, rowId, 7, string.format(&quot;%.2f&quot;, security.avgDailyVol), security.avgDailyVol)
      local color = nil
      if rank &gt; settings.top then                          --Окраска в соответствии изменений
        if security.prevRank &lt;= settings.top then 
          color = settings.color.out
        end
      else
        if security.prevRank &gt; settings.top then 
          color = settings.color.new
        else
          color = settings.color.old
        end    
      end
  if color then SetColor(tId, rowId, QTABLE_NO_INDEX, color, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR) end
    end
  end
    setmetatable(public, self)
    self.__index = self
    public:refresh()
    return public
end
    return RankedWatchList</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (RRR)]]></author>
			<pubDate>Mon, 24 May 2021 08:58:12 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3112#p3112</guid>
		</item>
	</channel>
</rss>
