<?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>Sun, 03 May 2026 15:27:32 +0300</pubDate>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79011/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Да разработчики решили, что мы это просто между собой общаемся. Давно руки чешутся использовать Квик просто как трубу для сторонних приложений, сервисов и забыть про все особенности. <br />
			<i>02.07.2025 10:19:22, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79011/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79011/topic9192/</guid>
			<pubDate>Wed, 02 Jul 2025 10:19:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79002/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Я про это <noindex><a href="https://forum.quik.ru/messages/forum10/message78496/topic8506/#message78496" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum10/message78496/topic8506/#message78496</a></noindex> Вообщем то я все подробно показал. А то мешаем <a class="blog-p-user-name" id="bp_HISqUaLW" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a>, пообщаться с разработчиками. <br />
			<i>01.07.2025 13:26:36, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79002/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79002/topic9192/</guid>
			<pubDate>Tue, 01 Jul 2025 13:26:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78985/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_xva0Pwe6" href="/user/16131/" bx-tooltip-user-id="16131">VPM</a> написал:<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex>, &nbsp;_ Ни о каком лучше или хуже речь не идет, речь о надежности, промышленной надежности. Мой пример реализован в модуле, то есть можно использовать в OnCalculate, так и в потоке main создавая псевдонимы функций.<br /><br />Вот реализация для индикаторов 
====code====
<pre> </pre>
=============
 <br /><br />=============<br />Для меня, то, Ваш скрипт от 26.06.2025 15:35:14 &nbsp;выглядит излишне сложным.<br />Я делал подобные конструкции лет 10 назад. <br />------------------<br />Ваше утверждение &nbsp; о &quot;промышленной надежности&quot; &nbsp;мне не понятно.<br />-------------------<br />В общепринятом смысле, <br />Промышленная надёжность — это свойство объекта сохранять работоспособность в течение заданного времени в определённых условиях эксплуатации.<br />---------------------- <br />О каком объекте Вы говорите (Ваш скрипт ???), &nbsp;но это не промышленный объект.<br />-------------------- <br />
			<i>30.06.2025 19:06:41, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78985/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78985/topic9192/</guid>
			<pubDate>Mon, 30 Jun 2025 19:06:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78981/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_jqdykT3v" href="/user/62/" bx-tooltip-user-id="62">nikolz</a>, &nbsp;_ Ни о каком лучше или хуже речь не идет, речь о надежности, промышленной надежности. Мой пример реализован в модуле, то есть можно использовать в OnCalculate, так и в потоке main создавая псевдонимы функций.<br /><br />Вот реализация для индикаторов
====code====
<pre>function Init() 

-- создаю псевдоним
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local Wilder = dofile("E:&#92;&#92;cached.lua") -- getWorkingFolder() .. 
f = Wilder.RSI_Indicator() 
Wilder=nil
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Задаю линии для вывода
Settings.line = {
{Name = "50", Color = RGB(24, 24, 24), Type = TYPE_DASHDOT, Width = 1},
{Name = "lineup", Color = RGB(240, 0, 0), Type = TYPE_DASHDOT, Width = 1},
{Name = "linedw", Color = RGB(240, 0, 0), Type = TYPE_DASHDOT, Width = 1},

{Name = "RSI", Color = RGB(0, 0, 255), Type = TYPE_DASHDOT, Width = 2},
--{Name = "trigger",Color = RGB(255, 0, 0), Type = TYPE_LINE, Width = 1},
--{Name = "signal",Color = RGB(055, 055, 055), Type = TYPE_HISTOGRAM, Width = 1}
}
return #Settings.line
end
function OnCalculate(I) 

-- получаю расчеты из внутренней функции
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local out = f(I, Settings)
-- вывод результатов
if out then
&nbsp;&nbsp;&nbsp;&nbsp;return 50, Settings.lineup, Settings.linedw, out.rsi , out.rsi1 
end

