<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Вызов getDataSourceInfo() из Init() в Lua индикаторах]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Вызов getDataSourceInfo() из Init() в Lua индикаторах форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 02 May 2026 16:01:46 +0300</pubDate>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79067/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Uot3q6v9" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> написал:<br /> &nbsp;<br />====quote====<br />ь.<br />=============<br /> &nbsp;&quot;Если не знаете, то файловая система это тоже база данных.&quot; - это шедевр! А какой версии SQL там используется, СУБД тоже имеется? может, &nbsp;что то упустил за 25 лет в ИТ.<br /><br />=============<br /> &nbsp;Ликбез: <br />-------------------<br />Базы данных (БД) бывают разных типов, которые отличаются структурой и областью применения.<br /> Среди основных видов — &nbsp;реляционные, нереляционные, иерархические и сетевые, а также простейшие. &nbsp;<br />-----------------------<br /> Базы данных на основе файлов (flat-file databases) &nbsp;— это простой метод хранения данных в текстовом файле. <br />В отличие от традиционных реляционных баз данных, в которых используются сложные структуры с таблицами, строками и столбцами, база данных с плоскими файлами организует данные линейным и последовательным образом. <br />Особенности:<br /> &nbsp;Каждая строка в файле представляет одну запись. <br /> &nbsp;Отдельные поля внутри записи обычно разделяются разделителями, такими как запятые или табуляции. <br /> &nbsp;Нет структур для индексирования или распознавания связей между записями. <br /> &nbsp;Виды<br />Базы данных с плоскими файлами подходят для небольших приложений и временного хранения данных. Некоторые случаи использования:<br /> &nbsp;файлы конфигурации в программных приложениях; <br /> &nbsp;обмен данными между различными системами; <br /> &nbsp;файлы журналов, например, лог-файлы веб-сервера. <br /> &nbsp;Форматы<br />Для хранения данных в базах данных с плоскими файлами используются, например:<br /> &nbsp;CSV (значения, разделённые запятыми) — каждое поле разделяется запятой.<br /> &nbsp;TSV (значения, разделённые табуляцией) — в качестве разделителей используются табуляции, что полезно, когда запятые — часть самих данных.<br /> &nbsp;Формат фиксированной ширины — каждое поле занимает заранее определённое количество символов, выравнивая данные по столбцам.<br /> &nbsp;Инструменты<br /> Многие языки программирования и приложения имеют встроенную поддержку чтения и записи данных из баз данных с плоскими файлами . Например:<br /> &nbsp;Программы для работы с электронными таблицами (Microsoft Excel, Google Sheets) — могут читать и работать с плоскими файлами.<br /> &nbsp;Языки программирования (Python, Java) — могут анализировать и обрабатывать данные с помощью встроенных или сторонних библиотек.<br /> &nbsp;Недостатки<br />Базы данных с плоскими файлами имеют и ограничения. Некоторые из них:<br /> &nbsp;Ограниченная масштабируемость — по мере роста объёма данных производительность базы данных может снижаться.<br /> &nbsp;Отсутствие согласованности данных — если нужно обновить несколько записей, это становится утомительной задачей и увеличивает вероятность несоответствий.<br /> &nbsp;Сложность извлечения данных — из-за отсутствия поддержки структурированного языка запросов (SQL) запросы часто требуют ручного сканирования и фильтрации через записи.<br /> &nbsp;Ограниченный одновременный доступ — базы данных с плоскими файлами не предназначены для одновременного доступа нескольких пользователей или приложений.<br /> &nbsp;------------------------------------------<br /><br />SQL ( Structured Query Language — «язык структурированных запросов») — &nbsp;применяемый для создания, модификации и управления данными в реляционных базах данных.<br />-----------------------<br /> Нереляционные базы данных <br />В нереляционных БД не используется табличная схема строк и столбцов. Применяется модель хранения, оптимизированная под конкретный тип данных. <br />Некоторые типы нереляционных БД:<br /> &nbsp;Документоориентированные. Данные хранятся в виде документов в форматах JSON, BSON или XML.<br /> &nbsp;Колоночные. Информация хранится не в строках, а в столбцах.<br /> &nbsp;Графовые. Данные представлены в виде графов, что упрощает их хранение и поиск.<br /> &nbsp;- &nbsp;---------------------------<br />Для работы с нереляционными базами данных (NoSQL) используются специализированные языки запросов. Это связано с особенностями моделей данных в таких базах: данные могут храниться в виде документов, колонок, графов или на основе пар «ключ-значение». Ниже приведены примеры языков запросов для работы с базами данных MongoDB, Cassandra, BigTable и GraphDB. <br /><br /><br />MongoDB<br />MongoDB Query Language (MQL) — язык запросов для документо-ориентированной базы данных MongoDB. Запросы формулируются как объекты JSON, что делает их интуитивно понятными. MQL поддерживает операции CRUD (создание, чтение, обновление и удаление), а также функции агрегирования для фильтрации, сортировки и группировки данных. <br /><br />Cassandra<br />Cassandra Query Language (CQL) — основной язык запросов для распределённой базы данных Apache Cassandra. Синтаксис похож на SQL, но оптимизирован для принципов NoSQL: горизонтальной масштабируемости, высокой доступности и партиционированного хранения данных. CQL не поддерживает традиционные SQL-соединения, а поощряет денормализацию — дублирование данных по таблицам для эффективного запроса. <br /><br />BigTable<br />Собственный язык запросов — BigTable не поддерживает язык запросов SQL. Запросы выполняются через API, который поддерживает ряд популярных языков программирования (Java, Python, C#, C++). Изначально нет схемы данных, но возможна поддержка пользовательской схемы. <br /><br /><br />GraphDB<br />Cypher — язык запросов для графовых баз данных, например, Neo4j. Cypher — декларативный язык, позволяет создавать, обновлять и удалять вершины, рёбра, метки и свойства, а также управлять индексами и ограничениями.<br />Другие языки запросов:<br /> &nbsp;Gremlin — поддерживается базой данных Titan, позволяет выполнять базовые операции с элементами графа (создание, обновление и удаление вершин, рёбер, меток и свойств).<br /> &nbsp;SPARQL — используется в базах данных RDF.<br /> &nbsp;<br />=============<br />Благодарю за ликбез, действительно, я все время работаю с реляционными базами. И, после вашего замечания, полностью &nbsp;согласен любой текстовый файл можно превратить в базу данных, так как у них одна сущность - хранение данных, а способы &nbsp;ее организации &nbsp;и обработки, конечно, могут быть различными. <br />
			<i>07.07.2025 05:59:26, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79067/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79067/topic2456/</guid>
			<pubDate>Mon, 07 Jul 2025 05:59:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79059/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_ThcvgbWL" href="/user/11550/" bx-tooltip-user-id="11550">Артем</a> написал:<br /> <br />====quote====<br />ь.<br />=============<br /> &quot;Если не знаете, то файловая система это тоже база данных.&quot; - это шедевр! А какой версии SQL там используется, СУБД тоже имеется? может, &nbsp;что то упустил за 25 лет в ИТ.<br /><br /><br />=============<br /><B>Ликбез:</B><br />-------------------<br />Базы данных (БД) бывают разных типов, которые отличаются структурой и областью применения.<br /> Среди основных видов —<B> реляционные, нереляционные, иерархические и сетевые, а также простейшие. </B><br />-----------------------<br /><B>Базы данных на основе файлов (flat-file databases)</B> — это простой метод хранения данных в текстовом файле. <br />В отличие от традиционных реляционных баз данных, в которых используются сложные структуры с таблицами, строками и столбцами, база данных с плоскими файлами организует данные линейным и последовательным образом. <br />Особенности:<br /><ul><li>Каждая строка в файле представляет одну запись. <br /><li>Отдельные поля внутри записи обычно разделяются разделителями, такими как запятые или табуляции. <br /><li>Нет структур для индексирования или распознавания связей между записями. <br /></ul>Виды<br />Базы данных с плоскими файлами подходят для небольших приложений и временного хранения данных. Некоторые случаи использования:<br /><ul><li>файлы конфигурации в программных приложениях; <br /><li>обмен данными между различными системами; <br /><li>файлы журналов, например, лог-файлы веб-сервера. <br /></ul>Форматы<br />Для хранения данных в базах данных с плоскими файлами используются, например:<br /><ul><li>CSV (значения, разделённые запятыми) — каждое поле разделяется запятой.<br /><li>TSV (значения, разделённые табуляцией) — в качестве разделителей используются табуляции, что полезно, когда запятые — часть самих данных.<br /><li>Формат фиксированной ширины — каждое поле занимает заранее определённое количество символов, выравнивая данные по столбцам.<br /></ul>Инструменты<br /><B>Многие языки программирования и приложения имеют встроенную поддержку чтения и записи данных из баз данных с плоскими файлами</B>. Например:<br /><ul><li>Программы для работы с электронными таблицами (Microsoft Excel, Google Sheets) — могут читать и работать с плоскими файлами.<br /><li>Языки программирования (Python, Java) — могут анализировать и обрабатывать данные с помощью встроенных или сторонних библиотек.<br /></ul>Недостатки<br />Базы данных с плоскими файлами имеют и ограничения. Некоторые из них:<br /><ul><li>Ограниченная масштабируемость — по мере роста объёма данных производительность базы данных может снижаться.<br /><li>Отсутствие согласованности данных — если нужно обновить несколько записей, это становится утомительной задачей и увеличивает вероятность несоответствий.<br /><li>Сложность извлечения данных — из-за отсутствия поддержки структурированного языка запросов (SQL) запросы часто требуют ручного сканирования и фильтрации через записи.<br /><li>Ограниченный одновременный доступ — базы данных с плоскими файлами не предназначены для одновременного доступа нескольких пользователей или приложений.<br /></ul>------------------------------------------<br /><br />SQL ( Structured Query Language — «язык структурированных запросов») — &nbsp;применяемый для создания, модификации и управления данными в реляционных базах данных.<br />-----------------------<br /><B>Нереляционные базы данных</B><br />В нереляционных БД не используется табличная схема строк и столбцов. Применяется модель хранения, оптимизированная под конкретный тип данных. <br />Некоторые типы нереляционных БД:<br /><ul><li>Документоориентированные. Данные хранятся в виде документов в форматах JSON, BSON или XML.<br /><li>Колоночные. Информация хранится не в строках, а в столбцах.<br /><li>Графовые. Данные представлены в виде графов, что упрощает их хранение и поиск.<br /></ul>- &nbsp;---------------------------<br />Для работы с нереляционными базами данных (NoSQL) используются специализированные языки запросов. Это связано с особенностями моделей данных в таких базах: данные могут храниться в виде документов, колонок, графов или на основе пар «ключ-значение». Ниже приведены примеры языков запросов для работы с базами данных MongoDB, Cassandra, BigTable и GraphDB. <br /><br /><br />MongoDB<br />MongoDB Query Language (MQL) — язык запросов для документо-ориентированной базы данных MongoDB. Запросы формулируются как объекты JSON, что делает их интуитивно понятными. MQL поддерживает операции CRUD (создание, чтение, обновление и удаление), а также функции агрегирования для фильтрации, сортировки и группировки данных. <br /><br />Cassandra<br />Cassandra Query Language (CQL) — основной язык запросов для распределённой базы данных Apache Cassandra. Синтаксис похож на SQL, но оптимизирован для принципов NoSQL: горизонтальной масштабируемости, высокой доступности и партиционированного хранения данных. CQL не поддерживает традиционные SQL-соединения, а поощряет денормализацию — дублирование данных по таблицам для эффективного запроса. <br /><br />BigTable<br />Собственный язык запросов — BigTable не поддерживает язык запросов SQL. Запросы выполняются через API, который поддерживает ряд популярных языков программирования (Java, Python, C#, C++). Изначально нет схемы данных, но возможна поддержка пользовательской схемы. <br /><br /><br />GraphDB<br />Cypher — язык запросов для графовых баз данных, например, Neo4j. Cypher — декларативный язык, позволяет создавать, обновлять и удалять вершины, рёбра, метки и свойства, а также управлять индексами и ограничениями.<br />Другие языки запросов:<br /><ul><li>Gremlin — поддерживается базой данных Titan, позволяет выполнять базовые операции с элементами графа (создание, обновление и удаление вершин, рёбер, меток и свойств).<br /><li>SPARQL — используется в базах данных RDF.<br /></ul> <br />
			<i>05.07.2025 07:08:28, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79059/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79059/topic2456/</guid>
			<pubDate>Sat, 05 Jul 2025 07:08:28 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79056/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Cpjj0oiC" href="/user/11550/" bx-tooltip-user-id="11550">Артем</a> написал:<br />Что есть реально другой путь кроме удали-добавь индикатор? Например, при написании кода того же индикатора, он меняется по 10 раз в день, какждый раз я делаю удалил-добавил, можно как то иначе?<br />=============<br />В режиме связанных окон (допустим таблица текущих торгов + график), при переходах с тикера на тикер, индикатор будет обновляться в месте с графиком, получая данные и пересчитывая значения.<br />Также заметил в Вашем примере ошибки с типом данных, если на нем экспериментируете лучше поправить, пробелы в именах, линей меньше выводит. &nbsp; <br />
			<i>04.07.2025 15:16:01, VPM.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79056/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79056/topic2456/</guid>
			<pubDate>Fri, 04 Jul 2025 15:16:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79055/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_076thvZ2" href="/user/11550/" bx-tooltip-user-id="11550">Артем</a> написал:<br />можно как то иначе?<br />=============<br /> &nbsp; &nbsp;В скрипте можно создать любые индикаторы (с полным контролем над ними) с использованием источников (DS), полученных функцией CreateDataSource. Кроме того в ветке <noindex><a href="https://forum.quik.ru/messages/forum10/message76052/topic5466/#message76052" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum10/message76052/topic5466/#message76052</a></noindex> представлен модуль подключения в скрипте к индикаторам папки LuaIndicators с готовыми индикаторами с сайта разработчика QUIK. <br />
			<i>04.07.2025 13:23:32, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79055/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79055/topic2456/</guid>
			<pubDate>Fri, 04 Jul 2025 13:23:32 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79054/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_2z1fKs1J" href="/user/16015/" bx-tooltip-user-id="16015">funduk</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> написал:<br />да, и у меня так, но в Settings у вас ничего не выводится , то есть налету поменять нет возможности, нужно менять в базе данных, и с лагом уровни прорисуются, вопрос в другом как программно изменить Settings, вне Init<br />=============<br /> Если на каком-то одном инструменте надо было вручную добавить несколько уровней, я использовал вкладку &quot;Уровни&quot; для цены инструмента в настройках графика.<br /><br />В чём вопрос я понимаю, но считаю, что так делать - это противоестественно. Settings для статических настроек, туда ничего не выводится, динамические внутри скрипта должны работать. В TradingView так же, кстати. Не слышал о системах, где было бы иначе. Зачем в Settings выводить численно значения уровней, если они и так на графике видны? Если override нужен, ну так только его в Settings легко оставить - если в поле ноль, возвращать автоматический уровень (который берётся не из Settings, а внутри OnCalculate), если не ноль, то возвращать это ненулевое значение<br />=============<br />Да я же не спорю, я предлагаю сделать улучшение, расширить возможности Quik - избавить пользователя он коронного и разящего наповал &nbsp;далее цитата из мануала <br />getDataSourceInfo<br />Функция возвращает таблицу Lua с параметрами:<br /><B>ВАЖНО! Для корректной работы функции getDataSourceInfo, вызываемой из </B><br /><B>функции Init, необходимо перезапустить Рабочее место QUIK после добавления </B><br /><B>индикатора на график. <br /></B><br />С этого и начался весь спор, нужно добавить в Quik кнопку рестарта текущего индикатора, тут я вообще не вижу сложностей (удали индикатор с графика и вставь снова с теми же параметрами выполнится инит), + решить вопрос по getDataSourceInfo в Init. Эти два простых действия сделают интерфейс дружественным. <br /><br />Цитата: &quot;В чём вопрос я понимаю, но считаю, что так делать - это противоестественно. Settings для статических настроек&quot; <br />Здесь как раз то и есть нюанс, что статистика не стоит на месте , и плавно изменяется, ежедневно а у когото и ежетиково , нужно руками корректировать уже приводил такой простой параметр ATR, да его можно рассчитывать в индикаторе, но можно просто хранить в базе параметром и &nbsp;тащить из базы, не показывая пользователю, а можно улучшить Quik, и расширить его возможности до изменять Setings программно. :)<br /><br />Обойти отсутствие повторного запуска Init без ручных манипуляций я не смог, поэтому и прошу помощи. Мне прото жутко надоело каждый раз удали-добавь индикатор, может я чего-то не знаю... Может есть более протой путь. <br /><br />Что есть реально другой путь кроме удали-добавь индикатор? Например, при написании кода того же индикатора, он меняется по 10 раз в день, какждый раз я делаю удалил-добавил, можно как то иначе? <br />
			<i>04.07.2025 12:35:38, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79054/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79054/topic2456/</guid>
			<pubDate>Fri, 04 Jul 2025 12:35:38 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79051/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_kr0C5TOf" href="/user/11550/" bx-tooltip-user-id="11550">Артем</a> написал:<br />да, и у меня так, но в Settings у вас ничего не выводится , то есть налету поменять нет возможности, нужно менять в базе данных, и с лагом уровни прорисуются, вопрос в другом как программно изменить Settings, вне Init<br />=============<br />Если на каком-то одном инструменте надо было вручную добавить несколько уровней, я использовал вкладку &quot;Уровни&quot; для цены инструмента в настройках графика.<br /><br />В чём вопрос я понимаю, но считаю, что так делать - это противоестественно. Settings для статических настроек, туда ничего не выводится, динамические внутри скрипта должны работать. В TradingView так же, кстати. Не слышал о системах, где было бы иначе. Зачем в Settings выводить численно значения уровней, если они и так на графике видны? Если override нужен, ну так только его в Settings легко оставить - если в поле ноль, возвращать автоматический уровень (который берётся не из Settings, а внутри OnCalculate), если не ноль, то возвращать это ненулевое значение <br />
			<i>04.07.2025 11:03:17, funduk.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79051/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79051/topic2456/</guid>
			<pubDate>Fri, 04 Jul 2025 11:03:17 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79050/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_M12tVtx7" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> написал:<br /> &nbsp;<br />====quote====<br /> <noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> &nbsp;написал:<br /> &nbsp; <noindex><a href="https://forum.quik.ru/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> &nbsp; ,<br />Пишу алгоритм своего решения вашей задачи: <br />Если понял ее не правильно, то уточните, что не так.<br />---------------------<br />Алгоритм:<br />1) Создаем файл , в котором записываем в строку : Имя инструмента, A1,A2,....An<br />где A1,A... - параметры наших индикаторов (уровней)<br />Т е в файле столько строк, сколько всего инструментов наблюдаем<br />Прим: &nbsp;Можно сделать для каждого инструмента свой файл. Имя файла ==имя инструмента. <br />--------------------------<br />В опCalculate &nbsp;на кажом тике:<br />1) читаем имя инструмента<br />2)Читаем из файла строку параметров индикаторов данного инструмента <br />3) Выводим на график индикаторы<br />=============<br /> &nbsp;совершенно не понятное решение, в моем скрипте все уже реализовано через базу данных, зачем какие то текстовые файлы? я предельно четко сформулировал 2 вопроса. Вот они : 1) Как ПРОГРАММНО перевызвать Init или аналог его чтобы заполнить Settings ? (программный рестарт) 2) Почему нельзя прото добавить кнопку рестарт-реинит индикатора?(ручной рестарт, и избавить пользователей от опрации удали-добавь индикатор) &nbsp;<br />=============<br /> Если не знаете, то файловая система это тоже база данных.<br />-----------------<br />Вы спросили как сделать так чтобы не руками без Init.<br />Я Вам написал как это сделать.<br />-----------------------<br />В моем решении нет надобности что-то делать руками и нет надобности вызывать init.<br />В моем решении нет Ваших проблем.<br />--------------------------<br />Про Ваш скрипт я лучше промолчу, чтобы вас не обижать.<br />=============<br />&quot;Если не знаете, то файловая система это тоже база данных.&quot; - это шедевр! А какой версии SQL там используется, СУБД тоже имеется? может, &nbsp;что то упустил за 25 лет в ИТ.<br /><br />Вопрос остается прежним, есть Settings как туда программно записать значения, ваше решение, возможно, рабочее, но пользователь не видит изменений. <br /><br />Далее возможно два варианта:<br /><br />1 Вообще не выводим Settings пользователю - получаем черный ящик, все изменения через корректировку файлов в второннем софте (просто супер решение, но в этом случае хотя бы отсутствуют протеворечивость данных). <br /><br />2 Settings выводим и даже разрешаем править значения, пользователь руками правит параметры, и жмет применить, параметры поменялись, затем через некоторое время Settings загружается из файлов &nbsp;и &nbsp;результат: пользователь видит одни значения, а по факт у значения совсем другие, или наоборот поменяли настройки в файле, а в окошке Settings ни чего не меняется. <br />В этом варианте возникает противоречивость данных. <br /><br />Я как раз про это и говорю, и прошу показать как можно решить этоту задачу. Устранить потенциальную опасность противоречия данных.<br /><br />По второму вопросу вообще нет решения, как избавить пользователя &nbsp;от &quot;удали-добавь индикатор, перезапусти Quik&quot; ? <br />
			<i>04.07.2025 04:10:00, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79050/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79050/topic2456/</guid>
			<pubDate>Fri, 04 Jul 2025 04:10:00 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79047/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_IaXyARSb" href="/user/11550/" bx-tooltip-user-id="11550">Артем</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br /> &nbsp;<noindex><a href="https://forum.quik.ru/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> &nbsp;,<br />Пишу алгоритм своего решения вашей задачи: <br />Если понял ее не правильно, то уточните, что не так.<br />---------------------<br />Алгоритм:<br />1) Создаем файл , в котором записываем в строку : Имя инструмента, A1,A2,....An<br />где A1,A... - параметры наших индикаторов (уровней)<br />Т е в файле столько строк, сколько всего инструментов наблюдаем<br />Прим: &nbsp;Можно сделать для каждого инструмента свой файл. Имя файла ==имя инструмента. <br />--------------------------<br />В опCalculate &nbsp;на кажом тике:<br />1) читаем имя инструмента<br />2)Читаем из файла строку параметров индикаторов данного инструмента <br />3) Выводим на график индикаторы<br />=============<br /> совершенно не понятное решение, в моем скрипте все уже реализовано через базу данных, зачем какие то текстовые файлы? я предельно четко сформулировал 2 вопроса. Вот они : 1) Как ПРОГРАММНО перевызвать Init или аналог его чтобы заполнить Settings ? (программный рестарт) 2) Почему нельзя прото добавить кнопку рестарт-реинит индикатора?(ручной рестарт, и избавить пользователей от опрации удали-добавь индикатор) &nbsp;<br />=============<br />Если не знаете, то файловая система это тоже база данных.<br />-----------------<br />Вы спросили как сделать так чтобы не руками без Init.<br />Я Вам написал как это сделать.<br />-----------------------<br />В моем решении нет надобности что-то делать руками и нет надобности вызывать init.<br />В моем решении нет Ваших проблем.<br />--------------------------<br />Про Ваш скрипт я лучше промолчу, чтобы вас не обижать. <br />
			<i>03.07.2025 19:40:48, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79047/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79047/topic2456/</guid>
			<pubDate>Thu, 03 Jul 2025 19:40:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79046/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_g9TP5Pg3" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br /> <noindex><a href="https://forum.quik.ru/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> ,<br />Пишу алгоритм своего решения вашей задачи: <br />Если понял ее не правильно, то уточните, что не так.<br />---------------------<br />Алгоритм:<br />1) Создаем файл , в котором записываем в строку : Имя инструмента, A1,A2,....An<br />где A1,A... - параметры наших индикаторов (уровней)<br />Т е в файле столько строк, сколько всего инструментов наблюдаем<br />Прим: &nbsp;Можно сделать для каждого инструмента свой файл. Имя файла ==имя инструмента. <br />--------------------------<br />В опCalculate &nbsp;на кажом тике:<br />1) читаем имя инструмента<br />2)Читаем из файла строку параметров индикаторов данного инструмента <br />3) Выводим на график индикаторы<br /> &nbsp;<br />=============<br />совершенно не понятное решение, в моем скрипте все уже реализовано через базу данных, зачем какие то текстовые файлы? я предельно четко сформулировал 2 вопроса. Вот они : 1) Как ПРОГРАММНО перевызвать Init или аналог его чтобы заполнить Settings ? (программный рестарт) 2) Почему нельзя прото добавить кнопку рестарт-реинит индикатора?(ручной рестарт, и избавить пользователей от опрации удали-добавь индикатор) &nbsp; <br />
			<i>03.07.2025 19:19:03, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79046/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79046/topic2456/</guid>
			<pubDate>Thu, 03 Jul 2025 19:19:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79045/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_3olnmYG1" href="/user/16015/" bx-tooltip-user-id="16015">funduk</a> написал:<br />У Вас уровни могут в любой момент поменяться что ли? Я их раз в час рассчитываю отдельным скриптом (сервер) и клиенты (индикаторы) по факту раз в час смотрят в хранилище уровней внутри OnCalculate и берут оттуда ближайшие 2-4 верхних и нижних. В моём случае хранение через C++ структуры данных внутри одной DLL, которую грузят серверный скрипт и клиентские индикаторы.<br />=============<br />да, и у меня так, но в Settings у вас ничего не выводится , то есть налету поменять нет возможности, нужно менять в базе данных, и с лагом уровни прорисуются, вопрос в другом как программно изменить Settings, вне Init <br />
			<i>03.07.2025 19:14:53, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79045/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79045/topic2456/</guid>
			<pubDate>Thu, 03 Jul 2025 19:14:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79044/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<noindex><a href="https://forum.quik.ru/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex>,<br />Пишу алгоритм своего решения вашей задачи: <br />Если понял ее не правильно, то уточните, что не так.<br />---------------------<br />Алгоритм:<br />1) Создаем файл , в котором записываем в строку : Имя инструмента, A1,A2,....An<br />где A1,A... - параметры наших индикаторов (уровней)<br />Т е в файле столько строк, сколько всего инструментов наблюдаем<br />Прим: &nbsp;Можно сделать для каждого инструмента свой файл. Имя файла ==имя инструмента. <br />--------------------------<br />В опCalculate &nbsp;на кажом тике:<br />1) читаем имя инструмента<br />2)Читаем из файла строку параметров индикаторов данного инструмента <br />3) Выводим на график индикаторы<br /> &nbsp; <br />
			<i>03.07.2025 14:48:18, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79044/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79044/topic2456/</guid>
			<pubDate>Thu, 03 Jul 2025 14:48:18 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79043/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			У Вас уровни могут в любой момент поменяться что ли? Я их раз в час рассчитываю отдельным скриптом (сервер) и клиенты (индикаторы) по факту раз в час смотрят в хранилище уровней внутри OnCalculate и берут оттуда ближайшие 2-4 верхних и нижних. В моём случае хранение через C++ структуры данных внутри одной DLL, которую грузят серверный скрипт и клиентские индикаторы. <br />
			<i>03.07.2025 13:28:40, funduk.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79043/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79043/topic2456/</guid>
			<pubDate>Thu, 03 Jul 2025 13:28:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79039/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Итак, вот простой индикатор уровней, алгоритм обработки может быть любой в OnCalculate. Описание вопроса, индикатор имеет 40-50 параметров, параметры хранятся в базе данных для каждого конкретного тикера. Требуется при изменении цены или при срабанывании триггера получить параметры из базы и обратно записать в базу вычисленные параметры в индикаторе, сейчас это реализовано через OnChangeSettings (проверка параметра A1_SaveSettings установили в 1 нажали применить = записали в базу, скинули в 0 больше не пишется), это этап сохранения параметров в базу. А вот этап чтения параметров из базы тут все совсем грустно. Предположим простую ситуацию параметры поменялись в базе данных (пользователь внес данные в базу или сторонний софт провел расчет и внес параметры в базу данных). Нужно чтобы новые параметры были загружены индикатором. И я знаю только варианты 1) Удалить- добавить индикатор на график 2) Создать копию графика 3) Перезапустить Quik. Но что характерно, все эти манипуляции сводятся к одной цели запустить Init, согласитесь, это не дружественная ситуация, почему нет просто кнопки рестарт-реинит для конкретного графика? Но и тут нас ждет сюрприз просто так запустить инит не получится так как Quik забыл с каким инструментом работает! нужно полезть в базу данных и получить из псевдо курсора название инструмента, затем по полученному значению извлечь в инит параметры из основной базы для данного тикера! Итого два вопроса, 1) Как ПРОГРАММНО перевызвать Init или аналог его чтобы заполнить Settings ? (программный рестарт) 2) Почему нельзя прото добавить кнопку рестарт-реинит индикатора?(ручной рестарт, и избавить пользователей от опрации удали-добавь индикатор) 