return
end</pre>
=============
В потоке main тоже самое, индексация через Size().<br /><br />Замерять быстродействие?<br />1) в OnCalculate (в потоке терминала) плохой тон, да и что это дает, одно дело пустой терминал, совсем другое загруженных графиками в часы пик, это совсем другая задача.<br />2) в скрипте (в потоке main) делаю по умолчанию, замеряя метрики производительности для всей программы (высказывался про это, разбираясь с промышленной реализацией).<br />Да и что измерять, если речь идет о статистических метриках, окно в 14 бар а лаг половину периода в этой реализации (Миг против Вечности). Собственно код должен быть рабочим и Вы все сами можете замерить и сравнить.<br /><br />Повторюсь я лишил подсветил проблему надежности исполнения скрипта, те вопросы которые относятся к технологическим аспектам выполнения расчетов. <br /><br />Вот алгоритм из примера выше:<br />В публичной части (константы для приватной части)<br /> &nbsp; &nbsp;-- 1. Локальные утилиты для оптимизации<br /> &nbsp; &nbsp; &nbsp; -- Форматирование даты и времени<br /> &nbsp; &nbsp; &nbsp; -- Функция округления<br /> &nbsp; &nbsp;-- 2. Функции сглаживания<br /> &nbsp; &nbsp;-- 3. Состояние индикатора &nbsp; 
====code====
<pre> local cache = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialized = false,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last_index = 0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;history = {},&nbsp;&nbsp;-- Хранилище для исторических значений
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Configs = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;period = 14,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method = "SMMA",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_history = 100
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_price = nil
&nbsp;&nbsp;&nbsp;&nbsp;}</pre>
=============
В приватной части:<br /> &nbsp; &nbsp; &nbsp; &nbsp;-- A. Обновление параметров<br /> &nbsp; &nbsp; &nbsp; &nbsp;-- D. Получение текущей цены закрытия<br /> &nbsp; &nbsp; &nbsp; &nbsp;-- E. Инициализация записи для текущего индекса<br /> &nbsp; &nbsp; &nbsp; &nbsp;-- F. Расчет изменения цены<br /> &nbsp; &nbsp; &nbsp; &nbsp;-- H. Расчет средних значений<br /> &nbsp; &nbsp; &nbsp; &nbsp;-- I. Расчет RSI<br /> &nbsp; &nbsp; &nbsp; &nbsp;-- K. Формирование результата в {}<br /> &nbsp; &nbsp; &nbsp; &nbsp;return {} <br />
			<i>30.06.2025 16:29:44, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78981/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78981/topic9192/</guid>
			<pubDate>Mon, 30 Jun 2025 16:29:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78966/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_sgo4vp8w" href="/user/16131/" bx-tooltip-user-id="16131">VPM</a> написал:<br />На проблему озвученную в первом сообщении, там же есть ответ, проблема в версии, все что нужно для нормального вывода, выбросить данную фикцию, получить таблицу и вернуть необходимое количество линий?<br /><br />Не есть и другой вариант: ждать год пока ответит разработчик, следующие 2 года будет исправлять, а в новой выпущенной версии, какой ни будь &quot;молодой талант&quot; все опять грохнет. На мой взгляд, подход тупиковый! А в целях надежности исполнения вычислений, такие функции нужно уменьшать в коде, лучше совсем убрать.<br /><br />Извиняюсь что опять вмешиваюсь, просто хочу подсветить параллельную нерешенную задачу. Решение лежит в плоскости создания - универсальной, технологической обвязки, в которою можно было бы не опасаясь загружать любой алгоритм и она с ним справлялась, выдавая на гора результат. Примерный алгоритм такой обвязки я привел в своем примере выше (мягко говоря не идеальный вариант), а хотелось чтоб профессиональное сообщество обсудило, не в соревновательном режиме, а в рамках сотрудничества, чтоб получить надежный публичный вариант. &nbsp;Все одна только польза! :: &nbsp;<br />=============<br />Можете доказать? &nbsp;Напишите два примера: &nbsp;для вашей реализации и альтернативной и покажи, что ваша реализация лучше, т е быстрее. <br />
			<i>29.06.2025 18:51:22, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78966/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78966/topic9192/</guid>
			<pubDate>Sun, 29 Jun 2025 18:51:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78963/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			На проблему озвученную в первом сообщении, там же есть ответ, проблема в версии, все что нужно для нормального вывода, выбросить данную фикцию, получить таблицу и вернуть необходимое количество линий?<br /><br />Не есть и другой вариант: ждать год пока ответит разработчик, следующие 2 года будет исправлять, а в новой выпущенной версии, какой ни будь &quot;молодой талант&quot; все опять грохнет. На мой взгляд, подход тупиковый! А в целях надежности исполнения вычислений, такие функции нужно уменьшать в коде, лучше совсем убрать.<br /><br />Извиняюсь что опять вмешиваюсь, просто хочу подсветить параллельную нерешенную задачу. Решение лежит в плоскости создания - универсальной, технологической обвязки, в которою можно было бы не опасаясь загружать любой алгоритм и она с ним справлялась, выдавая на гора результат. Примерный алгоритм такой обвязки я привел в своем примере выше (мягко говоря не идеальный вариант), а хотелось чтоб профессиональное сообщество обсудило, не в соревновательном режиме, а в рамках сотрудничества, чтоб получить надежный публичный вариант. &nbsp;Все одна только польза! <img src="http://forum.quik.ru/upload/main/smiles/5/icon_smile.png" border="0" data-code=":smile:" data-definition="SD" alt=":smile:" style="width:16px;height:16px;" title="С улыбкой" class="bx-smile" /> &nbsp; <br />
			<i>29.06.2025 09:42:17, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78963/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78963/topic9192/</guid>
			<pubDate>Sun, 29 Jun 2025 09:42:17 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78961/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_EyyuAkT6" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br /> <br />====quote====<br />Предположу, что У Вас большой архив данных.<br />Попробуйте установить QUIK в новую папку.<br /> В итоге архив будет не более 3т свечей.<br />=============<br /> Я тоже это предполагаю. Но тест идет на акции Сбербанка, где число баров с утра на демо-сервере не более 100. Плюс хотелось бы понять как размер архивов по другим инструментам (график которых не открыт) влияет на производительность всего терминала.<br />=============<br />Трудно что-то сказать, но я очевидно не понял проблему, так как на тесте, который запускал, не увидел ничего странного.<br />Запустите свой тест у себя с выводом в лог файл как я добавил, что бы в логе увидеть то, что вам не нравится. <br />
			<i>28.06.2025 18:10:06, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78961/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78961/topic9192/</guid>
			<pubDate>Sat, 28 Jun 2025 18:10:06 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78960/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br />Предположу, что У Вас большой архив данных.<br />Попробуйте установить QUIK в новую папку.<br /> В итоге архив будет не более 3т свечей.<br />=============<br />Я тоже это предполагаю. Но тест идет на акции Сбербанка, где число баров с утра на демо-сервере не более 100. Плюс хотелось бы понять как размер архивов по другим инструментам (график которых не открыт) влияет на производительность всего терминала. <br />
			<i>28.06.2025 10:16:29, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78960/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78960/topic9192/</guid>
			<pubDate>Sat, 28 Jun 2025 10:16:29 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78958/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_WposcFVd" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Проблема в этом &nbsp;<noindex><a href="https://disk.yandex.ru/i/-GHF6orcG8COlA" target="_blank" rel="nofollow">https://disk.yandex.ru/i/-GHF6orcG8COlA</a></noindex> <br /><br />Впрочем, не исключаю, что возможно требуется техническая чистка терминала, т.к. этот комплект обновлятся с 7-ой версии. Но назвать это нормальным сложно.<br />=============<br />Предположу, что У Вас большой архив данных.<br />Попробуйте установить QUIK в новую папку.<br /> В итоге архив будет не более 3т свечей. <br />
			<i>28.06.2025 06:38:01, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78958/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78958/topic9192/</guid>
			<pubDate>Sat, 28 Jun 2025 06:38:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78946/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Проблема в этом <noindex><a href="https://disk.yandex.ru/i/-GHF6orcG8COlA" target="_blank" rel="nofollow">https://disk.yandex.ru/i/-GHF6orcG8COlA</a></noindex><br /><br />Впрочем, не исключаю, что возможно требуется техническая чистка терминала, т.к. этот комплект обновлятся с 7-ой версии. Но назвать это нормальным сложно. <br />
			<i>27.06.2025 08:54:51, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78946/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78946/topic9192/</guid>
			<pubDate>Fri, 27 Jun 2025 08:54:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78945/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<noindex><a href="https://forum.quik.ru/user/3132/" target="_blank" rel="nofollow">Nikolay</a></noindex>,<br />Ваш тест, добавил вывод в лог