====code====
<pre>local sqlite3 = require("lsqlite3")

if not PrintDbgStr then
&nbsp;&nbsp;&nbsp;&nbsp;function PrintDbgStr(s) print(s) end
end

Settings = {
&nbsp;&nbsp;&nbsp;&nbsp;Name = "!!!DB_Levels_v1",
&nbsp;&nbsp;&nbsp;&nbsp;A1_Ticker = "sec_code &#91;class_code&#93;",
&nbsp;&nbsp;&nbsp;&nbsp;A1_Enable = 1,
&nbsp;&nbsp;&nbsp;&nbsp;A1_SaveSettings = 0, -- Добавлен параметр
&nbsp;&nbsp;&nbsp;&nbsp;A1_target1 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;A1_target2 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;A1_target3 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;A1_target4 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;A1_target5 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;A1_target6 = 0.1,
&nbsp;&nbsp;&nbsp;&nbsp;Profile1 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;Profile2 = 0.1,
&nbsp;&nbsp;&nbsp;&nbsp;C1_Level1 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level2 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level3 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level4 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level5 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level6 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level7 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level8 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level9 = 0.1,
&nbsp;&nbsp;&nbsp;&nbsp;C1_Level10_AlertFlag = 0,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level10 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level11 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level12 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level13 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level14 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level15 = 0.1,
&nbsp;&nbsp;&nbsp;&nbsp;C1_Level16 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level17 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level18 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level19 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level20 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level21 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level22 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level23 = 0.1,
&nbsp;&nbsp;&nbsp;&nbsp;C1_Level24 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level25 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level26 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level27 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level28 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;C1_Level29 = 0.1,
&nbsp;&nbsp;&nbsp;&nbsp;CD1_Level30 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;CD1_Level31 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;CD1_Level32 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;CD1_Level33 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;CD1_Level34 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;CD1_Level35 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;CD1_Level36 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;CD1_Level37 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;CD1_Level38 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;CD1_Level39 = 0.1,
&nbsp;&nbsp;&nbsp;&nbsp;CD1_Level30_2 = 0.1,C1_Level19_2 = 0.1,&nbsp;&nbsp;&nbsp;&nbsp;DD1_Volume = 0.1,
&nbsp;&nbsp;&nbsp;&nbsp;PER = "", DATE = "", TIME = "",
&nbsp;&nbsp;&nbsp;&nbsp;line = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="A1_target1", Color = RGB(255,0, 0), Type = TYPE_LINE, Width = 6&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="A1_target2", Color = RGB(255,0, 0), Type = TYPE_LINE, Width = 6 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="A1_target3", Color = RGB(255,0, 0), Type = TYPE_LINE, Width = 6 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="A1_target4", Color = RGB(0,128, 64), Type = TYPE_LINE, Width = 6 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="A1_target5", Color = RGB(0,128, 64), Type = TYPE_LINE, Width = 6 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="A1_target6", Color = RGB(0,128, 64), Type = TYPE_LINE, Width = 6 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="Profile1", Color = RGB(149, 142, 14), Type = TYPE_BARS, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="Profile2", Color = RGB(149, 142, 14), Type = TYPE_BARS, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level1", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level2", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level3", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level4", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level5", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level6", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level7", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level8", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level9", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level10_AlertFlag", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level10", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level11", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level12", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level13", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level14", Color = RGB(255,128, 64), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level15", Color = RGB(128,128, 192), Type = TYPE_DASHDOT, Width = 1 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level16", Color = RGB(128,128, 192), Type = TYPE_DASHDOT, Width = 1 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level17", Color = RGB(128,128, 192), Type = TYPE_DASHDOT, Width = 1 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level18", Color = RGB(128,128, 192), Type = TYPE_DASHDOT, Width = 1 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level19", Color = RGB(128,128, 192), Type = TYPE_DASHDOT, Width = 1 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level20", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level21", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level22", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level23", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level24", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level25", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level26", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level27", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level28", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level29", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="CD1_Level30", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="CD1_Level31", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="CD1_Level32", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="CD1_Level33", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="CD1_Level34", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="CD1_Level35", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="CD1_Level36", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="CD1_Level37", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="CD1_Level38", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="CD1_Level39", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="CD1_Level30_2", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="C1_Level19_2", Color = RGB(255,0, 255), Type = TYPE_LINE, Width = 2 },
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ Name="DD1_Volume", Color = RGB(128,64, 64), Type = TYPE_DASHDOT, Width = 3 }
&nbsp;&nbsp;&nbsp;&nbsp;}
}

local function get_db_path()
&nbsp;&nbsp;&nbsp;&nbsp;local script_path = getScriptPath and getScriptPath() or "."
&nbsp;&nbsp;&nbsp;&nbsp;local sep = package.config:sub(1,1)
&nbsp;&nbsp;&nbsp;&nbsp;if script_path:sub(-1) ~= sep then script_path = script_path .. sep end
&nbsp;&nbsp;&nbsp;&nbsp;local db_path = script_path .. "data.sqlite"
&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("get_db_path: db_path = " .. db_path)
&nbsp;&nbsp;&nbsp;&nbsp;return db_path
end

local db_fields = {
&nbsp;&nbsp;&nbsp;&nbsp;"TICKER", "PER", "DATE", "TIME",
&nbsp;&nbsp;&nbsp;&nbsp;"A1_target1", "A1_target2", "A1_target3", "A1_target4", "A1_target5", "A1_target6",
&nbsp;&nbsp;&nbsp;&nbsp;"Profile1", "Profile2",
&nbsp;&nbsp;&nbsp;&nbsp;"C1_Level1", "C1_Level2", "C1_Level3", "C1_Level4", "C1_Level5", "C1_Level6", "C1_Level7", "C1_Level8", "C1_Level9",
&nbsp;&nbsp;&nbsp;&nbsp;"C1_Level10_AlertFlag", "C1_Level10", "C1_Level11", "C1_Level12", "C1_Level13", "C1_Level14", "C1_Level15",
&nbsp;&nbsp;&nbsp;&nbsp;"C1_Level16", "C1_Level17", "C1_Level18", "C1_Level19", "C1_Level20", "C1_Level21", "C1_Level22", "C1_Level23",
&nbsp;&nbsp;&nbsp;&nbsp;"C1_Level24", "C1_Level25", "C1_Level26", "C1_Level27", "C1_Level28", "C1_Level29",
&nbsp;&nbsp;&nbsp;&nbsp;"CD1_Level30", "CD1_Level31", "CD1_Level32", "CD1_Level33", "CD1_Level34", "CD1_Level35", "CD1_Level36", "CD1_Level37", "CD1_Level38", "CD1_Level39",
&nbsp;&nbsp;&nbsp;&nbsp;"CD1_Level30_2", "C1_Level19_2","DD1_Volume"
}