====code====
<pre>name= "test_lines"
lines = 100
Settings = {}
Settings.Name = "*"..name
Settings.price = 66960
Settings.delta = 1.0

path = "D:/QUIK_SCRIPT/"
local fn=path..name..".txt"
Log=io.open(fn,"w")

function Init()
&nbsp;&nbsp; Settings.line = {}
&nbsp;&nbsp; for i = 1, lines do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Settings.line = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Settings.line = {Color = RGB(185, 185, 185), Type = TYPET_BAR, Width = 2}
&nbsp;&nbsp; end
&nbsp;&nbsp; return lines
end

function OnChangeSettings()
&nbsp;&nbsp; Init()
end

function OnCalculate(index)
&nbsp;&nbsp; if index &#60; Size() then return end
&nbsp;&nbsp; local x=os.clock()
&nbsp;&nbsp; for i = 1, lines do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SetRangeValue(i,index-100, index-1, Settings.price-i*Settings.delta);
&nbsp;&nbsp; end
&nbsp;&nbsp; Log:write("index="..index..","..x..","..os.clock().."&#92;n"); Log:flush();
&nbsp;&nbsp; return
end
</pre>
=============
<br />Вот результат работы Вашего теста:<br />[FILE ID=12616]<br />Я вывел в Log время построения линий <br />вот что получил<br />------------------<br />index=127,1287.011,1287.012<br />index=127,1287.021,1287.022<br />----------------<br />Т е все линии выводятся 1 ms.<br />Версия qUIK 12.4.0.38. <br />Все правильно?<br />Какие проблемы? <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=12616&" width="1544" height="660" /><br /><i>27.06.2025 06:36:06, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78945/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78945/topic9192/</guid>
			<pubDate>Fri, 27 Jun 2025 06:36:06 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78944/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ещё немного потестил в ситуации: луа 5.4, квик 12.2.2.8, торги не идут.<br />добавляю скрипт на чарт с сбером, галки автомасштабирования и последнего значения сняты, на таймфрейме A, ничего не показывает - меняю таймфрейм на B - тогда показывает все линии, меняю таймфрейм на A - ничего не показывает, меняю таймфрейм на B - ничего не показывает, меняю на C - показывает все линии. То есть на каждом тф, кроме первого, линии показываются ровно один раз. Но квик не виснет и не тупит. Поведение при этом не зависит от количества линий, т.е. при local lines = 1 тоже самое.<br /><br />То есть SetRangeValue точно бажная функция. <br />
			<i>27.06.2025 01:20:22, funduk.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78944/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78944/topic9192/</guid>
			<pubDate>Fri, 27 Jun 2025 01:20:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78943/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_MNTofcn5" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a>, версия с cache на SBER, 15 ничего не показывает у меня при любом delta (хотя SetRangeValue возвращает true), и не вешает терминал. Я тестил без подключения к серверу. <br />
			<i>27.06.2025 01:00:06, funduk.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78943/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78943/topic9192/</guid>
			<pubDate>Fri, 27 Jun 2025 01:00:06 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78938/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><noindex><a href="/user/3132/" target="_blank" rel="nofollow">Nikolay</a></noindex>, &nbsp;Весь этот форум посвящён одной большой проблеме, если Вы думаете что устранив данную, не будет похожей, &nbsp;через некоторое время, я думаю мягко говоря Вы ошибаетесь.Думаю нужна профессиональная смекалка, или как тут выражался пользователь &quot;покумекать&quot;, чтоб по крайней мере следующая проходила мимо. <br /><br />Код который я выложил несет в себе две основные особенности. 1) Буферизация. (Зачем скажем 65 000 свечей если окно 14 бар?); 2) Своевременную очистку данных (Зачем скажем 65 000 свечей хранить, если окно 14 бар); ну и конечно момент обновлений и расчётов, зачем рассчитывать каждый тик, если квик с трудом обновляет данные за одну секунду?<br />=============<br />Я уже говорил Вам, что я прекрасно знаю как и что делать для оптимизации кода индикатора. И рабочий код не рассчитывает ничего каждый тик, не хранит историю на все бары, т.к. это бессмысленно и т.д. Здесь предоставлен пример, воспроизводящий проблему. Эта тема посвящена только одному - большое число линий на графике. Все. Хотя, если подумать, странно ожидать, что терминал не может справится с такой простой нагрузкой даже каждый тик.<br /><br />Впрочем, Вам явно необходимо высказаться. Вот пример без расчёта на каждый тик. И он точно также &quot;убивает&quot; терминал. У Вас работает, у меня нет. Поэтому мне интересно мнение разработчиков.<br /><br /><span class="bx-font" style="color:#272c31"><span class="bx-font" style="font-family:FiraCode NF, Consolas, Courier New, monospace"><span class="bx-font" style="font-size:;">