function OnChangeSettings()
&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: start")

&nbsp;&nbsp;&nbsp;&nbsp;if Settings.A1_SaveSettings ~= 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: A1_SaveSettings ~= 1, exiting")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;local db_path = get_db_path()
&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: opening database: " .. db_path)
&nbsp;&nbsp;&nbsp;&nbsp;local db = sqlite3.open(db_path)
&nbsp;&nbsp;&nbsp;&nbsp;if not db then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: failed to open database: " .. db_path)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;local ticker = Settings.A1_Ticker
&nbsp;&nbsp;&nbsp;&nbsp;Settings.TICKER = ticker
&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: current ticker: " .. tostring(ticker))

&nbsp;&nbsp;&nbsp;&nbsp;-- Проверяем, есть ли запись с таким тикером
&nbsp;&nbsp;&nbsp;&nbsp;local sql_check = string.format("SEL ECT Id FR OM data WHERE TICKER = '%s' LIMIT 1", ticker)
&nbsp;&nbsp;&nbsp;&nbsp;local existing_id = nil
&nbsp;&nbsp;&nbsp;&nbsp;for row in db:nrows(sql_check) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;existing_id = row.Id
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: found existing record with Id = " .. tostring(existing_id))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;if existing_id then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Обновляем существующую запись
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: updating record with Id = " .. tostring(existing_id))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local set_parts = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for _, field in ipairs(db_fields) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if field ~= "TICKER" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val = Settings&#91;field&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val_str
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if type(val) == "number" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val_str = tostring(val)
&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;val_str = "'" .. tostring(val):gsub("'", "''") .. "'"
&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;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(set_parts, string.format("%s = %s", field, val_str))
&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;local sql_update = string.format("UPD ATE data SE T %s WHERE Id = %d", table.concat(set_parts, ", "), existing_id)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: executing UPDATE: " .. sql_update)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local rc = db:exec(sql_update)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if rc ~= sqlite3.OK then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: upd ate failed: " .. db:errmsg())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: successfully updated record for ticker " .. ticker)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Вставляем новую запись
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: record not found, inserting new")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local columns = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local values = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for _, field in ipairs(db_fields) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(columns, field)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local val = Settings&#91;field&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if type(val) == "number" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(values, tostring(val))
&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;table.insert(values, "'" .. tostring(val):gsub("'", "''") .. "'")
&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;local sql_insert = string.format("INS ERT INTO data (%s) VALUES (%s)", table.concat(columns, ", "), table.concat(values, ", "))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: executing INSERT: " .. sql_insert)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local rc = db:exec(sql_insert)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if rc ~= sqlite3.OK then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: insert failed: " .. db:errmsg())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: successfully inserted new record for ticker " .. ticker)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("OnChangeSettings: finished")
&nbsp;&nbsp;&nbsp;&nbsp;db:close()
end