====code====
<pre>
local lines = 100
Settings = {}
Settings.Name = "*test_lines"
Settings.price = 313
Settings.delta = 0.01
local cache = {}
function Init()
&nbsp;&nbsp;&nbsp;&nbsp;Settings.line = {}
&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, lines do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Settings.line&#91;i&#93; = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Settings.line&#91;i&#93; = {Color = RGB(185, 185, 185), Type = TYPET_BAR, Width = 2}
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;cache = {}
&nbsp;&nbsp;&nbsp;&nbsp;return lines
end

function OnChangeSettings()
&nbsp;&nbsp;&nbsp;&nbsp;Init()
end
function OnCalculate(index)
&nbsp;&nbsp;&nbsp;&nbsp;if index &#60; Size() then return end
&nbsp;&nbsp;&nbsp;&nbsp;if cache&#91;index&#93; then return end
&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, lines do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetRangeValue(i, index-100, index-1, Settings.price-i*Settings.delta)
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;cache&#91;index&#93; = true
&nbsp;&nbsp;&nbsp;&nbsp;message('calc '..tostring(index))
&nbsp;&nbsp;&nbsp;&nbsp;return
end</pre>
=============
</span></span></span> <br />
			<i>26.06.2025 19:37:08, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78938/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78938/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 19:37:08 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78937/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_LDwzxAJl" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Все же эта тема посвящена конкретной технической проблеме терминала.<br />=============<br /><a class="blog-p-user-name" id="bp_uCZRKldb" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a>, &nbsp;Весь этот форум посвящён одной большой проблеме, если Вы думаете что устранив данную, не будет похожей, &nbsp;через некоторое время, я думаю мягко говоря Вы ошибаетесь.Думаю нужна профессиональная смекалка, или как тут выражался пользователь &quot;покумекать&quot;, чтоб по крайней мере следующая проходила мимо. <br /><br />Код который я выложил несет в себе две основные особенности. 1) Буферизация. (Зачем скажем 65 000 свечей если окно 14 бар?); 2) Своевременную очистку данных (Зачем скажем 65 000 свечей хранить, если окно 14 бар); ну и конечно момент обновлений и расчётов, зачем рассчитывать каждый тик, если квик с трудом обновляет данные за одну секунду? <br />
			<i>26.06.2025 18:59:05, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78937/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78937/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 18:59:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78935/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			интервал любой . <br />
			<i>26.06.2025 18:11:57, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78935/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78935/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 18:11:57 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78934/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_muFM1haE" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br />Все же эта тема посвящена конкретной технической проблеме терминала.<br />=============<br />На демо сервере &nbsp;версия 12.4.0.38 &nbsp;Ваш тест работает мгновенно. <br />
			<i>26.06.2025 18:10:33, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78934/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78934/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 18:10:33 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78933/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_KN3sqpvr" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br /><br />local lines = 100<br /><br />Settings = {}<br />Settings.Name = &quot;*test_lines&quot;<br />Settings.price = 66960<br />Settings.delta = 1.0<br /><br />function Init()<br /> &nbsp; &nbsp;Settings.line = {}<br /> &nbsp; &nbsp;for i = 1, lines do<br /> &nbsp; &nbsp; &nbsp; &nbsp;Settings.line<I> = {}<br /> &nbsp; &nbsp; &nbsp; &nbsp;Settings.line<I> = {Color = RGB(185, 185, 185), Type = TYPET_BAR, Width = 2}<br /> &nbsp; &nbsp;end<br /> &nbsp; &nbsp;return lines<br />end<br /><br />function OnChangeSettings()<br /> &nbsp; &nbsp;Init()<br />end<br /><br />function OnCalculate(index)<br /> &nbsp; &nbsp;if index &lt; Size() then return end<br /> &nbsp; &nbsp;for i = 1, lines do<br /> &nbsp; &nbsp; &nbsp; &nbsp;SetRangeValue(i, index-100, index-1, Settings.price-i*Settings.delta)<br /> &nbsp; &nbsp;end<br /> &nbsp; &nbsp;return<br />end</I></I><br />=============<br />попробую Ваш пример потестить. <br />
			<i>26.06.2025 17:38:15, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78933/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78933/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 17:38:15 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78931/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Все же эта тема посвящена конкретной технической проблеме терминала. <br />
			<i>26.06.2025 17:13:30, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78931/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78931/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 17:13:30 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78927/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Не берусь судить о том, что в очередной раз &quot;изобрели и наваяли&quot; Разработчики, хочу лишь добавить, что в версиях 12.*.*.* при входе в терминал по долгу читаются самописные луа индикаторы (значительно по долгу).<br />Хотя допускаю, что это и моих рук дело, может быть?<br /><br />Тема написания индикаторов на луа многократно обсуждалась и разбиралась на форуме, и тем не менее, нет внутренней уверенности, что реализация луа индикаторов как минимум оптимальна? Вот и я в очередной раз столкнулся с проблемой создания надежной реализации индикаторов при реализации подхода по Wilder (реализация индикаторов и стратегий). Собственно трудности вызывает не сам алгоритм расчетов, а особенности реализации скриптов луа в QUIK.<br /><br />Задачу ставил следующую:<br />1) Скрипт должен использоваться без переделок, как в OnCalculate, так и в потоке луа;<br />2) Одинаково быстро работать на разных тайм фреймах;<br />3) Технологическое исполнение (правила написания) должны быть едины, выполняться принцип создания &quot;по Образу и Подобию&quot;.<br />Код через класс луа, требует доработки, и вызывает у меня некоторые сложности в реализации, хотя интуитивно на мой взгляд и более предпочтителен, так как хранит свое внутреннее состояние (инкапсулирует). Вот что получилось при использовании подхода с замыканием, код привожу ниже, там же см. в комментариях и порядок написания, единая технология написания скрипта, на мой взгляд логична?
====code====
<pre>function Wilder.RSI_Indicator()
&nbsp;&nbsp;&nbsp;&nbsp;-- 1. Локальные утилиты для оптимизации
&nbsp;&nbsp;&nbsp;&nbsp;local math_abs = math.abs
&nbsp;&nbsp;&nbsp;&nbsp;local math_max = math.max
&nbsp;&nbsp;&nbsp;&nbsp;local math_min = math.min
&nbsp;&nbsp;&nbsp;&nbsp;local math_floor = math.floor
&nbsp;&nbsp;&nbsp;&nbsp;local string_format = string.format
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;-- Форматирование даты и времени
&nbsp;&nbsp;&nbsp;&nbsp;local get_date = function(td)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return td and string_format("%.4d%.2d%.2d", td.year, td.month, td.day) or "00000000"
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;local get_time = function(td)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return td and string_format("%.2d%.2d%.2d", td.hour, td.min, td.sec) or "000000"
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;-- Функция округления
&nbsp;&nbsp;&nbsp;&nbsp;local round = function(x, n)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n = n or 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local mult = 10 ^ n
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return x &#62;= 0 and math_floor(x * mult + 0.5) / mult or math_floor(x * mult - 0.5) / mult
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;-- 2. Функции сглаживания
&nbsp;&nbsp;&nbsp;&nbsp;local smoothing = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EMA = function(new_val, prev, period)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local alpha = 2 / (period + 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return alpha * new_val + (1 - alpha) * prev
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end,

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SMMA = function(new_val, prev, period, bars_count)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if bars_count &#60;= period then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (prev * (bars_count - 1) + new_val) / bars_count
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (prev * (period - 1) + new_val) / period
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;-- 3. Состояние индикатора
&nbsp;&nbsp;&nbsp;&nbsp;local cache = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialized = false,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last_index = 0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;history = {},&nbsp;&nbsp;-- Хранилище для исторических значений
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Configs = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;period = 14,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method = "SMMA",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_history = 100
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_price = nil
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return function(I, F, ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- A. Обновление параметров
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if F then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.Configs.period = F.Period or cache.Configs.period
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.Configs.method = F.Method or cache.Configs.method
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.Configs.max_history = F.Max_History or cache.Configs.max_history
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local period = cache.Configs.period
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local method = cache.Configs.method

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- B. Проверка нового бара
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local is_new_bar = I &#62; cache.last_index

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- C. Очистка старых данных при новом баре
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if is_new_bar then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.last_index = I
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Удаляем устаревшие данные
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local min_index = I - cache.Configs.max_history
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i = min_index - 10, min_index do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cache.history&#91;i&#93; then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;i&#93; = nil
&nbsp;&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;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- D. Получение текущей цены закрытия
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local current_price = Value(I, "C", ds)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not current_price then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d = "00000000",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t = "000000",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsi = 50,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsi1 = 50,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsi2 = 50,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsi3 = 50,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gain = 0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loss = 0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avg_gain = 0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avg_loss = 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- E. Инициализация записи для текущего индекса
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not cache.history&#91;I&#93; then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;I&#93; = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;price = current_price,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;change = 0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gain = 0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loss = 0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avg_gain = 0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avg_loss = 0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsi = 50
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- F. Расчет изменения цены
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local prev_price = cache.prev_price
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not prev_price then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Для первого бара используем текущую цену как предыдущую
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_price = current_price
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local change = current_price - prev_price
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;I&#93;.change = change
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.prev_price = current_price&nbsp;&nbsp;-- Сохраняем для следующего вызова

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- G. Расчет положительных и отрицательных изменений
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local gain = math_max(change, 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local loss = math_max(-change, 0)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;I&#93;.gain = gain
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;I&#93;.loss = loss

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- H. Расчет средних значений
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if I == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Первый бар
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;I&#93;.avg_gain = gain
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;I&#93;.avg_loss = loss
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local prev_entry = cache.history&#91;I-1&#93; or cache.history&#91;I&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local bars_count = math_min(I, period)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if method == "SMMA" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;I&#93;.avg_gain = smoothing.SMMA(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gain, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_entry.avg_gain, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;period, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bars_count
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;I&#93;.avg_loss = smoothing.SMMA(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loss, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_entry.avg_loss, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;period, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bars_count
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else -- EMA
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;I&#93;.avg_gain = smoothing.EMA(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gain, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_entry.avg_gain, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;period
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;I&#93;.avg_loss = smoothing.EMA(
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loss, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_entry.avg_loss, 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;period
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- I. Расчет RSI
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local avg_gain = cache.history&#91;I&#93;.avg_gain
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local avg_loss = cache.history&#91;I&#93;.avg_loss
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local rs = (avg_loss &#62; 1e-5) and (avg_gain / avg_loss) or 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local rsi = 100 - (100 / (1 + rs))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Корректировка граничных значений
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsi = math_max(0, math_min(100, rsi))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.history&#91;I&#93;.rsi = rsi

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- J. Получение предыдущих значений
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local prev1 = cache.history&#91;I-1&#93; or {rsi = 50}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local prev2 = cache.history&#91;I-2&#93; or {rsi = 50}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local prev3 = cache.history&#91;I-3&#93; or {rsi = 50}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- K. Формирование результата
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local td = ds:T(I)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local Out = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d = get_date(td),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t = get_time(td),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsi = round(rsi, 2),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsi1 = round(prev1.rsi, 2),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsi2 = round(prev2.rsi, 2),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rsi3 = round(prev3.rsi, 2),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gain = round(gain, 4),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loss = round(loss, 4),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avg_gain = round(avg_gain, 4),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avg_loss = round(avg_loss, 4),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_cache = cache.history&#91;I&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Wilder.Log( tostring(I)..') '.. Out.d ..' / '.. Out.t 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..'; rsi = ' .. tostring(Out.rsi) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..'; rsi1 = ' .. tostring(Out.rsi1) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..'; rsi2 = ' .. tostring(Out.rsi2) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..'; rsi3 = ' .. tostring(Out.rsi3) 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..'; gain = ' .. tostring(Out.gain) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..'; loss = ' .. tostring(Out.loss)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--..'; atr = ' .. tostring(Out.atr) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..'; avg_gain = ' .. tostring(Out.avg_gain) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;..'; avg_loss = ' .. tostring(Out.avg_loss) 

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--..'; trend = ' .. tostring(Out.trend)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--..'; trend1 = ' .. tostring(Out.trend1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--..'; trend2 = ' .. tostring(Out.trend2)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--..'; signal = ' .. tostring(Out.signal)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--..'; signal1 = ' .. tostring(Out.signal1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--..'; signal2 = ' .. tostring(Out.signal2)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)--&#91;&#91;--&#93;&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache.initialized = true

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return Out
&nbsp;&nbsp;&nbsp;&nbsp;end
end</pre>
============= <br />
			<i>26.06.2025 15:35:14, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78927/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78927/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 15:35:14 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78926/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_3GlDRUgy" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Зачем строить индикатор назад на каждый тик?<br />=============<br />Это для примера. Реальный строится только каждый бар. на демо счёте по Сбербанку, где сделка раз минуту - этот пример вполне показательный. Впрочем, добавить кеш уже обработанных индексов - не проблема, проблема в другом. <br />
			<i>26.06.2025 15:15:49, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78926/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78926/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 15:15:49 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78924/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Поясняю. Вы стрите индикатор на 99 значений закрытых свечей плюс один тик текущей свечи.<br />Какой в этом смысл.<br />Полагаю, что у вас индикатор не изменяется назад на 99 свечей на каждом тике текущей свечи. <br />
			<i>26.06.2025 12:17:03, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78924/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78924/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 12:17:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78923/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Зачем строить индикатор назад на каждый тик? <br />
			<i>26.06.2025 12:14:03, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78923/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78923/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 12:14:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78922/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_nug4eFSw" href="/user/3132/" bx-tooltip-user-id="3132">Nikolay</a> написал:<br /> &nbsp;SetRangeValue(i, index-100, index-1, Settings.price-i*Settings.delta)<br />=============<br />В примере каждый раз выводится 100 значений 100 линий. Это 10 000 вызовов функции SetRangeValue, в которой есть вычисления на луа. <br /> OnCalculate(index) &nbsp;вызывается на каждый тик.<br />В результате у Вас цикл не успевает завершится до получения нового тика.<br />--------------------------<br />Попробуйте измерить время вывода одного значения, чтобы понять где тормозит. <br />
			<i>26.06.2025 12:12:51, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78922/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78922/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 12:12:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78918/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Пример именно такой, какой нужен, т.к. я по большей части вывожу данные назад по барам, т.к. алгоритм не предполагает простого линейного расчёта.<br />Иначе можно говорить, что теперь у методов установки данных на график есть ограничения. Или проблема, что более вероятно, т.к. при добавлении оного на график потребление ресурсов процессора повышается с 0% до 9-10%.<br />Что тоже не много, но терминал уже не отвечает. <br />
			<i>26.06.2025 08:59:09, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78918/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78918/topic9192/</guid>
			<pubDate>Thu, 26 Jun 2025 08:59:09 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78914/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Пример не совсем тот.<br />В примере &nbsp;Вы выводите значения с функциями Lua.<br />Это н совсем то, когда вывод делается с помощью return ... значения индикаторов.<br />----------------------- &nbsp;<br />Для чистоты эксперимента сделайте вывод значений через return.<br />-------------------------<br />У меня 42 индикатора. <br />Отображаются практически мгновенно.<br />Версия 8.7.1.3 <br />
			<i>25.06.2025 19:03:36, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78914/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78914/topic9192/</guid>
			<pubDate>Wed, 25 Jun 2025 19:03:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Индикатор с большим числом линий.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78912/topic9192/">Индикатор с большим числом линий.</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			В последних версиях терминала если добавить индикатор где число линий, например, больше 50, то терминал просто &quot;умирает&quot;. Этот же индикатор в 7-ой версии вполне себе работал, даже не на одном графике.<br /><br />Вот простейший пример, ничего, по сути, не делающий, а просто выводит линии на график, демонстрирующий проблему.
====code====
<pre>


local lines = 100

Settings = {}
Settings.Name = "*test_lines"
Settings.price = 66960
Settings.delta = 1.0

function Init()
&nbsp;&nbsp;&nbsp;&nbsp;Settings.line = {}
&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, lines do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Settings.line&#91;i&#93; = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Settings.line&#91;i&#93; = {Color = RGB(185, 185, 185), Type = TYPET_BAR, Width = 2}
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return lines
end

function OnChangeSettings()
&nbsp;&nbsp;&nbsp;&nbsp;Init()
end

function OnCalculate(index)
&nbsp;&nbsp;&nbsp;&nbsp;if index &#60; Size() then return end
&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, lines do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetRangeValue(i, index-100, index-1, Settings.price-i*Settings.delta)
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return
end</pre>
============= <br />
			<i>25.06.2025 11:50:53, Nikolay.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78912/topic9192/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78912/topic9192/</guid>
			<pubDate>Wed, 25 Jun 2025 11:50:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