-- Остальной код (Init, LoadSettingsFromDB, OnCalculate) без изменений



function LoadSettingsFromDB(a1_ticker)
&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("LoadSettingsFromDB: start for A1_Ticker = " .. tostring(a1_ticker))
&nbsp;&nbsp;&nbsp;&nbsp;local db_path = get_db_path()
&nbsp;&nbsp;&nbsp;&nbsp;local db = sqlite3.open(db_path)
&nbsp;&nbsp;&nbsp;&nbsp;if not db then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("LoadSettingsFromDB: failed to open database: " .. db_path)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;local sql = string.format("SEL ECT * FR OM data WH ERE TICKER = '%s' LIMIT 1", a1_ticker)
&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("LoadSettingsFromDB: sql = " .. sql)
&nbsp;&nbsp;&nbsp;&nbsp;for row in db:nrows(sql) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for k, v in pairs(row) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Settings&#91;k&#93; ~= nil and type(Settings&#91;k&#93;) == "number" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local num = tonumber(v)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if num then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Settings&#91;k&#93; = num
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("LoadSettingsFromDB: loaded " .. k .. " = " .. tostring(Settings&#91;k&#93;))
&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;break
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;db:close()
&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("LoadSettingsFromDB: done")
end

local function get_currentticker_db_path()
&nbsp;&nbsp;&nbsp;&nbsp;local script_path = getScriptPath and getScriptPath() or "."
&nbsp;&nbsp;&nbsp;&nbsp;local sep = package.config:sub(1,1)
&nbsp;&nbsp;&nbsp;&nbsp;if script_path:sub(-1) ~= sep then script_path = script_path .. sep end
&nbsp;&nbsp;&nbsp;&nbsp;return script_path .. "CurrentTicker.sqlite"
end

function GetLastTickerFromCurrentTicker()
&nbsp;&nbsp;&nbsp;&nbsp;local db_path = get_currentticker_db_path()
&nbsp;&nbsp;&nbsp;&nbsp;local db = sqlite3.open(db_path)
&nbsp;&nbsp;&nbsp;&nbsp;if not db then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("GetLastTickerFromCurrentTicker: failed to open database: " .. db_path)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil, nil
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;local sql = "SELE CT sec_code, class_code FR OM CurrentTicker ORDER BY id DESC LIMIT 1"
&nbsp;&nbsp;&nbsp;&nbsp;local sec_code, class_code = nil, nil
&nbsp;&nbsp;&nbsp;&nbsp;for row in db:nrows(sql) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sec_code = row.sec_code
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class_code = row.class_code
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;db:close()
&nbsp;&nbsp;&nbsp;&nbsp;return sec_code, class_code
end


function Init()
&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("Init: start (CurrentTicker version)")
&nbsp;&nbsp;&nbsp;&nbsp;local sec_code, class_code = GetLastTickerFromCurrentTicker()
&nbsp;&nbsp;&nbsp;&nbsp;if sec_code and class_code then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local template = sec_code .. " &#91;" .. class_code .. "&#93;"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Settings.A1_Ticker = template
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("Init: A1_Ticker se t to: " .. Settings.A1_Ticker)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LoadSettingsFromDB(Settings.A1_Ticker)
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("Init: No ticker found in CurrentTicker, fallback to default")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Settings.A1_Ticker = "sec_code &#91;class_code&#93;"
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("Init: done")
&nbsp;&nbsp;&nbsp;&nbsp;return #Settings.line
end

function OnCalculate(index)
&nbsp;&nbsp;&nbsp;&nbsp;local E = Settings.A1_Enable or 1
&nbsp;&nbsp;&nbsp;&nbsp;return
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E * Settings.A1_target1, E * Settings.A1_target2, E * Settings.A1_target3, E * Settings.A1_target4, E * Settings.A1_target5, E * Settings.A1_target6,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E * Settings.Profile1, E * Settings.Profile2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E * Settings.C1_Level1, E * Settings.C1_Level2, E * Settings.C1_Level3, E * Settings.C1_Level4, E * Settings.C1_Level5, E * Settings.C1_Level6, E * Settings.C1_Level7, E * Settings.C1_Level8, E * Settings.C1_Level9,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E * Settings.C1_Level10_AlertFlag, E * Settings.C1_Level10, E * Settings.C1_Level11, E * Settings.C1_Level13, E * Settings.C1_Level19,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E * Settings.C1_Level15, E * Settings.C1_Level16, E * Settings.C1_Level17, E * Settings.C1_Level18, E * Settings.C1_Level19, E * Settings.C1_Level20,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E * Settings.C1_Level21, E * Settings.C1_Level22, E * Settings.C1_Level23, E * Settings.C1_Level24, E * Settings.C1_Level25, E * Settings.C1_Level26, E * Settings.C1_Level27, E * Settings.C1_Level28, E * Settings.C1_Level29,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E * Settings.CD1_Level30, E * Settings.CD1_Level31, E * Settings.CD1_Level32, E * Settings.CD1_Level33, E * Settings.CD1_Level34, E * Settings.CD1_Level35, E * Settings.CD1_Level36, E * Settings.CD1_Level37, E * Settings.CD1_Level38, E * Settings.CD1_Level39,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E * Settings.CD1_Level30_2, E * Settings.C1_Level19, E * Settings.DD1_Volume
end
</pre>
============= <br />
			<i>03.07.2025 07:14:19, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79039/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79039/topic2456/</guid>
			<pubDate>Thu, 03 Jul 2025 07:14:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79038/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_6wNeejP5" href="/user/11550/" bx-tooltip-user-id="11550">Артем</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/11550/" target="_blank" rel="nofollow">Артем</a></noindex> &nbsp;написал:<br /> &nbsp; <br />====quote====<br /> &nbsp;<noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> &nbsp; написал:<br /> &nbsp; &nbsp;<noindex><a href="https://forum.quik.ru/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> &nbsp; &nbsp;,<br />Можете пояснить, почему надо именно в Init найти код инструмента.<br />=============<br /> &nbsp; Потому что только в Init есть возможность программно изменять параметры Settings, далее во время нахождения индикатора на графике мы можем менять параметры вручную и программно только считывать их. Все бы ничего если бы в индикаторе было до 10 параметров, но если их 50-100, это превращается в издевательство. &nbsp;<br />=============<br /> &nbsp;Правильно Вас понял, что Вы меняете параметры у встроенных в QUIK индикаторов. <br />Поэтому так извращаетесь?. <br />вставьте функции нужных индикаторов в скрипт и меняйте все что хотите у них<br />=============<br /> Встроенные индикаторы, меня не интересуютот слова совсем, у меня своих достаточно. Рассмотрим простой пример, есть индикатор в котором используется дневной ATR , как параметр. Покажите как программно изменить этот параметр в индикаторе при наступлении следующего дня. Можно зайти и руками поправить (супер), но становится грустно когда графиков штук 50, нужно найти этот ATR для каждого инструмента и забить ручками, при этом человеческий фактор никто не отменял. Здесь становится намного проще просто удалить-добавить индикатор, но тоже проделать данную операцию 20 -30 раз, такое себе.<br />=============<br />Могу показать, если выложите скрипт И на примере подробно расскажите . &nbsp; <br />
			<i>03.07.2025 06:02:50, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79038/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79038/topic2456/</guid>
			<pubDate>Thu, 03 Jul 2025 06:02:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79034/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_kIAWqFF2" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> написал:<br /> &nbsp;<br />====quote====<br /> <noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> &nbsp;написал:<br /> &nbsp; <noindex><a href="https://forum.quik.ru/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> &nbsp; ,<br />Можете пояснить, почему надо именно в Init найти код инструмента.<br />=============<br /> &nbsp;Потому что только в Init есть возможность программно изменять параметры Settings, далее во время нахождения индикатора на графике мы можем менять параметры вручную и программно только считывать их. Все бы ничего если бы в индикаторе было до 10 параметров, но если их 50-100, это превращается в издевательство. &nbsp;<br />=============<br /> Правильно Вас понял, что Вы меняете параметры у встроенных в QUIK индикаторов. <br />Поэтому так извращаетесь?. <br />вставьте функции нужных индикаторов в скрипт и меняйте все что хотите у них<br />=============<br />Встроенные индикаторы, меня не интересуютот слова совсем, у меня своих достаточно. Рассмотрим простой пример, есть индикатор в котором используется дневной ATR , как параметр. Покажите как программно изменить этот параметр в индикаторе при наступлении следующего дня. Можно зайти и руками поправить (супер), но становится грустно когда графиков штук 50, нужно найти этот ATR для каждого инструмента и забить ручками, при этом человеческий фактор никто не отменял. Здесь становится намного проще просто удалить-добавить индикатор, но тоже проделать данную операцию 20 -30 раз, такое себе. <br />
			<i>03.07.2025 01:10:01, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79034/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79034/topic2456/</guid>
			<pubDate>Thu, 03 Jul 2025 01:10:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79033/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_wLC85nDq" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br /> <noindex><a href="https://forum.quik.ru/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> ,<br />Есть это:<br /><br /> OnChangeSettings <br /> &nbsp; &nbsp; &nbsp; Функция вызывается при редактировании свойств индикатора после нажатия кнопок &nbsp;«Применить» или «OK». &nbsp; &nbsp; &nbsp;Функция вызывается также при перезагрузке Рабочего места QUIK и при загрузке <br />wnd-файла либо tab-файла, в которых сохранен график с индикатором. &nbsp; &nbsp; Формат вызова: &nbsp; &nbsp;OnChangeSettings() &nbsp; &nbsp;Пример: &nbsp;Settings={Name=&quot;test1&quot;}<br />function Init()<br />	return 1<br />end<br />function OnChangeSettings()<br />	message(Settings.Name) <br />end<br /> <br />=============<br />Тут так и написано, прям дословно, Settings можно изменить руками, ну или приведите пример кода, как программно поменять Settings и нажать кнопку применить или ок. Еще один бесплатый лайфхак к этому мануалу. - &quot;Функция вызывается также при перезагрузке Рабочего места QUIK и при загрузке&quot; и при &quot;Cоздать копию&quot; графика,да так можно делать, но если терминал грузится 10 минут, во время торговой сессии, это такое себе занятие, откровенная глупость, а если надо 10 раз поменять парметр (подобрать его, посмотреть результат), остается только удалить добавить индикатор... <br />
			<i>03.07.2025 00:57:01, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79033/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79033/topic2456/</guid>
			<pubDate>Thu, 03 Jul 2025 00:57:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79032/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_CSE9UT2a" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Относительно изменения Setting.<br />Это глобальная таблица и менять ее содержимое программно никто не запрещает. <br />Не знаю зачем это надо.<br />=============<br />Это здорово, но можно пример кода в студию, как вы в индикаторе после добавления его на график ПРОГРАММНО поменяете Settings. Именно программно, без каких либо ручных манипуляций, например в зависмости от изменения цены инструмента. <br />
			<i>03.07.2025 00:47:51, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79032/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79032/topic2456/</guid>
			<pubDate>Thu, 03 Jul 2025 00:47:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79018/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<noindex><a href="https://forum.quik.ru/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex>,<br />Есть это:<br /><br /><B>OnChangeSettings</B><br /><p><span class="bx-font" style="font-size:;"> </span></p><p><span class="bx-font" style="font-size:;">Функция вызывается при редактировании свойств индикатора после нажатия кнопок &nbsp;«Применить» или «OK». &nbsp;</span></p><span class="bx-font" style="font-size:;"> Функция вызывается также при перезагрузке Рабочего места QUIK и при загрузке <br />wnd-файла либо tab-файла, в которых сохранен график с индикатором. </span><span class="bx-font" style="font-size:;"> <p>Формат вызова: &nbsp;</p><p>OnChangeSettings() &nbsp;</p><p>Пример: </p>Settings={Name=&quot;test1&quot;}<br />function Init()<br />	return 1<br />end<br />function OnChangeSettings()<br />	message(Settings.Name) <br />end<br /></span> <br />
			<i>02.07.2025 13:28:19, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79018/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79018/topic2456/</guid>
			<pubDate>Wed, 02 Jul 2025 13:28:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79017/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Относительно изменения Setting.<br />Это глобальная таблица и менять ее содержимое программно никто не запрещает. <br />Не знаю зачем это надо. <br />
			<i>02.07.2025 13:21:57, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79017/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79017/topic2456/</guid>
			<pubDate>Wed, 02 Jul 2025 13:21:57 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79015/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_MqAbEqrk" href="/user/11550/" bx-tooltip-user-id="11550">Артем</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br /> &nbsp;<noindex><a href="https://forum.quik.ru/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> &nbsp;,<br />Можете пояснить, почему надо именно в Init найти код инструмента.<br />=============<br /> Потому что только в Init есть возможность программно изменять параметры Settings, далее во время нахождения индикатора на графике мы можем менять параметры вручную и программно только считывать их. Все бы ничего если бы в индикаторе было до 10 параметров, но если их 50-100, это превращается в издевательство. &nbsp;<br />=============<br />Правильно Вас понял, что Вы меняете параметры у встроенных в QUIK индикаторов. <br />Поэтому так извращаетесь?. <br />вставьте функции нужных индикаторов в скрипт и меняйте все что хотите у них. <br />
			<i>02.07.2025 13:10:57, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79015/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79015/topic2456/</guid>
			<pubDate>Wed, 02 Jul 2025 13:10:57 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message79009/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_dF01bh4C" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br /> <noindex><a href="https://forum.quik.ru/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex> ,<br />Можете пояснить, почему надо именно в Init найти код инструмента.<br />=============<br />Потому что только в Init есть возможность программно изменять параметры Settings, далее во время нахождения индикатора на графике мы можем менять параметры вручную и программно только считывать их. Все бы ничего если бы в индикаторе было до 10 параметров, но если их 50-100, это превращается в издевательство. &nbsp; <br />
			<i>02.07.2025 02:53:25, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message79009/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message79009/topic2456/</guid>
			<pubDate>Wed, 02 Jul 2025 02:53:25 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78957/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<noindex><a href="https://forum.quik.ru/user/11550/" target="_blank" rel="nofollow">Артем</a></noindex>,<br />Можете пояснить, почему надо именно в Init найти код инструмента. <br />
			<i>28.06.2025 06:36:12, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78957/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78957/topic2456/</guid>
			<pubDate>Sat, 28 Jun 2025 06:36:12 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message78956/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Прошло 5 лет! &nbsp;Воз и ныне там, но это не точно. Пришлось изобрасти костыль. Итак, нам нужно в индикаторе в init получить sec_code. Для решения этого создал пустой индикатор, который в oncalculate на первой свече и единожды находит через &nbsp;getDataSourceInfo() class_code и sec_code и помещает их в файл, базу данных тут кому как нравится, это вспомогательный индикатор кидаем на график жмем применить, получаем названия инструмента в базе данных, затем кидаем на график уже основной индикатор, который в init считывает полученное в первом. ВСЕ! Ниже пример костыля. Может разработчики или кто подкажет как все-таки решать такой простой вопрос, без костылей.
====code====
<pre>local sqlite3 = require("lsqlite3")&nbsp;&nbsp;-- Подключение SQLite (если доступно)

Settings = 
{
&nbsp;&nbsp;&nbsp;&nbsp;Name = "!!!Current_Ticker",
&nbsp;&nbsp;&nbsp;&nbsp;line = 
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name = "FixedLine",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Color = RGB(0, 255, 0),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type = TYPE_LINE,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Width = 2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
}

local db = nil
local saved = false&nbsp;&nbsp;-- Флаг, чтобы выполнить запись только один раз

function Init()
&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: Init called")
&nbsp;&nbsp;&nbsp;&nbsp;return 1&nbsp;&nbsp;-- Количество линий
end

function OnCalculate(index)
&nbsp;&nbsp;&nbsp;&nbsp;if index == 1 and not saved then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: OnCalculate first bar")

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local DSI = getDataSourceInfo()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if DSI == nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: getDataSourceInfo() returned nil")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 10
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local class_code = DSI.class_code
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local sec_code = DSI.sec_code

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: class_code=" .. tostring(class_code) .. ", sec_code=" .. tostring(sec_code))

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local info = getSecurityInfo(class_code, sec_code)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if info == nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: getSecurityInfo() returned nil")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 10
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: short_name=" .. tostring(info.short_name))

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db = sqlite3.open("C:&#92;&#92;QUIK&#92;&#92;LuaIndicators&#92;&#92;CurrentTicker.sqlite")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not db then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: Failed to open SQLite database")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 10
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local create_table_sql = &#91;&#91;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CRE ATE&nbsp;&nbsp; TABLE IF NOT EXISTS CurrentTicker (
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id INTEGER PRIMARY KEY AUTOINCREMENT,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class_code TEXT,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sec_code TEXT,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short_name TEXT
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db:exec(create_table_sql)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: Table CurrentTicker ensured")

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local stmt = db:prepare(&#91;&#91;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INS ERT IN TO CurrentTicker (class_code, sec_code, short_name)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VALUES (?, ?, ?);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;&#93;)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if stmt then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt:bind_values(class_code, sec_code, info.short_name or "")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt:step()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stmt:finalize()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: Data inserted in CurrentTicker table")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: Failed to prepare SQLite statement")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db:close()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: Database closed")

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saved = true
&nbsp;&nbsp;&nbsp;&nbsp;end

&nbsp;&nbsp;&nbsp;&nbsp;return 10
end

function OnDestroy()
&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: OnDestroy called")
&nbsp;&nbsp;&nbsp;&nbsp;if db then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db:close()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintDbgStr("!!!Current_Ticker: Database closed on destroy")
&nbsp;&nbsp;&nbsp;&nbsp;end
end</pre>
============= <br />
			<i>27.06.2025 18:07:46, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message78956/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message78956/topic2456/</guid>
			<pubDate>Fri, 27 Jun 2025 18:07:46 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message51029/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_jpuSxSWe" href="/user/14396/" bx-tooltip-user-id="14396">Ilya</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/17/" target="_blank" rel="nofollow">Sergey Gorokhov</a></noindex> написал:<br />Здравствуйте,<br />Задача вполне решается проверкой первой свечи в OnCalculate<br />Из приведенного описания не вполне понятно, чем данный подход не устраивает.<br />=============<br /> Здравствуйте.<br />Расскажу чем не устраивает.. или подскажите как такое реализовать: обновление Settings из кода OnCalculate.<br /><br />хочу в настройки по своей внутренней формуле вывести номер свечи от которой буду производить отрисовку. При этом пользователь имеет право вручную изменить номер свечи.<br />также хочу вывести в настройки некое значение рассчитанное из данных getDataSourceInfo (дать возможность пользователю изменить заранее рассчитанные значения) ,например, маржинальный диапазон или базовый интервал.<br /><br />да можно рассчитать на первой свече все данные, но не записать их в Settings<br />function OnCalculate(i)<br /><br /> &nbsp; -- определяем текущую бумагу и ее характеристики<br /> &nbsp; -- в Init можно разместить, но нужн перезапускать рабочее место<br /> &nbsp; if (i == 1) then<br /> &nbsp; &nbsp; sec_code &nbsp; = getDataSourceInfo().sec_code<br /> &nbsp; &nbsp; class_code = getDataSourceInfo().class_code<br /> &nbsp; &nbsp; interval &nbsp; = getDataSourceInfo().interval<br /> &nbsp; &nbsp; param &nbsp; &nbsp; &nbsp;= getDataSourceInfo().param <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -- не прокатит!!!!<br /> &nbsp; &nbsp; Settings.Fx= F(sec_code, class_code, interval, param)<br /><br /><br />на текущий момент не представляю как такое сделать. по все той же причине нельзя изменять Settings вне Init.<br /><br />Подскажите как реализовать описанное выше &nbsp; в индикаторе.<br /><br />п.с. перезагружать рабочее место или изменять настройки в индикаторе и затем еще раз его запускать... ну такое<br />=============<br />Добрый день.<br /><br />Извиняемся за долгий ответ.<br />Такой возможности нет, готовы зарегистрировать пожелание на доработку. <br />
			<i>15.12.2020 05:58:43, Egor Zaytsev.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message51029/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message51029/topic2456/</guid>
			<pubDate>Tue, 15 Dec 2020 05:58:43 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message50139/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_xaMhbVsv" href="/user/17/" bx-tooltip-user-id="17">Sergey Gorokhov</a> написал:<br />Здравствуйте,<br />Задача вполне решается проверкой первой свечи в OnCalculate<br />Из приведенного описания не вполне понятно, чем данный подход не устраивает.<br />=============<br />Здравствуйте.<br />Расскажу чем не устраивает.. или подскажите как такое реализовать: обновление Settings из кода OnCalculate.<br /><br />хочу в настройки по своей внутренней формуле вывести номер свечи от которой буду производить отрисовку. При этом пользователь имеет право вручную изменить номер свечи.<br />также хочу вывести в настройки некое значение рассчитанное из данных getDataSourceInfo (дать возможность пользователю изменить заранее рассчитанные значения) ,например, маржинальный диапазон или базовый интервал.<br /><br />да можно рассчитать на первой свече все данные, но не записать их в Settings<br />function OnCalculate(i)<br /><br /> &nbsp; -- определяем текущую бумагу и ее характеристики<br /> &nbsp; -- в Init можно разместить, но нужн перезапускать рабочее место<br /> &nbsp; if (i == 1) then<br /> &nbsp; &nbsp; sec_code &nbsp; = getDataSourceInfo().sec_code<br /> &nbsp; &nbsp; class_code = getDataSourceInfo().class_code<br /> &nbsp; &nbsp; interval &nbsp; = getDataSourceInfo().interval<br /> &nbsp; &nbsp; param &nbsp; &nbsp; &nbsp;= getDataSourceInfo().param <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -- не прокатит!!!!<br /> &nbsp; &nbsp; Settings.Fx= F(sec_code, class_code, interval, param)<br /><br /><br />на текущий момент не представляю как такое сделать. по все той же причине нельзя изменять Settings вне Init.<br /><br />Подскажите как реализовать описанное выше &nbsp; в индикаторе.<br /><br />п.с. перезагружать рабочее место или изменять настройки в индикаторе и затем еще раз его запускать... ну такое <br />
			<i>06.11.2020 14:32:45, Ilya.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message50139/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message50139/topic2456/</guid>
			<pubDate>Fri, 06 Nov 2020 14:32:45 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21798/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Алексей, благодарю. <br />
			<i>18.01.2017 20:07:39, Русский.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21798/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21798/topic2456/</guid>
			<pubDate>Wed, 18 Jan 2017 20:07:39 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21796/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_zUC1uk3a" href="/user/2735/" bx-tooltip-user-id="2735">Русский</a> написал:<br />Вы говорили не об этом, но правильно ли я понял, что если код такой: 
====code====
<pre>&nbsp;&nbsp;int&nbsp;&nbsp;=&nbsp;&nbsp; getDataSourceInfo ().interval&nbsp;&nbsp;</pre>
=============
, то интервал будет получаться на каждой свечке.<br />А если такой:<br />
====code====
<pre>&nbsp;&nbsp; if&nbsp;&nbsp;index&nbsp;&nbsp;=&nbsp;&nbsp;=&nbsp;&nbsp; 1&nbsp;&nbsp; then 
 int&nbsp;&nbsp;=&nbsp;&nbsp; getDataSourceInfo ().interval
 end&nbsp;&nbsp; </pre>
=============
, то интервал будет получен единожды?<br />=============<br />Да.<br />Но уточню:<br />getDataSourceInfo ().interval - это тайм-фрейм окна графика, в котором выводится индикатор. Это, строго говоря, не обязательно интервал по времени между предыдущей и текущей свечками, т.к. данные для каких-то моментов времени могут отсутствовать, и тогда предыдущая свечка может отстоять от текущей на б<I>о</I>льший, чем тайм-фрейм промежуток времени.<br />Проверять тайм-фрейм для каждой свечки не имеет смысла, т.к. если Вы смените тайм-фрейм, то quik перезапустит цикл вызовов OnCalculate() и первым делом вызовет OnCalculate(index = 1) <br />
			<i>18.01.2017 19:33:40, Алексей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21796/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21796/topic2456/</guid>
			<pubDate>Wed, 18 Jan 2017 19:33:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21793/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вы говорили не об этом, но правильно ли я понял, что если код такой: 
====code====
<pre>int = getDataSourceInfo().interval</pre>
=============
, то интервал будет получаться на каждой свечке.<br />А если такой:<br />
====code====
<pre>if index == 1 then
 int = getDataSourceInfo().interval
end</pre>
=============
, то интервал будет получен единожды? <br />
			<i>18.01.2017 17:58:41, Русский.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21793/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21793/topic2456/</guid>
			<pubDate>Wed, 18 Jan 2017 17:58:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21792/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_TR8MfXGC" href="/user/62/" bx-tooltip-user-id="62">Николай  Камынин</a> написал:<br /><br />====quote====<br /><br /><br />=============<br />А в квике как мультике про простоквашено (Письмо дяди Федора). <br />Начинал писать квик один писатель потом второй и т д.<br />Стратегию построения КВИКА разработали еще в прошлом веке.<br />Вот и нет однообразия.<br />А читатели - это клиенты брокеров.<br />=============<br />Ну в принципе, это многое объясняет :) <br />
			<i>18.01.2017 17:49:15, Алексей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21792/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21792/topic2456/</guid>
			<pubDate>Wed, 18 Jan 2017 17:49:15 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов getDataSourceInfo() из Init() в Lua индикаторах</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message21791/topic2456/">Вызов getDataSourceInfo() из Init() в Lua индикаторах</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Простите, про событие 2 я погорячился, Init() не вызывается. Но сути дела это не меняет <br />
			<i>18.01.2017 17:33:27, Алексей.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message21791/topic2456/</link>
			<guid>http://forum.quik.ru/messages/forum10/message21791/topic2456/</guid>
			<pubDate>Wed, 18 Jan 2017 17:33:27 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
