<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [форум: Обмен опытом]</title>
		<link>http://forum.quik.ru</link>
		<description>Новые темы форума Обмен опытом на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 10 May 2026 20:13:23 +0300</pubDate>
		<item>
			<title>Автоматический старт QUIK - это просто</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message81998/topic9523/">Автоматический старт QUIK - это просто</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Добрый день,<br />Если Вам надоело каждый раз при старте квик вручную вводить пароль <br />и код со смартфона , то расскажу, как делать &nbsp;это автоматически.<br />------------------------<br />Самое простое - это ввод пароля.<br />для этого использую вот такой простой скрипт на AutoIt.
====code====
<pre>; Скрипт автоматического ввода пароля для QUIK
; автор nikolz
; --- Настройки ---
$sQuikPath = "C:&#92;QUIK&#92;info.exe"
$sQuikWorkingDir = "C:&#92;QUIK"&nbsp;&nbsp;; Рабочая папка (обычно там же, где info.exe)
$sPasswordFile = @ScriptDir &#38; "&#92;password.txt"
; --- Чтение пароля из файла ---
Local $sPassword = FileReadLine($sPasswordFile)
If @error Then
&nbsp;&nbsp;&nbsp;&nbsp;MsgBox(16, "Ошибка", "Не удалось прочитать файл пароля: " &#38; $sPasswordFile) 
&nbsp;&nbsp;&nbsp;&nbsp;Exit
EndIf

; --- Запуск QUIK с правильной рабочей папкой и с ключом -clear ---
Run('"' &#38; $sQuikPath &#38; '" -clear', $sQuikWorkingDir)

If @error Then
&nbsp;&nbsp;&nbsp;&nbsp;MsgBox(16, "Ошибка", "Не удалось запустить QUIK по пути: " &#38; $sQuikPath)
&nbsp;&nbsp;&nbsp;&nbsp;Exit
EndIf

; --- Ожидание первого окна (ввод пароля) ---
Local $hFirstWindow = WinWait("&#91;CLASS:#32770; TITLE:Идентификация пользователя&#93;", "", 1000)
If Not $hFirstWindow Then
&nbsp;&nbsp;&nbsp;&nbsp;MsgBox(16, "Ошибка", "Окно ввода пароля не появилось в течение 1000 секунд.")
&nbsp;&nbsp;&nbsp;&nbsp;Exit
EndIf

; Активируем окно
WinActivate($hFirstWindow)
Sleep(500)

; --- Ввод пароля ---
ControlSend($hFirstWindow, "", "&#91;CLASS:Edit; INSTANCE:2&#93;", $sPassword)
Sleep(300)
ControlSend($hFirstWindow, "", "", "{ENTER}")
Exit
</pre>
=============
Для его работы надо установить AutoIt<br />и создать файл &quot;password.txt&quot; с паролем в каталоге скрипта .<br />------------------------<br />Могу выложить выложить exe файл, который не требует установки AutoIt, если надо. &nbsp;<br />Но решил, что скрипт нагляднее.<br />-------------------------<br />Продолжение следует... <br />
			<i>14.03.2026 09:30:21, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message81998/topic9523/</link>
			<guid>http://forum.quik.ru/messages/forum17/message81998/topic9523/</guid>
			<pubDate>Sat, 14 Mar 2026 09:30:21 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>QUIK. Робот Сетка. Сетка от цены</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message81777/topic9501/">QUIK. Робот Сетка. Сетка от цены</a></b> <i>Подготовил новую стратегию для Робот Сетка LUA</i> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			<p>🎞️ Видео: <noindex><a href="https://rutube.ru/video/b7db8dd91e425ef1adf4312d9610c008" target="_blank" rel="nofollow">https://rutube.ru/video/b7db8dd91e425ef1adf4312d9610c008</a></noindex> </p><p><B>Краткое описание стратегии «Сетка от цены».</B></p><p>👉 Отличительная особенность в том, что удерживается одна позиция, а не множество, как в других вариантах сеточных стратегий. </p><div align="center"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>[FILE ID=13186]<br /><p>👉 Происходит плавный частичный набор и плавная частичная фиксация позиции.</p><p>👉 Для работы от покупки, указываем максимальную цену при движении вниз от которой увеличиваются лоты и позиция набирается. </p><div align="center"> &nbsp; </div>[FILE ID=13185]<br /><p>👉 При росте цены в обратном направлении, плюс указанный размер тейк-профит, происходит фиксация позиции.</p><p>К стратегии в комплекте поставляется файл Excel «Сетка V4.xlsx» в котором можно указать необходимые параметры и увидеть прогноз увеличения лотов, объёмов, и гарантийного обеспечения при падении цены от указанной максимальной цены на каждый процент просадки. А также, получить готовые настройки для робота.</p><div align="center"> &nbsp; </div>[FILE ID=13184]<br /><p>👉 Т.к. «Робот Сетка LUA» является максимально универсальным, возможно самостоятельное добавление учёта фронтраннинга, фильтра скользящей средней и множество других вариантов дополнений на любых данных и индикаторах QUIK.</p><p>👉 Важный плюс стратегии в простоте и минимальной нагрузке на терминал QUIK, т.к. учитывается только одна позиция, а необходимые заявки выставляются только по необходимости.</p><p></p><p></p><p>💾 Страница программы <noindex><a href="https://pmntrade.ru/robot_setka_lua.html" target="_blank" rel="nofollow">Робот Сетка LUA</a></noindex></p><p>➤ &nbsp;Канал <noindex><a href="https://t.me/pmn_trade" target="_blank" rel="nofollow">Telegram</a></noindex></p><p>▶️ Канал <noindex><a href="https://rutube.ru/channel/41754783/" target="_blank" rel="nofollow">RuTube</a></noindex></p><p>▶️ Канал <noindex><a href="https://vkvideo.ru/@club236142305" target="_blank" rel="nofollow">VK Видео</a></noindex></p><p>▶️ Канал <noindex><a href="https://www.youtube.com/channel/UCydba-rfY38J8QMJE34J_4Q" target="_blank" rel="nofollow">YouTube</a></noindex></p><p> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</p><p>🌐 <noindex><a href="http://pmntrade.ru/" target="_blank" rel="nofollow">http://pmntrade.ru</a></noindex></p> <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=13184&" width="530" height="451" /><br /><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=13185&" width="492" height="286" /><br /><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=13186&" width="1125" height="235" /><br /><i>28.02.2026 15:45:37, Михаил Понамаренко.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message81777/topic9501/</link>
			<guid>http://forum.quik.ru/messages/forum17/message81777/topic9501/</guid>
			<pubDate>Sat, 28 Feb 2026 15:45:37 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Уменьшаю время локальной загрузки QUIK до нуля.- Это просто.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message81588/topic9491/">Уменьшаю время локальной загрузки QUIK до нуля.- Это просто.</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			<B>Преамбула:</B><br />Раньше неоднократно пытался перейти на новые версии терминала, но получение тормозов при старте, и не только, терминала возвращало меня &nbsp;на версию 8.7<br />-----------------<br />Неделю назад Сбербанк без объявления перевел своих клиентов на единый брокерский счет,<br />что привело к необходимости установить версию 12 без вариантов.<br />---------------<br />В конечном итоге пришлось установить версию 12.8.3.4 из установочного пакета разработчиков, так как Сбербанк пока предлагает более глючную версию 12.6<br />------------------<br />Сегодня на хабре написал статью, в которой &nbsp;привел высказывание автора Claude Code:<br />«<B>Мы начинаем видеть мир, в котором клиент жалуется на что-то, а проблема решается за считанные минуты,</B> — сказал он.<br />-------------------<br />Надеюсь, что когда-то и разработчики QUIK достигнут это.<br />-------------------<br />Но пока актуальным является высказывание Остапа Бендера:&quot;<B>Спасение утопающих - дело рук самих утопающих</B>&quot;<br />-----------------------<br />Поэтому, познав все прелести 6-8 минутной загрузки терминала был вынужден решать эту проблему самостоятельно.<br />--------------<br /><B>Решение:</B><br />Свои результаты и рекомендации размещаю на этом форуме.<br />Я никого не заставляю делать так, как делаю сам. <br />Я лишь рассказываю что и как делаю и что из этого получилось.<br />================<br />В результате исследований мне удалось уменьшить время загрузки с 240...320 сек до 110 секунд.<br />Из этих 110 секунд 70 секунд тратится на локальную загрузку терминала.<br />Для тех, кто не читал мой пост по этой проблеме, поясняю:<br />----------------<br />Процесс старта терминала QUIK условно разделяю на три этапа<br />1) загрузка терминала на основе сохраненной на ПК информации до подключения к серверу брокера<br />2) ввод логина и пароля и подключение к серверу<br />3) ввод кода со смартфона для двухфакторной аутентификации и получения текущей информации с сервера. <br />====================== <br />В этой теме рассказываю как сделал время первого этапа равным нулю.<br />--------------------------------<br />Это можно сделать, если есть свободное место на жестком диске в размере объема памяти на ПК.<br />Для этого &nbsp;включаю на &nbsp;ПК либо гибридный режим сна, либо режим Гибернации. Предпочитаю Гибернацию.<br />Режим гибридного сна отличается от режима сна тем, что образ памяти сохраняется на диске и это позволяет восстановить состояние ПК при выходе из сна после отключения сетевого питания.<br />-----------------<br />Режим Гибернации отличается от режима сна тем, что ПК полностью выключается, как обычно.<br />Но перед выключением ОС запишет на диск образ памяти и загрузит его при включении.<br />--------------------<br />Это не только исключает локальную загрузку QUIK, но и сокращает загрузку Windows.<br />=============<br />При этом последовательность действий такая. <br />Надо не закрывать QUIK, а лишь разорвать соединение с сервером.<br />Перевести ПК в режим Гибернации. <br />---------------------<br />После включения получаю состояние ПК в момент выключения<br /> и перехожу ко 2-ому этапу загрузки терминала QUIK. <br />
			<i>21.02.2026 11:49:00, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message81588/topic9491/</link>
			<guid>http://forum.quik.ru/messages/forum17/message81588/topic9491/</guid>
			<pubDate>Sat, 21 Feb 2026 11:49:00 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Куда пропал Владимир Рыбанькин?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message81547/topic9488/">Куда пропал Владимир Рыбанькин?</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			В интернете не нахожу его следов, на smart-lab тоже нет. robot-scalper.ru и аналогичные сервисы по торговле роботами это не он?<br />Хочется почитать, как он в своём легендарном роботе получал сигналы к покупке и продаже без помощи свечей и индикаторов с пом. ТТТ и не знаю чего ещё. По объёмам закупок? Таблицу обезл. сделок всё равно ведь надо получать?<br />Где вообще об этом можно прочитать? Что-то захотелось написать себе скоростную торг. программку в Quik Lua + dll на Си, при этом Lua используется только для sendTransaction и подписок на акции. Всё считается в dll, которая и вызывает sendTransaction.<br />Или уже есть что-то более продвинутое? <br />
			<i>20.02.2026 08:14:45, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message81547/topic9488/</link>
			<guid>http://forum.quik.ru/messages/forum17/message81547/topic9488/</guid>
			<pubDate>Fri, 20 Feb 2026 08:14:45 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Уменьшить объем памяти и время старта QUIK-это просто</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message81524/topic9484/">Уменьшить объем памяти и время старта QUIK-это просто</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Всем, добрый день,<br />--------------------<br />Ранее я уже писал, что в старте &nbsp;терминала QUIK условно можно выделить 3 этапа.<br />------------<br />Первый - автономная загрузка терминала до момента запроса пароля.<br />Второй - ожидание кода авторизации со смартфона<br />Третий - загрузка с сервера брокера текущего состояния торгов <br />------------------------<br />В этой теме я расскажу как сократить первый этап.<br />Для этого написал bat файл (nk.bat)
====code====
<pre>@echo off
del /f /q "*.log"
start "" "info.exe"
</pre>
=============
создайте его текстовым редактором и поместите в папку QUIK, где находится info.exe<br />----------------<br />чтобы запустить QUIK надо запустить этот файл (щелкнуть вместо info.exe по файлу nk.bat)<br />====================<br />Зачем нужен этот файл?<br />Проблема в том, что терминал QUIK зачем-то при старте загружает в память info.log (этот файл особо влияет на объем занимаемой памяти)<br />Данный bat файл сначала сотрет все log файлы, а потом запустит QUIK.<br />----------------------<br />Если не хотите удалять все лог файлы, то вместо *.log &nbsp;поставьте info.log . Этого достаточно, чтобы получить сокращение.<br />-----------------------------<br />У меня при использовании этого bat файла объем памяти &nbsp;занятой &nbsp;терминалом &nbsp;сокращается с 900 Мбайт до 600 Мбайт.<br />-------------------------<br />Для сбора статистики просьба сообщить как влияет bat файл в Вашем случае на старт терминала. <br />
			<i>19.02.2026 11:00:54, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message81524/topic9484/</link>
			<guid>http://forum.quik.ru/messages/forum17/message81524/topic9484/</guid>
			<pubDate>Thu, 19 Feb 2026 11:00:54 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Варианты построения робота</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message81451/topic9476/">Варианты построения робота</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Тема предназначена для начинающих писателей роботов<br />------------------ &nbsp;<br />Вариантов написания роботов в терминале QUIK на луа множество.<br />Кратко расскажу о них на основе своего опыта.<br />-------------<br />По функциональному назначению можно разделить роботов на 3 класса.<br />1) Роботы , которые прогнозируют моменты изменения рынка для изменения позиции.Роботы-советники<br />2) Роботы, которые совершают транзакции на основе простейших алгоритмов и управляют стоп-заявками.<br />3) Роботы , которые объединяют функции 1 и 2.<br />---------------<br />Любого робота можно написать либо в виде скрипта-индикатора,далее робот-индикатор, <br />либо в виде скрипта не индикатора, далее робот-скрипт.<br />Разница в том, что робот на основе индикатора запускается на графике инструмента, которым торгуем,<br />а робот-скрипт, не индикатор, запускается без автоматической привязки к инструменту.<br />------------------<br />Робот индикатор самый простой в написании. в нем не надо подписываться на инструмент. <br />В него автоматически поступают данные лишь конкретного инструмента.<br />--------------------<br />Недостаток его в том, <br />что его надо запускать на графике инструмента и следовательно надо открывать окно с графиком.<br />Но обычно так все и торгуют.<br />---------------<br />Робот-скрипт &nbsp;является универсальным и позволяет построить рой роботов, которые могут обмениваться данными и проводить расчеты параллельно.<br />----------------------------------<br />На этом пока все.<br />Если есть вопросы, то отвечу<br />---------------------<br />Продолжение следует...<br /><br /><br /> &nbsp; &nbsp; <br />
			<i>16.02.2026 12:03:54, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message81451/topic9476/</link>
			<guid>http://forum.quik.ru/messages/forum17/message81451/topic9476/</guid>
			<pubDate>Mon, 16 Feb 2026 12:03:54 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Скрипт для обнаружение задержек данных</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message81425/topic9474/">Скрипт для обнаружение задержек данных</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Для обнаружения ситуаций, когда соединение с сервером нормальное, но с сервера не поступают данные ВООБЩЕ написал скрипт. <br />Скрипт пишет данные о времени последней связи с сервером и фиксирует задержу в лог файле.<br />скрипт в стадии тестирования.<br />Желающие присоединяйтесь.<br />
====code====
<pre>function HMS(T) 
&nbsp;&nbsp;&nbsp;local hms=0; for s in T:gmatch("&#91;^:&#93;+") do hms=60*hms+tonumber(s) end 
return hms;
end
MaxTime=30 
function main()
&nbsp;&nbsp;&nbsp;while run do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TS=getInfoParam("SERVERTIME")--&nbsp;&nbsp;Время сервера&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TW=getInfoParam("LASTRECORDTIME")--&nbsp;&nbsp;Время последней записи&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if TS and TW&nbsp;&nbsp;then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TL=getInfoParam("LASTPINGTIME")&nbsp;&nbsp;--Время последней проверки связи&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if TL_OLD and TL~=TL_OLD then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local str=os.date()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if D&#62;MaxTime then str=str..",задержка(сек)="..D; end 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:seek("set",begin); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:write(str.."&#92;n"); &nbsp;&nbsp;&nbsp;Log:flush(); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if D&#62;MaxTime then begin=Log:seek(); end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TS_HMS=HMS(TS);&nbsp;&nbsp;&nbsp;D=math.abs(HMS(TW)-TS_HMS)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TL_OLD=TL;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(200);
&nbsp;&nbsp;&nbsp;end
end
function OnInit(ph)
ph=ph:sub(1,ph:len()-3).."log"; 
Log = io.open(ph, "w");Log:close(); Log = io.open(ph, "r+");
 begin=Log:seek(); 
D=0;
&nbsp;&nbsp;&nbsp;run=true
end

</pre>
============= <br />
			<i>16.02.2026 08:30:40, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message81425/topic9474/</link>
			<guid>http://forum.quik.ru/messages/forum17/message81425/topic9474/</guid>
			<pubDate>Mon, 16 Feb 2026 08:30:40 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Тест быстродействия многопоточного бота</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message81167/topic9454/">Тест быстродействия многопоточного бота</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Тема для начинающих писателей роботов<br />-----------------------<br />Алгоритм теста:<br />---------------------<br />Скрипт на Lua в терминале &nbsp;QUIK обрабатывает колбеки и выставляет заявки по требованию приложения.<br />---------------------------------<br />Полученные события,<br />кроме событий OnOrder, OnStopOrder, OnTransReply, <br />которые обрабатывает сам, скрипт рассылает приложениям.<br />-------------------------------------<br />Для каждого инструмента или класса работает отдельное приложение, <br />которое получает данные от скрипта ,<br /> прогнозирует изменение позиции и отсылает требования на выставление или снятие заявок скрипту. <br />----------------------------------- &nbsp;<br />Приложения можно реализовать в виде отдельного скрипта для терминала QUIK ,<br /> либо отдельного приложения Windows.<br />--------------------------------------<br />Механизм обмена сообщениями реализован через файлы, поэтому он один и тот же как для скриптов так и для приложений.<br />-------------------------------------<br />Весь процесс обмена сообщений пишется в лог файлы. <br />Результаты теста такие:<br />это логи событий, от скрипта к приложениям для инструментов. Первое число - задержка получения события приложением. <br />В данном тесте задержка &nbsp;равна кванту windows, который установлен 2ms.<br />В конце каждого события через символ &quot;&gt; &quot; указано сколько всего событий в очереди.<br />
====code====
<pre>1024us, 19545940221.4:1,GAZP,126.22,126.22,126.31&#62;4
2069us, 19547996621.9:1,VTBR,81.79,81.770,81.790&#62;1
1761us, 19548976031.1:1,ALRS,40.96,40.94,40.96&#62;1
2122us, 19548975763.9:1,AFKS,13.446,13.442,13.446&#62;2
164us, 19548977786.8:1,GAZP,126.23,126.22,126.23&#62;3
3020us, 19551013990.4:1,AFKS,13.445,13.442,13.446&#62;3
2904us, 19552031852.1:1,GMKN,156.28,156.24,156.28&#62;3
2961us, 19552031904.2:1,VTBR,81.79,81.790,81.815&#62;1
2068us, 19553048370.0:1,AFLT,56.53,56.49,56.53&#62;7
19550003064us, 6120562.3:1,HYDR,0.4386,0.4383,0.4386&#62;2
2116us, 19557151989.5:1,AFLT,56.52,56.49,56.53&#62;5
3100us, 19557154009.4:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.22,quantity=377},{price=302.33,quantity=81},{price=302.42,quantity=3},{price=302.55,quantity=304},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945}},offer={{price=303.50,quantity=22},{price=303.58,quantity=1},{price=303.70,quantity=5},{price=303.71,quantity=375},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.08,quantity=201},{price=304.10,quantity=97}}}&#62;1
2946us, 19559169335.8:1,CHMF,974.4,974.0,975.2&#62;3
3149us, 19559169199.5:1,AFLT,56.53,56.49,56.53&#62;4
3024us, 19559187312.8:1,VTBR,81.815,81.790,81.815&#62;1
718us, 19560195155.7:1,RUAL,37.495,37.480,37.495&#62;2
2916us, 19560193051.8:1,GAZP,126.28,126.28,126.31&#62;2
1975us, 19560197010.7:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.33,quantity=81},{price=302.42,quantity=3},{price=302.55,quantity=304},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.50,quantity=5}},offer={{price=303.58,quantity=1},{price=303.70,quantity=5},{price=303.71,quantity=375},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.08,quantity=201},{price=304.10,quantity=97},{price=304.23,quantity=407}}}&#62;1
249us, 19561199970.8:1,SBER,303.5,303.50,303.58&#62;1
3111us, 19562215668.5:1,AFKS,13.451,13.442,13.451&#62;3
1527us, 19562226731.8:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.22,quantity=377},{price=302.33,quantity=81},{price=302.42,quantity=3},{price=302.55,quantity=304},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945}},offer={{price=303.50,quantity=35},{price=303.58,quantity=1},{price=303.70,quantity=5},{price=303.71,quantity=375},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.08,quantity=201},{price=304.10,quantity=97}}}&#62;1
1699us, 19563239495.6:1,SBER,303.5,303.48,303.50&#62;1
1073us, 19564257502.6:1,AFLT,56.54,56.49,56.54&#62;3
1975us, 19564259571.1:1,RUAL,37.5,37.480,37.500&#62;3
2916us, 19565367155.3:1,CHMF,974.6,974.6,975.2&#62;1
966us, 19566538221.2:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.22,quantity=377},{price=302.33,quantity=81},{price=302.42,quantity=3},{price=302.55,quantity=304},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945}},offer={{price=303.56,quantity=25},{price=303.57,quantity=10},{price=303.58,quantity=1},{price=303.70,quantity=5},{price=303.71,quantity=375},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.08,quantity=201}}}&#62;1
1117us, 19568731056.8:1,AFLT,56.55,56.49,56.55&#62;6
1013us, 19571884419.5:1,AFKS,13.452,13.442,13.452&#62;4
980us, 19571884533.0:1,GAZP,126.28,126.28,126.29&#62;2
2909us, 19572876032.2:1,GAZP,126.29,126.28,126.29&#62;1
995us, 19572878023.0:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.33,quantity=81},{price=302.42,quantity=3},{price=302.55,quantity=304},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.59,quantity=5}},offer={{price=303.70,quantity=5},{price=303.71,quantity=375},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97},{price=304.23,quantity=407}}}&#62;1
1817us, 19573893073.2:1,SBER,303.59,303.59,303.70&#62;2
2998us, 19576946543.6:1,SBER,303.6,303.59,303.70&#62;1
3060us, 19577952638.5:1,GAZP,126.31,126.28,126.31&#62;7
1116us, 19577954709.5:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.42,quantity=3},{price=302.55,quantity=304},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.59,quantity=5},{price=303.64,quantity=16}},offer={{price=303.70,quantity=5},{price=303.71,quantity=375},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97},{price=304.23,quantity=407}}}&#62;1
2844us, 19578998223.5:1,SBER,303.64,303.64,303.70&#62;1
2096us, 19579996246.4:1,CHMF,975.2,974.6,975.2&#62;6
3024us, 19580058598.2:1,VTBR,81.85,81.790,81.850&#62;1
1032us, 19581000600.7:1,RTKM,65.62,65.53,65.62&#62;3
3160us, 19580998565.3:1,AFLT,56.57,56.49,56.57&#62;2
2599us, 19582061555.8:1,RUAL,37.505,37.480,37.505&#62;1
1168us, 19582063123.7:1,SBER,303.66,303.64,303.66&#62;3
1721us, 19583137903.4:1,GMKN,156.32,156.24,156.34&#62;3
19584266007us, 705.9:1,MTSS,227.35,227.00,227.35&#62;2
779us, 19585436100.9:1,ALRS,40.97,40.94,40.97&#62;3
3031us, 19585451977.5:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.42,quantity=3},{price=302.55,quantity=304},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.59,quantity=5},{price=303.64,quantity=127}},offer={{price=303.66,quantity=40},{price=303.70,quantity=5},{price=303.71,quantity=375},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97}}}&#62;1
880us, 19586562910.9:1,RUAL,37.525,37.480,37.525&#62;2
1081us, 19586562802.1:1,AFKS,13.457,13.442,13.457&#62;3
988us, 19586562976.9:1,SBER,303.64,303.64,303.66&#62;1
1998us, 19586564896.4:1,VTBR,81.84,81.790,81.850&#62;2
1994us, 19586564971.2:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.42,quantity=3},{price=302.55,quantity=304},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.59,quantity=5},{price=303.64,quantity=40}},offer={{price=303.66,quantity=40},{price=303.70,quantity=5},{price=303.71,quantity=375},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97}}}&#62;1
2879us, 19587645272.0:1,VTBR,81.85,81.790,81.850&#62;1
2058us, 19587661250.3:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.55,quantity=304},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.59,quantity=5},{price=303.64,quantity=33},{price=303.65,quantity=11}},offer={{price=303.66,quantity=40},{price=303.70,quantity=5},{price=303.71,quantity=375},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97}}}&#62;1
1914us, 19588755163.3:1,SBER,303.65,303.65,303.66&#62;2
3076us, 19588757012.6:1,VTBR,81.85,81.850,81.855&#62;2
2780us, 19592899311.6:1,RUAL,37.51,37.480,37.510&#62;1
2002us, 19593894417.4:1,VTBR,81.855,81.850,81.855&#62;1
2050us, 19594927136.5:1,AFKS,13.448,13.442,13.452&#62;6
1978us, 19594927300.1:1,MTSS,227.2,227.00,227.20&#62;4
1986us, 19595921782.1:1,AFKS,13.448,13.448,13.449&#62;4
2013us, 19596942548.8:1,AFKS,13.449,13.449,13.452&#62;3
1955us, 19596942729.0:1,SBER,303.66,303.65,303.66&#62;1
2984us, 19596944644.8:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.55,quantity=304},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.59,quantity=5},{price=303.64,quantity=33},{price=303.65,quantity=24}},offer={{price=303.66,quantity=83},{price=303.70,quantity=5},{price=303.71,quantity=376},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97}}}&#62;1
1832us, 19598988870.0:1,GMKN,156.34,156.24,156.34&#62;4
109us, 19598990711.0:1,SBER,303.71,303.65,303.71&#62;4
2937us, 19598990816.2:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.58,quantity=177},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.59,quantity=5},{price=303.64,quantity=33},{price=303.65,quantity=24}},offer={{price=303.71,quantity=475},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97},{price=304.23,quantity=407},{price=304.28,quantity=236}}}&#62;1
2059us, 19599991800.5:1,MTSS,227.3,227.00,227.30&#62;5
1369us, 19601010287.6:1,RUAL,37.53,37.480,37.530&#62;1
1026us, 19602016692.1:1,AFKS,13.453,13.449,13.453&#62;5
3040us, 19605200077.0:1,SBER,303.7,303.65,303.71&#62;2
1963us, 19607223681.8:1,SBER,303.7,303.70,303.71&#62;3
2109us, 19607241747.3:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.59,quantity=5},{price=303.64,quantity=33},{price=303.65,quantity=24},{price=303.70,quantity=4}},offer={{price=303.71,quantity=475},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97},{price=304.23,quantity=407},{price=304.28,quantity=236}}}&#62;1
246us, 19609261908.6:1,RUAL,37.525,37.480,37.525&#62;2
1145us, 19609261165.6:1,AFLT,56.57,56.56,56.57&#62;9
2001us, 19612320640.0:1,AFKS,13.45,13.449,13.453&#62;2
3017us, 19613357085.7:1,VTBR,81.85,81.850,81.855&#62;1
873us, 19618420864.4:1,RUAL,37.525,37.525,37.530&#62;1
1070us, 19618420750.7:1,ALRS,40.95,40.94,40.95&#62;3
2965us, 19620569675.3:1,SBER,303.69,303.65,303.69&#62;2
3029us, 19621672486.3:1,AFKS,13.45,13.449,13.450&#62;3
2871us, 19622754415.3:1,SBER,303.7,303.65,303.70&#62;1
1814us, 19624963547.9:1,GMKN,156.36,156.24,156.36&#62;2
1005us, 19629285145.6:1,ALRS,40.95,40.94,40.97&#62;2
2974us, 19631443340.0:1,ALRS,40.95,40.94,40.95&#62;2
839us, 19632517491.0:1,MTSS,227.15,227.00,227.30&#62;1
2017us, 19633576478.9:1,ALRS,40.95,40.95,40.97&#62;2
1028us, 19636788872.1:1,AFKS,13.452,13.449,13.452&#62;3
936us, 19636789059.0:1,SBER,303.68,303.65,303.70&#62;1
3004us, 19638830536.8:1,GAZP,126.31,126.30,126.31&#62;7
2884us, 19638830746.4:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=300.71,quantity=1},{price=302.55,quantity=304},{price=302.58,quantity=177},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.57,quantity=60}},offer={{price=303.70,quantity=6},{price=303.71,quantity=475},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97},{price=304.23,quantity=407}}}&#62;1
1002us, 19639893190.4:1,ALRS,40.94,40.94,40.97&#62;5
2987us, 19640857405.7:1,ALRS,40.93,40.93,40.97&#62;3
2990us, 19640857505.9:1,SBER,303.57,303.57,303.70&#62;1
1862us, 19641904165.2:1,SBER,303.58,303.58,303.70&#62;1
3021us, 19641905963.7:1,VTBR,81.855,81.850,81.855&#62;1
1046us, 19641920092.7:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.55,quantity=304},{price=302.58,quantity=177},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.57,quantity=60},{price=303.58,quantity=5}},offer={{price=303.70,quantity=6},{price=303.71,quantity=475},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97},{price=304.23,quantity=407}}}&#62;1
1792us, 19642903655.9:1,RUAL,37.53,37.525,37.530&#62;2
2965us, 19643911832.3:1,SBER,303.6,303.60,303.70&#62;1
1027us, 19644926434.1:1,ALRS,40.97,40.93,40.97&#62;5
877us, 19647965299.3:1,MTSS,227.3,227.00,227.30&#62;2
2038us, 19648980013.8:1,RTKM,65.63,65.53,65.63&#62;4
1998us, 19650118906.3:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.57,quantity=60},{price=303.58,quantity=5},{price=303.60,quantity=9},{price=303.63,quantity=1}},offer={{price=303.70,quantity=6},{price=303.71,quantity=475},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97},{price=304.23,quantity=407}}}&#62;1
910us, 19651219492.2:1,SBER,303.63,303.63,303.70&#62;1
1023us, 19653450111.0:1,GAZP,126.3,126.30,126.31&#62;1
1034us, 19656678685.6:1,ALRS,40.94,40.93,40.97&#62;3
2986us, 19657784199.8:1,ALRS,40.94,40.93,40.94&#62;3
849us, 19658870958.0:1,RUAL,37.525,37.525,37.530&#62;3
1072us, 19658870804.0:1,ALRS,40.94,40.93,40.97&#62;7
2018us, 19658872904.9:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.58,quantity=177},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.57,quantity=60},{price=303.58,quantity=5},{price=303.60,quantity=9}},offer={{price=303.62,quantity=3},{price=303.70,quantity=6},{price=303.71,quantity=475},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201},{price=304.10,quantity=97}}}&#62;1
3016us, 19659998924.8:1,ALRS,40.97,40.93,40.97&#62;6
966us, 19661037394.8:1,VTBR,81.855,81.855,81.860&#62;2
997us, 19661037448.6:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=300.04,quantity=59},{price=302.55,quantity=304},{price=302.58,quantity=177},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.57,quantity=60}},offer={{price=303.58,quantity=12},{price=303.62,quantity=3},{price=303.70,quantity=6},{price=303.71,quantity=475},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201}}}&#62;1
2812us, 19661996560.1:1,GMKN,156.34,156.34,156.36&#62;4
3136us, 19661996364.4:1,CHMF,974.8,974.6,974.8&#62;6
3024us, 19662056764.5:1,VTBR,81.86,81.855,81.860&#62;1
2011us, 19666067757.2:1,GMKN,156.32,156.32,156.36&#62;2
2051us, 19668088665.3:1,GMKN,156.36,156.32,156.36&#62;2
2085us, 19668143011.9:1,VTBR,81.855,81.855,81.860&#62;2
2083us, 19669133655.1:1,GAZP,126.31,126.30,126.31&#62;4
865us, 19673197714.8:1,RUAL,37.505,37.505,37.530&#62;1
3028us, 19675273824.7:1,VTBR,81.825,81.825,81.860&#62;1
911us, 19676266770.5:1,VTBR,81.855,81.855,81.860&#62;1
3046us, 19678333887.3:1,HYDR,0.4388,0.4383,0.4388&#62;2
955us, 19680341257.4:1,SBER,303.58,303.57,303.58&#62;1
2114us, 19680343236.1:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=300.04,quantity=59},{price=302.55,quantity=304},{price=302.58,quantity=177},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.57,quantity=60}},offer={{price=303.58,quantity=10},{price=303.59,quantity=2},{price=303.62,quantity=3},{price=303.70,quantity=6},{price=303.71,quantity=475},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309}}}&#62;1
3046us, 19681356411.9:1,GAZP,126.3,126.30,126.31&#62;2
841us, 19682375223.5:1,SBER,303.59,303.58,303.59&#62;1
1955us, 19682377113.8:2,SBER,{bid_count=10.000000,offer_count=10.000000,bid={{price=302.55,quantity=304},{price=302.58,quantity=177},{price=302.74,quantity=226},{price=302.83,quantity=118},{price=302.86,quantity=1},{price=303.04,quantity=6},{price=303.19,quantity=52},{price=303.48,quantity=945},{price=303.57,quantity=60},{price=303.58,quantity=3}},offer={{price=303.59,quantity=12},{price=303.62,quantity=3},{price=303.70,quantity=6},{price=303.71,quantity=475},{price=303.76,quantity=162},{price=303.78,quantity=1},{price=303.82,quantity=90},{price=303.96,quantity=45},{price=304.05,quantity=309},{price=304.08,quantity=201}}}&#62;1
980us, 19685485494.8:1,VTBR,81.82,81.820,81.860&#62;1
2043us, 19687552516.3:1,VTBR,81.855,81.820,81.860&#62;1
1887us, 19689492369.4:1,VTBR,81.855,81.820,81.855&#62;1</pre>
=============
это сообщения от приложений. &nbsp;Сообщение отсылается на каждое событие по данному инструменту:<br />В сообщении первым указано время задержки приема его скриптом. &nbsp;<br />Если сообщения от приложения скрипт получил одновременно, <br />т е они были все записаны до того момента как скрипт их прочитал, <br />то в таблице у них одно время и они отделены пустой строкой от следующих сообщений.<br /> &nbsp;
====code====
<pre>27us, 19524576309.1:RUAL,привет

241us, 19524576631.9:GMKN,привет
19524586256.6:ALRS,привет
19524586480.4:ROSN,привет
19524586636.8:CBOM,привет
19524586779.4:AFKS,привет
19524586918.3:MOEX,привет
19524587053:SNGS,привет
19524587195.6:GAZP,привет

320us, 19524587469.6:VTBR,привет
19524596990.6:UNAC,привет
19524597192:SIBN,привет

428us, 19524597336.9:RTKM,привет
19524606625.7:MTSS,привет
19524606946.3:SBER,привет
19524607100.8:CHMF,привет

509us, 19524607493.5:HYDR,привет
19524607741.9:AFLT,привет
19524607872.6:MAGN,привет

536us, 19525376511.4:AFLT,привет

563us, 19526375377.9:VTBR,привет

590us, 19528407463.3:VTBR,привет

617us, 19530430789.6:RUAL,привет

644us, 19531459927.5:GAZP,привет

671us, 19532483018.9:SBER,привет

725us, 19533490423.2:GAZP,привет
19533490522.8:SBER,привет

752us, 19534496366.8:AFKS,привет

777us, 19534499442:SBER,привет

804us, 19534502462.4:SBER,привет

858us, 19535508322.3:RUAL,привет
19535508436.1:VTBR,привет

912us, 19536527079.2:VTBR,привет
19536527198.3:RTKM,привет

939us, 19539811762.2:VTBR,привет

966us, 19541928043.2:GAZP,привет

993us, 19544947679.6:GAZP,привет

1020us, 19545941246.3:GAZP,привет

1047us, 19547998691.4:VTBR,привет

1128us, 19548977792.9:ALRS,привет
19548977886.4:AFKS,привет
19548977951.4:GAZP,привет

1155us, 19551017010.9:AFKS,привет

1209us, 19552034756.9:GMKN,привет
19552034865.5:VTBR,привет

1236us, 19553050438.7:AFLT,привет

1263us, 19556123626.8:HYDR,привет

1288us, 19557154106:AFLT,привет

1315us, 19557157109.6:SBER,привет

1369us, 19559172282.7:CHMF,привет
19559172348.9:AFLT,привет

1396us, 19559190337.2:VTBR,привет

1450us, 19560195874.1:RUAL,привет
19560195968.7:GAZP,привет

1475us, 19560198986:SBER,привет

1502us, 19561200220.2:SBER,привет

1527us, 19562218780:AFKS,привет

1554us, 19562228258.9:SBER,привет

1581us, 19563241194.7:SBER,привет

1608us, 19564258575.8:AFLT,привет

1635us, 19564261546.6:RUAL,привет

1662us, 19565370071.7:CHMF,привет

1689us, 19566539187.4:SBER,привет

1716us, 19568732173.8:AFLT,привет

1770us, 19571885432.5:AFKS,привет
19571885513.6:GAZP,привет

1824us, 19572878941.2:GAZP,привет
19572879018.8:SBER,привет

1851us, 19573894890.5:SBER,привет

1878us, 19576949541.6:SBER,привет

1932us, 19577955698.6:GAZP,привет
19577955826.4:SBER,привет

1959us, 19579001067.5:SBER,привет

1986us, 19579998343.3:CHMF,привет

2013us, 19580061622.2:VTBR,привет

2067us, 19581001633.1:RTKM,привет
19581001725.4:AFLT,привет

2121us, 19582064155.5:RUAL,привет
19582064292.6:SBER,привет

2148us, 19583139625.1:GMKN,привет

2175us, 19584266713.8:MTSS,привет

2202us, 19585436880.6:ALRS,привет

2229us, 19585455008.9:SBER,привет

2310us, 19586563791.3:RUAL,привет
19586563883.2:AFKS,привет
19586563965.5:SBER,привет

2364us, 19586566895.3:VTBR,привет
19586566966.1:SBER,привет

2391us, 19587648151.3:VTBR,привет

2526us, 19593896419.5:VTBR,привет

2580us, 19594929186.9:AFKS,привет
19594929278.2:MTSS,привет

2607us, 19595923768.5:AFKS,привет

2661us, 19596944562.7:AFKS,привет
19596944684.5:SBER,привет

2688us, 19596947629.5:SBER,привет

2740us, 19598990702.8:GMKN,привет
19598990820:SBER,привет

2767us, 19598993753.3:SBER,привет
</pre>
============= <br />
			<i>06.02.2026 11:54:44, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message81167/topic9454/</link>
			<guid>http://forum.quik.ru/messages/forum17/message81167/topic9454/</guid>
			<pubDate>Fri, 06 Feb 2026 11:54:44 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Тест  ускорения скриптов </title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message81111/topic9446/">Тест  ускорения скриптов </a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Ранее привел результаты теста обмена данными через файлы. <br /><noindex><a href="https://forum.quik.ru/messages/forum10/message81107/topic9441/#message81107" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum10/message81107/topic9441/#message81107</a></noindex><br /><B>Основной вывод :</B><br />------------------------------<br />SLEEP в MAIN &nbsp;приводит к задержке работы скриптов минимум <br />на &nbsp;квант Windows. Его величина по умолчанию равна <B>16 ms.<br /></B>-------------------------------<br />Прикольно то, что до Windows10 2004 года этот квант можно было сравнительно просто уменьшить до 0.5ms.<br />Теперь это сделать просто не получится.<br />--------------------------------<br />Для решения проблемы сделал другую функцию sleep, которая уменьшает этот интервал до 2 ms.<br />----------------------<br />Результаты теста:<br /><B>Тест с функцией sleep(1) из библиотеки QLUA &nbsp;Задержка 15985 мкс округляем </B><B>16 ms</B>
====code====
<pre>SBER,14923,2615122535.2:2615107611.7:{sell=307.75,buy=307.91,clas=QJSIM,fun=Param,last=307.91}
SBER,14855,2616143429.0:2616128573.2:{sell=307.90,buy=307.97,clas=QJSIM,fun=Param,last=307.97}
SBER,15854,2617162439.6:2617146585.0:{sell=307.90,buy=307.98,clas=QJSIM,fun=Param,last=307.98}
SBER,15922,2618184470.3:2618168548.0:{sell=307.90,buy=307.98,clas=QJSIM,fun=Param,last=307.9}
VTBR,15897,2625276507.6:2625260610.2:{sell=77.81,buy=77.82,clas=QJSIM,fun=Param,last=77.82}
GAZP,14832,2628324507.2:2628309674.9:{sell=128.61,buy=128.63,clas=QJSIM,fun=Param,last=128.61}
AFKS,15153,2628324659.2:2628309505.6:{sell=13.325,buy=13.349,clas=QJSIM,fun=Param,last=13.325}
RUAL,15143,2628324742.1:2628309599.0:{sell=41.050,buy=41.055,clas=QJSIM,fun=Param,last=41.05}
VTBR,15961,2629393498.9:2629377537.1:{sell=77.81,buy=77.82,clas=QJSIM,fun=Param,last=77.81}
AFKS,15997,2630432458.6:2630416461.3:{sell=13.318,buy=13.349,clas=QJSIM,fun=Param,last=13.318}
VTBR,15987,2630432563.9:2630416576.0:{sell=77.81,buy=77.82,clas=QJSIM,fun=Param,last=77.82}
MAGN,16069,2633485572.0:2633469502.1:{sell=30.730,buy=30.750,clas=QJSIM,fun=Param,last=30.73}
SNGS,15997,2636567534.9:2636551537.3:{sell=22.360,buy=22.365,clas=QJSIM,fun=Param,last=22.36}
MAGN,15985,2636567666.4:2636551681.0:{sell=30.730,buy=30.735,clas=QJSIM,fun=Param,last=30.735}</pre>
=============
<br /><B>Тест с функцией </B><B>sleep(1) из библиотеки nkQt. &nbsp;Задержка 1939</B><B> мкс округляем </B><B>2</B><B> ms</B><br />
====code====
<pre>VTBR,995,2003181508.4:2003180513.4:{clas=QJSIM,buy=78.00,last=78.0,sell=77.98,fun=Param}
VTBR,1944,2004190515.0:2004188570.8:{clas=QJSIM,buy=77.99,last=77.99,sell=77.98,fun=Param}
VTBR,1993,2015413431.9:2015411438.4:{clas=QJSIM,buy=78.01,last=78.01,sell=77.98,fun=Param}
RUAL,1962,2017473422.7:2017471460.4:{clas=QJSIM,buy=41.055,last=41.055,sell=41.040,fun=Param}
RUAL,1885,2018447403.9:2018445518.0:{clas=QJSIM,buy=41.050,last=41.05,sell=41.040,fun=Param}
SBER,884,2019485502.1:2019484617.9:{clas=QJSIM,buy=308.13,last=308.09,sell=308.02,fun=Param}
RUAL,1961,2021516411.4:2021514449.6:{clas=QJSIM,buy=41.050,last=41.04,sell=41.040,fun=Param}
GAZP,1068,2026610497.9:2026609429.0:{clas=QJSIM,buy=128.68,last=128.68,sell=128.66,fun=Param}
GAZP,39,2028624499.9:2028624460.6:{clas=QJSIM,buy=128.68,last=128.67,sell=128.66,fun=Param}
VTBR,271,2031854788.0:2031854516.3:{clas=QJSIM,buy=78.00,last=78.0,sell=77.98,fun=Param}
RUAL,1974,2034058458.2:2034056483.4:{clas=QJSIM,buy=41.045,last=41.045,sell=41.040,fun=Param}
RUAL,1911,2039442407.5:2039440495.6:{clas=QJSIM,buy=41.050,last=41.05,sell=41.045,fun=Param}
GMKN,1986,2042668694.0:2042666707.6:{clas=QJSIM,buy=168.08,last=168.06,sell=168.00,fun=Param}
RUAL,1888,2043786654.7:2043784766.5:{clas=QJSIM,buy=41.050,last=41.045,sell=41.045,fun=Param}
VTBR,2030,2043786721.1:2043784690.7:{clas=QJSIM,buy=78.00,last=77.99,sell=77.99,fun=Param}
GMKN,1939,2043786768.3:2043784829.1:{clas=QJSIM,buy=168.02,last=168.02,sell=168.00,fun=Param}</pre>
=============
Таким образом удалось уменьшить задержку в скриптах в 8 раз. <br />
			<i>01.02.2026 09:24:56, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message81111/topic9446/</link>
			<guid>http://forum.quik.ru/messages/forum17/message81111/topic9446/</guid>
			<pubDate>Sun, 01 Feb 2026 09:24:56 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Универсальный обработчик событий  - это просто</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message81064/topic9436/">Универсальный обработчик событий  - это просто</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Эта тема для начинающих писателей роботов на Lua в QUIK.<br />Cкрипт, на основе которого можно строить различных роботов.<br />В нем реализована очередь , что обеспечивает обработку всех событий<br />
====code====
<pre> TQ={}; jQr,jQw=0,0; --очередь
----------------------------
function main()
&nbsp;&nbsp; while run==1 do wait_connect()
&nbsp;&nbsp;&nbsp;while run==2 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while jQw&#62;jQr do local n=jQr+1;local t=TQ&#91;n&#93;;TQ&#91;n&#93;=nil;jQr=n;t.fun(t);end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(10)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp; end
end 
-----------------------------
local function wQ(t,fun) --функция записи обработчика в очередь 
&nbsp;&nbsp; if fun then
&nbsp;&nbsp; t.fun=fun; local n=jQw;if jQr==jQw then jQw=0;jQr=0;end n=jQw+1;TQ&#91;n&#93;=t; jQw=n;
&nbsp;&nbsp; end
end
-----функции обратного вызова QLua------------------------
function OnDepoLimit(t) wQ(t,setPos);&nbsp;&nbsp;end
----------------------------
function OnFuturesClientHolding(t) wQ(t,setPos);&nbsp;&nbsp;end
-----------------------------
function OnOrder(t) wQ(t,Order);&nbsp;&nbsp;end
----------------------------
function OnStopOrder(t) wQ(t,StopOrder);&nbsp;&nbsp;end
-----------------------
function OnTransReply(t) wQ(t,TransReply);&nbsp;&nbsp;end
----------------------------
function OnParam(c, s) wQ({sec_code=s,class_code=c},Param); end&nbsp;&nbsp;
----------------------------
function OnQuote(c, s) wQ({sec_code=s,class_code=c},Quote); end 
------------------------
function OnDisconnected() run=1 end
-------------------------
function OnConnected(flag) Trans,Tsec,Tclas,Tclient,pos={},{},{},{},{} run=1 end&nbsp;&nbsp;
---------------------------
function CloseTH() if td_id then DestroyTable(td_id); end run =0 if f then f:close() end end
------------------------------
function OnStop(s) CloseTH();return 1000 end 
---------------------------
function OnClose()&nbsp;&nbsp;CloseTH() end 
---------------------------
function OnCleanUp() run=1; end
---------------
function OnInit(path) OnConnected(true); end
</pre>
=============
Функции обратного вызова записываются одинаково.<br />В них мы помещаем в очередь TQ &nbsp;полученные параметры и имя функции, которая обрабатывает данное событие. <br />Функция обработки событий реализуется отдельно. <br />Если функция обработки события отсутствует, то событие не будет записываться во очередь. &nbsp; <br />
			<i>29.01.2026 06:21:45, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message81064/topic9436/</link>
			<guid>http://forum.quik.ru/messages/forum17/message81064/topic9436/</guid>
			<pubDate>Thu, 29 Jan 2026 06:21:45 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>алгоритм бота - стопа</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80815/topic9421/">алгоритм бота - стопа</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Предлагаю обсудить один из моих вариантов бота, который управляет стопом. <br />-------------------------<br />Конструктивная критика приветствуется.<br />=================== <br />Открываем график с инструментом , помещаем на него скрипт-индикатор бота и совершаем сделки. <br />----------------------<br />Бот имеет два режима.<br />----------------------------------<br />В первом режиме бот автоматически установит стоп, если есть позиция &nbsp;по инструменту.<br />--------------------------<br />Во втором режиме бот начнет управлять стопом, если руками установить стоп &nbsp;в любую позицию.<br />Когда бот обнаружит установленный стоп, он будет его переставлять в соответствии с заданным алгоритмом.<br />----------------------<br />Если позиция закроется, то стоп будет снят. <br />При появлении новой позиции бот будет управлять стопом.<br />----------------------------------<br />Чтобы бот перестал управлять, надо снять стоп руками.<br />---------------------------------<br />При старте QUIK бот начинает работать в установленном режиме.<br /> <br /> &nbsp; <br />
			<i>09.01.2026 07:55:35, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80815/topic9421/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80815/topic9421/</guid>
			<pubDate>Fri, 09 Jan 2026 07:55:35 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Торговый советник - это просто. </title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80774/topic9418/">Торговый советник - это просто. </a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Тема для начинающих писателей роботов.<br />Продолжение темы: <br /><noindex><a href="https://forum.quik.ru/messages/forum17/message80773/topic9417/#message80773" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum17/message80773/topic9417/#message80773</a></noindex><br />------------------------- <br />Чтобы сразу не сливать депозит, &nbsp;лучше написать робот-советник, который на истории покажет , что он сможет.<br />---------------------------<br />Напишем такой советник.<br />Для этого в приведенный по ссылке выше скрипт добавим расчет прибыли/убытков при совершении сделок по приведенному ранее(см ссылку) алгоритму<br />------------------------<br />Примем что брокер и биржа забирают com=0.006 (0.6%)<br />Расчет будет проводить в %, количество лотов примем равным 1. Сделки совершаются в long и short.<br />В результате получился вот такой скрипт:
====code====
<pre>function OnCalculate(i)
&nbsp;&nbsp;local buy,sel;
&nbsp;&nbsp;if i==1 then OnChangeSettings() 
&nbsp;&nbsp;&nbsp;&nbsp;i1=0; t={}; Prof=0; Los=0; Q=Settings.Q; com=Settings.com; ProfAll=0;&nbsp;&nbsp;BS=0;
&nbsp;&nbsp;elseif i1~=i&nbsp;&nbsp;then 
&nbsp;&nbsp;&nbsp;&nbsp; ind(i1,Settings.tag,t); 
&nbsp;&nbsp;&nbsp;&nbsp; if #t&#62;0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local Oi,Hi,Li=O(i1),H(i1),L(i1)&nbsp;&nbsp;local prib=0;&nbsp;&nbsp;local z=T(i1);&nbsp;&nbsp; x=t&#91;#t&#93;; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params.DATE=100*(100*z.year+z.month)+z.day; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params.TIME=100*(100*z.hour+z.min)+z.sec;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Li&#62;x and 0&#62;=BS then buy=Li-0.05;&nbsp;&nbsp;if BS==0 then prib=-com; else prib=(1-com)*(price/Oi-1); end&nbsp;&nbsp;BS=1; price=Oi; params.YVALUE=buy-0.1; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if x&#62;Hi and BS&#62;=0&nbsp;&nbsp;then&nbsp;&nbsp;sel=Hi+0.05 if BS==0 then prib=-com; else prib=(1-com)*(Oi/price-1); end price=Oi;&nbsp;&nbsp;BS=-1; params.YVALUE=sel+0.1; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if buy or sel then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProfAll=ProfAll+prib;&nbsp;&nbsp;&nbsp;&nbsp;params.TEXT=(0.1*(1000*ProfAll//1)).."%" 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ProfAll&#62;=0 then params.B=255 params.R=0 else params.B=0 params.R=255 end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Label=AddLabel(Settings.tag,params);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;end
&nbsp;&nbsp;i1=i;&nbsp;&nbsp;
 return buy,sel;
 end

function Init() 
local t={} Settings.line =t;
&nbsp;&nbsp;&nbsp;t&#91;#t+1&#93;={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 4};
&nbsp;&nbsp;&nbsp;&nbsp;t&#91;#t+1&#93;={Name = "Se",Color = RGB(255,0,0),Type = 11,Width = 4};
&nbsp;&nbsp;&nbsp;return #t; end
&nbsp;&nbsp;&nbsp;&nbsp;
function OnDestroy ()&nbsp;&nbsp;DelAllLabels(Settings.tag) end
function OnChangeSettings() 
&nbsp;&nbsp;&nbsp;DelAllLabels(Settings.tag); 
end


</pre>
=============
 а это результат его тестирования на демо-сервере:<br />[FILE ID=13044] <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=13044&" width="1920" height="1080" /><br /><i>04.01.2026 19:07:20, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80774/topic9418/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80774/topic9418/</guid>
			<pubDate>Sun, 04 Jan 2026 19:07:20 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Данные с индикатора. Просто и быстро.</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80769/topic9417/">Данные с индикатора. Просто и быстро.</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Тема для начинающих писателей роботов.<br />----------------------------<br />Ранее на форуме я рассказывал как построить робота-эксперта &nbsp;на основе двух любых индикаторов отображаемых на графике.<br /><noindex><a href="https://forum.quik.ru/forum17/topic7630/" target="_blank" rel="nofollow">https://forum.quik.ru/forum17/topic7630/</a></noindex><br />---------------------------<br />В этой теме поясню как читать данные с индикатора быстро и просто. <br />------------------------<br />Напишем пример скрипта индикатора, который считывает значения индикатора moving в массив t и выводит на график значения индикатора смещенные на 0.1 в виде зеленых треугольников .<br />---------------------------<br />При этом &nbsp;сделаем так, чтобы индикатор не тратил время на считывание тиков, а читал значение индикатора один раз в момент появления новой свечи цены. <br /><br />В моих роботах именно в этот момент и принимается решение о выставлении заявки. <br /><br />Т е решение принимается в момент открытия новой свечи . <br />------------------------------ &nbsp;<br />Если робот будет торговать на интервала 30 минут, то чтение индикатора будет происходить всего 1 раз в 30 минут именно на открытии новой свечи. <br />
====code====
<pre>Settings={ tag="moving", Name = '*nk_test'}

function OnCalculate(i)
 if i==1 then&nbsp;&nbsp;i1=0; t={};
 elseif i1~=i&nbsp;&nbsp;then local M=getNumCandles (Settings.tag);&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;if M&#62;=i then x=getCandlesByIndex(Settings.tag,0,i1,1); if x then t&#91;#t+1&#93;=x&#91;0&#93;.close end&nbsp;&nbsp;i1=i;&nbsp;&nbsp;end
 end
 i1=i;&nbsp;&nbsp;if #t&#62;0 and t&#91;#t&#93;~=0 then&nbsp;&nbsp;return t&#91;#t&#93;+0.1; end
end

function Init() 
local t={} Settings.line =t;
t&#91;#t+1&#93;={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 3};
return #t;
end</pre>
=============
<br />[FILE ID=13039]<br /><br />это результат:<br />[FILE ID=13040] <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=13039&" width="1330" height="546" /><br /><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=13040&" width="1112" height="736" /><br /><i>04.01.2026 09:18:57, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80769/topic9417/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80769/topic9417/</guid>
			<pubDate>Sun, 04 Jan 2026 09:18:57 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Торговые роботы без программирования</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80752/topic9416/">Торговые роботы без программирования</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Тема создана с целью &nbsp;обсудить мой подход к созданию торговых роботов без написания сложных скриптов на Lua.<br />--------------------------<br />Приведу примеры, потом объясню что и как.<br />----------------------<br /><B>Пример 1:</B> Скрипт скользящего стопа на основе индикатора fractals записывается таким образом: <br />[FILE ID=13037]<br /><br /><br /><B>Пример 2:</B> Скрипт торгового робота на основе индикаторов moving и RSI<br />[FILE ID=13038]<br /><br /><br />Робот строится как скрипт индикатора и состоит из обязательной таблицы Settings, встроенных в QUIK индикаторов &nbsp;и библиотеки nklibi, начальным объемом &nbsp;11 КБ.<br />------------------- <br />Все необходимые параметры робота определяются в Settings.<br />Изначально указывается, если надо, создание лог файла, набор индикаторов, на основе которых будет работать робот. &nbsp;Для каждого индикатора указывается линия, параметр свечи и смещение относительно текущего значения.<br />------------------- &nbsp;<br />Для применения робота необходимо открыть график инструмента, поместить на него указанные в Settings индикаторы и записать им в качестве идентификаторов указанные имена.<br />-------------------<br />Алгоритмы новых роботов можно добавить либо в библиотеку, либо в конец скрипта.<br />=================== <br />Библиотека nklibi реализует конечный автомат &nbsp;управления заявками и стоп-заявками, а также определяет по графику инструмента все необходимые для торговли параметры. <br />====================<br />Если график с индикатором робота связать якорем с таблицей текущих параметров(ТТП) торгов, то, перебирая инструменты в ТТП, &nbsp;можно переключать робота &nbsp;на различные торгуемые инструменты.<br />---------------------------------- <br />Конструктивные предложения по расширению возможностей данного подхода приветствуются. <br />----------------------------<br />В настоящее время библиотека nklibi находится в стадии тестирования.<br /><br /><br /> &nbsp; <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=13037&" width="1502" height="492" /><br /><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=13038&" width="1492" height="486" /><br /><i>03.01.2026 10:33:09, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80752/topic9416/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80752/topic9416/</guid>
			<pubDate>Sat, 03 Jan 2026 10:33:09 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Индикатор с метками</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80620/topic9402/">Индикатор с метками</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			По просьбе трудящихся, написал Пример ПРАВИЛЬНОГО индикатора, который &nbsp;через секунду удаляет ранее выставленную метку и выводит новую.<br />--------------------------------<br />Пользуйтесь на здоровье.<br />----------------------------<br /><br /><table class="data-table"><tr><th>Код</th></tr><tr><td>Settings={ Name = &quot;*nk_test&quot;, tag =&quot;Metka&quot; &nbsp;}<br /><br /> params={R = 255, G = 255, B = 255, TRANSPARENCY = 0,FONT_HEIGHT = 10,TRANSPARENT_BACKGROUND = 1, FONT_FACE_NAME = &#39;Verdana&#39; }<br /><br />function OnCalculate(i)<br /> &nbsp; if i==1 then<br /> &nbsp; OnChangeSettings() &nbsp;<br /> &nbsp; elseif i== Size() then &nbsp; &nbsp;-- последняя свеча<br /> &nbsp; &nbsp; &nbsp;if os.time() &gt; LastSecond &nbsp;then &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-- раз в секунду (или больше) &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LastSecond = os.time(); &nbsp; &nbsp;-- потиковое обновление (с задержкой) &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; if Label then DelLabel(Settings.tag,Label) end<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;params.TEXT =tostring(C(i))<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;params.HINT = tostring(i)<br /> &nbsp; &nbsp; &nbsp; &nbsp; local h=0 &nbsp; local &nbsp;m=i; &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; while 14&gt;i-m &nbsp;do if H(m) &gt; h then h=H(m) end;m=m-1; &nbsp; end<br /> &nbsp; &nbsp; &nbsp; &nbsp; local Ti=T(i-3)<br /> &nbsp; &nbsp; &nbsp; &nbsp; params.DATE=100*(100*Ti.year+Ti.month)+Ti.day;<br /> &nbsp; &nbsp; &nbsp; &nbsp; params.TIME=100*(100*Ti.hour+Ti.min)+Ti.sec; &nbsp; <br /> &nbsp; &nbsp; &nbsp; &nbsp; params.YVALUE =h;<br /> &nbsp; &nbsp; &nbsp; &nbsp; Label= AddLabel(Settings.tag, params) <br /> &nbsp; &nbsp; &nbsp; &nbsp;end -- every second<br /> &nbsp; &nbsp;end <br />end<br /><br />function OnChangeSettings() <br />sec = getDataSourceInfo().sec_code; DelAllLabels(Settings.tag); <br />LastSecond=0 &nbsp;end<br />function OnDestroy() OnChangeSettings() end<br />function Init() &nbsp;return 1 end</td></tr></table><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=13021&width=500&height=500" alt="Пользователь добавил изображение" border="0" /><br /><br /><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=13022&width=500&height=500" alt="Пользователь добавил изображение" border="0" /><br /><br /><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=13023&width=500&height=500" alt="Пользователь добавил изображение" border="0" /> <br />
			<i>23.12.2025 08:36:00, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80620/topic9402/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80620/topic9402/</guid>
			<pubDate>Tue, 23 Dec 2025 08:36:00 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Структура моего робота</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80323/topic9367/">Структура моего робота</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			<p>В данной теме рассказываю, как построен мой торговый робот.</p><p>Полагаю, что тема будет интересна не только начинающим писателям роботов, </p><p>так как излагаю свои идеи, которые обладают определенной новизной .</p><p>---------------------------- </p><p><B>Структура робота организована в виде сети роботов типа “звезда”.</B></p><p>Каждый робот – это отдельный поток или процесс ОС Windows.</p>------------------------------<p>В центре звезды находится главный робот nkbot, который обрабатывает события колбеков и таймера &nbsp;и раздает задания другим роботам.</p><p>События организованы в виде очереди. Если событий нет в течении заданного интервала, то робот выполняет задание по таймеру.</p><p>---------------------------</p><p>Все остальные роботы работают с заданной для каждого робота группой инструментов</p><p> и выполняют свои задачи по команде nkbot, либо по истечению заданного интервала времени.</p><p>---------------------------</p><p>Каждый робот работает в своем потоке OS Windows, либо в процессе терминала &nbsp;QUIK и имеет доступ к библиотеке QLua, либо в изолированном потоке(процессе) OS &nbsp;</p><p>Роботы в терминале запускаются как скрипты терминала QUIK. </p><p>----------------------------</p><p>Связь робота nkbot с каждым роботом сети выполняется через очередь команд в общей памяти. </p><p>Список работающих роботов создается в файле инициализации nkbot_ini.lua.</p><p>Задачи для роботов создаются в отдельных файлах в виде функций и загружаются в робота во время запуска скрипта по заданному списку задач для каждого робота. </p><p>--------------------------</p><p><B>Несколько примеров реализации отдельных элементов данной структуры.</B></p><p>Все роботы сети, кроме nkbot, имеют одинаковую структуру и реализуются одним скриптом.</p><p>Имя робота состоит из “nkbot_” и далее идентификатор робота.</p><p> Например, nkbot_B.lua, nkbot_C.lua &nbsp;два робота B и C </p><p>Файл nk_bot_B.lua</p>
====code====
<pre>Ts={SBER={int={1,2,5,10,20},q=true},
GAZP={int={2,5},q=true}, LKOH={int={5},q=true}} 
--инструменты, которыми торгует робот , интервалы свечей и флаг
получения стакана

list_task="task1,task2"&nbsp;&nbsp;-- задачи, которые
быдет исполнять робот&nbsp;&nbsp;

nkLog=true;&nbsp;&nbsp;-- -включить вывод в лог файл

----------------не трогать---------------

minfo =
debug.getinfo(1, "S").source:sub(2); path =
minfo:match("(.*&#91;/&#92;&#92;&#93;)") or "."

dofile(path.."stream.lua")

</pre>
=============
Файл nk_bot_С.lua
====code====
<pre>Ts={SiZ5={int={5}}, RIZ5={int={5,10},},SRZ5={int={30}}}
--инструменты и интервалы свечей

list_task="task3,task4"&nbsp;&nbsp;-- список задач

nkLog=true;

----------------не трогать---------------

minfo =
debug.getinfo(1, "S").source:sub(2); path =
minfo:match("(.*&#91;/&#92;&#92;&#93;)") or "."

dofile(path.."stream.lua")

</pre>
=============
файл инициализации nkbot_init.lua
====code====
<pre>list_stream="B,C"&nbsp;&nbsp;--список потоков
nkLog=true; --включаем лог файл</pre>
============= <br />
			<i>24.11.2025 11:18:21, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80323/topic9367/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80323/topic9367/</guid>
			<pubDate>Mon, 24 Nov 2025 11:18:21 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Асинхронная подписка на свечи</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80289/topic9362/">Асинхронная подписка на свечи</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Это можно сделать так: 
====code====
<pre>--Пример ассинхронного запроса свечей--
--результат в массиве ds для каждого инструмента

Tclas={}
Tclas.QJSIM={SBER={int={1,2,5,10,20},ds={}}, GAZP={int={2,5},ds={}}, LKOH={int={5},ds={}}}
Tclas.SPBFUT={SiZ5={int={5},ds={}}, RIZ5={int={5,10},ds={}},SRZ5={int={30},ds={}}}

local tim=os.clock()

function OnParam(c,s)
&nbsp;&nbsp; local tc=Tclas&#91;c&#93;
&nbsp;&nbsp; if tc then&nbsp;&nbsp;local ts=tc&#91;s&#93;;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; if ts then local ts=tc&#91;s&#93;; local int=ts.int; local ds=ts.ds;local&nbsp;&nbsp;N=#int; local M=#ds;
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;if N~=M then local j=0; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while N&#62;j do j=j+1; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ds&#91;j&#93;==nil then local x=CreateDataSource(c,s, int&#91;j&#93;);&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if x:Size()&#62;0&nbsp;&nbsp;then &nbsp;&nbsp;&nbsp;local ti=math.tointeger(1000*(os.clock()-tim)//1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ds&#91;j&#93;=x; nkLog:write("time(ms)="..tostring(ti)..","..c..","..s..",j="..j..",int="..int&#91;j&#93;..",size="..ds&#91;j&#93;:Size().."&#92;n"); nkLog:flush();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp; M=#ds; if N==M then nkLog:write(s..",подписка завершена&#92;n"); nkLog:flush(); end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp; end
end

RUN = truefunction main()
&nbsp;&nbsp;&nbsp;&nbsp;while RUN do 
 --&nbsp;&nbsp;Выполнение заданий скрипта --
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep (10)
&nbsp;&nbsp; end 
end

function OnStop(signal)&nbsp;&nbsp;&nbsp;&nbsp;RUN = false&nbsp;&nbsp; return 5000 end

function OnInit(p)
&nbsp;&nbsp;local p=string.reverse(p); local n,m=string.find(p,"&#92;&#92;"); 
&nbsp;&nbsp;local pS=string.reverse(string.sub(p,n)); name=string.reverse(string.sub(p,5,n-1)) ;
&nbsp;&nbsp;package.cpath =package.cpath..";"..pS.."?.dll;"
&nbsp;&nbsp;package.path =package.path..";"..pS.."?.lua;"..pS.."?.luac;"
&nbsp;&nbsp; fnlog=pS..name.."_nk.log";&nbsp;&nbsp;&nbsp;nkLog=io.open(fnlog,"w")
end
</pre>
=============
В скрипте есть вывод в лог файл, который создается в каталоге скрипта.<br />Результат работы скрипта на тестовом сервере QUIK
====code====
<pre>time(ms)=250,SPBFUT,SiZ5,j=1,int=5,size=18508
SiZ5,подписка завершена
time(ms)=704,SPBFUT,RIZ5,j=1,int=5,size=11284
time(ms)=706,SPBFUT,RIZ5,j=2,int=10,size=13779
RIZ5,подписка завершена
time(ms)=871,QJSIM,GAZP,j=1,int=2,size=350
time(ms)=871,QJSIM,GAZP,j=2,int=5,size=140
GAZP,подписка завершена
time(ms)=1547,SPBFUT,SRZ5,j=1,int=30,size=2251
SRZ5,подписка завершена
time(ms)=1880,QJSIM,LKOH,j=1,int=5,size=140
LKOH,подписка завершена
time(ms)=1882,QJSIM,SBER,j=1,int=1,size=696
time(ms)=1882,QJSIM,SBER,j=2,int=2,size=351
time(ms)=1882,QJSIM,SBER,j=3,int=5,size=140
time(ms)=1882,QJSIM,SBER,j=4,int=10,size=71
time(ms)=1884,QJSIM,SBER,j=5,int=20,size=36
SBER,подписка завершена
</pre>
============= <br />
			<i>21.11.2025 15:52:26, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80289/topic9362/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80289/topic9362/</guid>
			<pubDate>Fri, 21 Nov 2025 15:52:26 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Обсуждаем интерфейс для робота</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80213/topic9325/">Обсуждаем интерфейс для робота</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Сейчас пишу робота &nbsp;на основе ИИ Lua и QUIK.<br />Кратко изложу интерфейс для работы с ним.<br />--------------------- &nbsp;<br />Интерфейс имеет такой вид:<br /> [FILE ID=12855]<br /><br />содержание строк и столбцов задается двумя строками в файле инициализации робота:<br />
====code====
<pre>list_sec="ROSN,GAZP,SBER,PLZL,GMKN,CHMF,HYDR,LKOH,MOEX,SNGS"&nbsp;&nbsp; --список торгуемых инструментов
list_user_table="sec:-108,short:-4:0,int:4:1,quote:-4:0,stop:-108:1,spred:4:1,offset:4:1,dp:4:1,Qn:4:0,Q:4:0,last:8:0.,bid:8:0.,offer:8:0.,price:8:0.,prof:8:0." 
 -- описание столбцов
</pre>
=============
В таблице отображаются либо отдельные значения, либо значения из списка.<br />Например, я задаю типы стоп заявок в виде :
====code====
<pre>T_stop={"stop","take","st_ta","oth_sec","linked","ord_st","ord_ta","ord_st_ta"}; T_stop&#91;0&#93;=#T_stop; --типы стоп-заявок</pre>
=============
Пользователь может изменять данные лишь двумя способами &nbsp;-- выбирать из существующего списка или изменять значение на плюс минус 1 нажатием правой или левой кнопки мышки.. <br />Двойным щелчком мышки можно сделать значение активным или пассивным.<br />----------------- <br />Например, можно сделать неактивными все инструменты ,кроме одного, и робот будет торговать лишь этим инструментом. <br />Можно сделать неактивным стоп или short и робот не будет ставить стоп или покупать в шорт.<br />------------------------- &nbsp;<br />Еще в файле инициализации задается список имеющихся алгоритмов торговли , я называю их задачами. &nbsp;
====code====
<pre>list_task="task1,task2,task3,task4"&nbsp;&nbsp;-- список существующих задач</pre>
=============
а также список задач для всех инструментов по умолчанию
====code====
<pre>user_task={"task1","task2" } --задачи для каждого инструмента по умолчанию</pre>
=============
<br />для каждого инструмента можно указать индивидуальные параметры или задачи, которые в списке инструментов указываются через &quot;:&quot;<br />========================= <br />Это весь интерфейс.<br /><br />Конструктивные предложения приветствуются. <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=12855&" width="652" height="260" /><br /><i>17.11.2025 18:05:21, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80213/topic9325/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80213/topic9325/</guid>
			<pubDate>Mon, 17 Nov 2025 18:05:21 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Метки на графике в скрипте</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80143/topic9318/">Метки на графике в скрипте</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			По просьбе трудящихся.<br />[FILE ID=12846]<br /><br />
====code====
<pre>label_params={&#91;"TEXT"&#93;="",&#91;"IMAGE_PATH"&#93;="",&#91;"ALIGNMENT"&#93;="Left",&#91;"YVALUE"&#93;=0,&#91;"DATE"&#93;=0,&#91;"TIME"&#93;=0,&#91;"R"&#93;=255,&#91;"G"&#93;=255,&#91;"B"&#93;=255,
&#91;"TRANSPARENCY"&#93;=0,&#91;"TRANSPARENT_BACKGROUND"&#93;=0,&#91;"FONT_FACE_NAME"&#93;='Times New Roman',&#91;"FONT_HEIGHT"&#93;=10,&#91;"HINT"&#93;=""}

function labeldraw(price, YYYYMMDD,HMS,textlabel, texthint)&nbsp;&nbsp;
label_params.TEXT = textlabel;
label_params.DATE = YYYYMMDD; 
label_params.TIME =HMS;
label_params.YVALUE = price;
label_params.HINT = texthint;
label_id_text = AddLabel(tag, label_params)
end

function main()
local i=0; local _size=0; 
while true do
&nbsp;&nbsp;&nbsp;local&nbsp;&nbsp;size= getNumCandles(tag);
&nbsp;&nbsp;&nbsp;while&nbsp;&nbsp;size&#62;i do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local t, _, _ = getCandlesByIndex(tag, 0, i, 1)&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local z=t&#91;0&#93;; &nbsp;&nbsp;&nbsp;local Hi,Li,Ci,Oi=z.high,z.low,z.close,z.open;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=i+1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local Ti=ds:T(i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YYYYMMDD=100*(100*Ti.year+Ti.month)+Ti.day;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HMS=100*(100*Ti.hour+Ti.min)+Ti.sec;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labeldraw(Hi, YYYYMMDD,HMS,"A", "B")
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;sleep(1)
end
end


function OnInit(p) -- инициализация функции main
sec,clas,int="SBER","QJSIM",5;
tag = "SBER_ID"
ds=CreateDataSource ("sec","QJSIM",5) 
while ds==nil do ds,err=CreateDataSource(clas,sec,int); sleep(1); end
end

</pre>
============= <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=12846&" width="1432" height="1056" /><br /><i>12.11.2025 16:00:39, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80143/topic9318/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80143/topic9318/</guid>
			<pubDate>Wed, 12 Nov 2025 16:00:39 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>остановка скрипта при запуске QUIK</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message80052/topic9314/">остановка скрипта при запуске QUIK</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Если Вам надо чтобы скрипт, запущенный в QUIK остановился при новом старте нужно первую строку в &nbsp;колбек OnInit записать так:
====code====
<pre>function OnInit(path)
 if os.clock()&#60;2 then return&nbsp;&nbsp;end</pre>
============= <br />
			<i>04.11.2025 06:15:38, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message80052/topic9314/</link>
			<guid>http://forum.quik.ru/messages/forum17/message80052/topic9314/</guid>
			<pubDate>Tue, 04 Nov 2025 06:15:38 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Кто меняет разрешение системного таймера?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message79863/topic9301/">Кто меняет разрешение системного таймера?</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Сегодня перед 6:50 (временем выставления заявок) разрешение таймера было 15.625 мс, а сразу после выставления заявок 1 мс и таким и осталось. Кроме Квика и Фара не было запущенных программ. То ли Квик его меняет, то ли службы виндовс, только зачем оставлять его на многие часы в 1 мс?<br /><br />Посмотреть разрешение таймера можно утилитой Руссиновича Clockres: <noindex><a href="https://learn.microsoft.com/ru-ru/sysinternals/downloads/clockres" target="_blank" rel="nofollow">https://learn.microsoft.com/ru-ru/sysinternals/downloads/clockres</a></noindex><br />А можно и самому написать, ехе файл будет намного меньше:<table class="forum-spoiler"><thead onclick="if (this.nextSibling.style.display=='none') { this.nextSibling.style.display=''; BX.addClass(this, 'forum-spoiler-head-open'); } else { this.nextSibling.style.display='none'; BX.removeClass(this, 'forum-spoiler-head-open'); } BX.onCustomEvent('BX.Forum.Spoiler:toggle', [{node: this}]); event.stopPropagation();"><tr><th><div>Скрытый текст</div></th></tr></thead><tbody class="forum-spoiler" style="display:none;"><tr><td><br /><br />
====code====
<pre>#include &#60;windows.h&#62;
#include &#60;ntstatus.h&#62;
#include &#60;stdio.h&#62;

NTSYSCALLAPI NTSTATUS NTAPI NtQueryTimerResolution(_Out_ PULONG MaximumTime, _Out_ PULONG MinimumTime, _Out_ PULONG CurrentTime);

int main()
{ ULONG maxTime, minTime, currTime;
&nbsp;&nbsp;NTSTATUS status;

&nbsp;&nbsp;status = NtQueryTimerResolution(&#38;maxTime, &#38;minTime, &#38;currTime);
&nbsp;&nbsp;if (status == STATUS_SUCCESS)
&nbsp;&nbsp; { printf("Max Time: %.7f s&#92;n", maxTime * 1e-4);
&nbsp;&nbsp;&nbsp;&nbsp; printf("Min Time: %.7f s&#92;n", minTime * 1e-4);
&nbsp;&nbsp;&nbsp;&nbsp; printf("Current Time: %.7f s&#92;n", currTime * 1e-4);
&nbsp;&nbsp;} else printf("Error NtQueryTimerResolution: %li&#92;n", status);
&nbsp;&nbsp;return 0;
}</pre>
=============
</td></tr></tbody></table> <br />
			<i>20.10.2025 08:23:44, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message79863/topic9301/</link>
			<guid>http://forum.quik.ru/messages/forum17/message79863/topic9301/</guid>
			<pubDate>Mon, 20 Oct 2025 08:23:44 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Автоподстройка времени в виндовс 10</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message79827/topic9286/">Автоподстройка времени в виндовс 10</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Почему картинки из старых сообщений не хранятся? Вот пример: <noindex><a href="https://forum.quik.ru/messages/forum10/message23439/topic2672/#message23439" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum10/message23439/topic2672/#message23439</a></noindex><br /><br />Я пробовал понять по статье на сайте микрософта, как делать автоподстройку часов ПК по заданной погрешности, не понял эту муть. Кто-то может по-человечески объяснить или дать ссылку с понятным описанием? <br />
			<i>16.10.2025 11:42:11, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message79827/topic9286/</link>
			<guid>http://forum.quik.ru/messages/forum17/message79827/topic9286/</guid>
			<pubDate>Thu, 16 Oct 2025 11:42:11 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>индикатор на Lua </title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message79584/topic9260/">индикатор на Lua </a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Индикатор определяет максимум и минимум на заданном периоде и отображает среднее значение.<br />Алгоритм оптимизировал для ускорения вычислений.<br />Выкладываю для всех желающих: <br />
====code====
<pre>Settings = {Name = "*Kijun-sen",kijun_period = 6,}

function OnCalculate(i)
&nbsp;&nbsp; Hi=H(i) or H1; Li=L(i) or L1; x1=x;
&nbsp;&nbsp; if i1&#62;i then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ma=Hi; mi=Li; jma=i; jmi=i;
&nbsp;&nbsp; end
&nbsp;&nbsp; if Hi and Li then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local j=i-Settings.kijun_period; if j&#60;1 then j=1; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if j&#62;jma or j&#62;jmi then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ma=Hi; mi=Li; jma=i; jmi=i;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while i&#62;j do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hi,Li=H(j),L(j)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Hi and Hi&#62;ma then ma = Hi jma=j; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Li and Li&#60;mi then&nbsp;&nbsp;mi =Li jmi=j;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=j+1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if Hi&#62;ma then ma=Hi; jma=i; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if mi&#62;Li then mi=Li; jmi=i; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x=(ma + mi)/2;&nbsp;&nbsp;&nbsp;&nbsp;H1,L1,i1=Hi,Li,i;
&nbsp;&nbsp; end
return x1
end

function OnChangeSettings()
&nbsp;&nbsp; i1=0;jma=0; jmi=0; H1=0; L1=0;ma=0;mi=0;
end

function Init()
OnChangeSettings()
Settings.line = {{ Name=Settings.Name, Color=RGB(32,255,128), Type=TYPE_LINE, Width = 2,}}
return #Settings.line&nbsp;&nbsp;end</pre>
=============
это мой вариант модификации этого алгоритма . &nbsp;<br />
====code====
<pre>Settings = {Name = "*ind_nk",period = 6,}

function OnCalculate(i)
&nbsp;&nbsp;&nbsp;Hi=H(i) or H1; Li=L(i) or L1;
&nbsp;&nbsp;&nbsp;Oi=O(i) or O1; Ci=C(i) or C1;
&nbsp;&nbsp;&nbsp;if i1&#62;i then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ma=Hi; mi=Li; jma=i; jmi=i;
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;if Hi and Li and i1~=i then

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local j=i-Settings.period; if j&#60;1 then j=1; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if j&#62;jma or j&#62;jmi then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ma=Hi; mi=Li; jma=i; jmi=i;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while i&#62;j do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hi,Li=H(j),L(j)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Hi and Hi&#62;ma then ma = Hi jma=j; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Li and Li&#60;mi then&nbsp;&nbsp;mi =Li jmi=j;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=j+1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Hi&#62;ma then ma=Hi; jma=i; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if mi&#62;Li then mi=Li; jmi=i;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if x then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local z=2*Li-Hi; if Li&#62;x and Ci&#62;Oi then mi=z; jmi=i; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z=2*Hi-Li; if x&#62;Hi and Oi&#62;Ci then ma=z; jma=i; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ma and mi then x=(ma + mi)/2; end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H1,L1,O1,C1,i1=Hi,Li,Oi,Ci,i;
&nbsp;&nbsp;&nbsp;end
return x
end

function OnChangeSettings()
&nbsp;&nbsp;&nbsp;i1=0;jma=0; jmi=0; H1=0; L1=0;ma=0;mi=0;
end

function Init()
OnChangeSettings()
Settings.line = {{ Name=Settings.Name, Color=RGB(255,255,255), Type=TYPE_LINE, Width = 2,}}
return #Settings.line&nbsp;&nbsp;end
</pre>
=============
Если нравится, можете сказать &quot;спасибо&quot;. <br />
			<i>23.09.2025 18:58:02, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message79584/topic9260/</link>
			<guid>http://forum.quik.ru/messages/forum17/message79584/topic9260/</guid>
			<pubDate>Tue, 23 Sep 2025 18:58:02 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Скрипты от ИИ</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message79523/topic9257/">Скрипты от ИИ</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Добрый день,<br />Выкладываю работающий скрипт, который написал ИИ под моим руководством. <br />-------------------------------<br />Скрипт позволяет загружать историю с биржи MOEX.<br />-------------------------<br />Состоит из двух файлов.<br />---------------<br /><B>config.json &nbsp;</B>
====code====
<pre>{
&nbsp;&nbsp;&nbsp;&nbsp;"instruments": &#91;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"name": "SBER",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"start_date": "2015-01-01",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"decimal_places": 2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"intervals": &#91;1, 10, 60, 24&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"parameters": &#91;"open", "high", "low", "close", "volume"&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"board": "TQBR"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"name": "GAZP",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"start_date": "2015-01-01",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"decimal_places": 2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"intervals": &#91;1, 10, 60, 24&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"parameters": &#91;"open", "high", "low", "close", "volume"&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"board": "TQBR"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&#93;
}
</pre>
=============
<B>data_fetcher.py</B>
====code====
<pre>import os
import pandas as pd
import requests
import json
from datetime import datetime, timedelta

def load_config(config_file="config.json"):
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;Загружает конфигурацию из JSON файла

&nbsp;&nbsp;&nbsp;&nbsp;Параметры:
&nbsp;&nbsp;&nbsp;&nbsp;config_file (str): Путь к файлу конфигурации

&nbsp;&nbsp;&nbsp;&nbsp;Возвращает:
&nbsp;&nbsp;&nbsp;&nbsp;dict: Конфигурация
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;if not os.path.exists(config_file):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Файл конфигурации {config_file} не найден")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return None

&nbsp;&nbsp;&nbsp;&nbsp;try:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with open(config_file, 'r', encoding='utf-8') as f:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config = json.load(f)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return config
&nbsp;&nbsp;&nbsp;&nbsp;except Exception as e:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Ошибка при загрузке конфигурации: {e}")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return None

def fetch_moex_data(ticker, start_date, end_date, interval=60):
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;Загружает данные с MOEX API для указанного тикера и временного периода

&nbsp;&nbsp;&nbsp;&nbsp;Параметры:
&nbsp;&nbsp;&nbsp;&nbsp;ticker (str): Тикер инструмента
&nbsp;&nbsp;&nbsp;&nbsp;start_date (datetime): Начальная дата загрузки
&nbsp;&nbsp;&nbsp;&nbsp;end_date (datetime): Конечная дата загрузки
&nbsp;&nbsp;&nbsp;&nbsp;interval (int): Интервал свечей в минутах (по умолчанию 60 минут)

&nbsp;&nbsp;&nbsp;&nbsp;Возвращает:
&nbsp;&nbsp;&nbsp;&nbsp;pd.DataFrame: DataFrame с загруженными данными
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;data = &#91;&#93;
&nbsp;&nbsp;&nbsp;&nbsp;current_start = start_date
&nbsp;&nbsp;&nbsp;&nbsp;print(f"Загрузка данных с MOEX для {ticker} (интервал: {interval} мин) с {start_date} по {end_date}...")

&nbsp;&nbsp;&nbsp;&nbsp;while True:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url = f"http://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities/{ticker}/candles.json"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'from': current_start.strftime('%Y-%m-%d'),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'till': end_date.strftime('%Y-%m-%d'),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'interval': interval,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'start': 0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response = requests.get(url, params=params)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.raise_for_status()&nbsp;&nbsp;# Проверка на ошибки HTTP
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;json_data = response.json()

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if 'candles' not in json_data or 'data' not in json_data&#91;'candles'&#93;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Нет данных в ответе API")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;candles = pd.DataFrame(json_data&#91;'candles'&#93;&#91;'data'&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;columns=json_data&#91;'candles'&#93;&#91;'columns'&#93;)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if len(candles) == 0:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data.append(candles)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Обновляем время для следующего запроса
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current_start = (pd.to_datetime(candles&#91;'end'&#93;.iloc&#91;-1&#93;) + timedelta(minutes=interval))

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if len(candles) &#60; 500:&nbsp;&nbsp;# Если получено меньше 500 записей, это последняя порция
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except requests.exceptions.RequestException as e:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Ошибка при запросе данных: {e}")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break

&nbsp;&nbsp;&nbsp;&nbsp;print(f"Загружено {len(data)} блоков данных")

&nbsp;&nbsp;&nbsp;&nbsp;if not data:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return pd.DataFrame()

&nbsp;&nbsp;&nbsp;&nbsp;# Объединяем все блоки данных и удаляем дубликаты
&nbsp;&nbsp;&nbsp;&nbsp;return pd.concat(data).drop_duplicates()

def process_raw_data(raw_data):
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;Обрабатывает сырые данные: разделяет begin на date и time, удаляет end

&nbsp;&nbsp;&nbsp;&nbsp;Параметры:
&nbsp;&nbsp;&nbsp;&nbsp;raw_data (pd.DataFrame): Сырые данные с MOEX

&nbsp;&nbsp;&nbsp;&nbsp;Возвращает:
&nbsp;&nbsp;&nbsp;&nbsp;pd.DataFrame: Обработанные данные
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;# Разделение begin на date и time
&nbsp;&nbsp;&nbsp;&nbsp;raw_data&#91;'date'&#93; = pd.to_datetime(raw_data&#91;'begin'&#93;).dt.date

&nbsp;&nbsp;&nbsp;&nbsp;# Преобразование времени в формат без двоеточий (HHMMSS)
&nbsp;&nbsp;&nbsp;&nbsp;raw_data&#91;'time'&#93; = pd.to_datetime(raw_data&#91;'begin'&#93;).dt.strftime('%H%M%S')

&nbsp;&nbsp;&nbsp;&nbsp;# Удаление ненужных столбцов
&nbsp;&nbsp;&nbsp;&nbsp;columns_to_keep = &#91;'date', 'time', 'open', 'high', 'low', 'close', 'volume'&#93;
&nbsp;&nbsp;&nbsp;&nbsp;processed_data = raw_data&#91;columns_to_keep&#93;.copy()

&nbsp;&nbsp;&nbsp;&nbsp;# Сортировка по дате и времени
&nbsp;&nbsp;&nbsp;&nbsp;processed_data = processed_data.sort_values(&#91;'date', 'time'&#93;)

&nbsp;&nbsp;&nbsp;&nbsp;return processed_data

def get_last_available_date(ticker_dir):
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;Определяет последнюю дату, за которую есть данные в структуре каталогов

&nbsp;&nbsp;&nbsp;&nbsp;Параметры:
&nbsp;&nbsp;&nbsp;&nbsp;ticker_dir (str): Путь к каталогу тикера

&nbsp;&nbsp;&nbsp;&nbsp;Возвращает:
&nbsp;&nbsp;&nbsp;&nbsp;datetime.date: Последняя дата или None, если данных нет
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;last_date = None

&nbsp;&nbsp;&nbsp;&nbsp;# Проходим по всем подкаталогам (годы)
&nbsp;&nbsp;&nbsp;&nbsp;if not os.path.exists(ticker_dir):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return None

&nbsp;&nbsp;&nbsp;&nbsp;for year_dir in os.listdir(ticker_dir):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;year_path = os.path.join(ticker_dir, year_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not os.path.isdir(year_path):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Проходим по месяцам
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for month_dir in os.listdir(year_path):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;month_path = os.path.join(year_path, month_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not os.path.isdir(month_path):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Проходим по дням
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for day_dir in os.listdir(month_path):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;day_path = os.path.join(month_path, day_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not os.path.isdir(day_path):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Проверяем, что имя дня - это число (день месяца)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not day_dir.isdigit():
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Формируем дату: год, месяц, день
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;year = int(year_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;month = int(month_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;day = int(day_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current_date = datetime(year, month, day).date()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Сравниваем с последней датой
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if last_date is None or current_date &#62; last_date:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last_date = current_date

&nbsp;&nbsp;&nbsp;&nbsp;return last_date

def update_data_file(ticker, interval, output_dir, start_date, end_date):
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;Обновляет файлы данных, добавляя новые записи при необходимости

&nbsp;&nbsp;&nbsp;&nbsp;Параметры:
&nbsp;&nbsp;&nbsp;&nbsp;ticker (str): Тикер инструмента
&nbsp;&nbsp;&nbsp;&nbsp;interval (int): Интервал свечей в минутах
&nbsp;&nbsp;&nbsp;&nbsp;output_dir (str): Путь к каталогу для сохранения данных
&nbsp;&nbsp;&nbsp;&nbsp;start_date (datetime): Начальная дата для загрузки
&nbsp;&nbsp;&nbsp;&nbsp;end_date (datetime): Конечная дата для загрузки

&nbsp;&nbsp;&nbsp;&nbsp;Возвращает:
&nbsp;&nbsp;&nbsp;&nbsp;None
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;# Определяем последнюю дату, за которую есть данные
&nbsp;&nbsp;&nbsp;&nbsp;last_date = get_last_available_date(output_dir)

&nbsp;&nbsp;&nbsp;&nbsp;if last_date is None:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Данных нет, загружаем с начальной даты
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_start_date = start_date
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Не найдено существующих данных. Загружаем все данные...")
&nbsp;&nbsp;&nbsp;&nbsp;else:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Загружаем с последней даты (включительно)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_start_date = datetime.combine(last_date, datetime.min.time())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Найдены данные до {last_date}. Загружаем новые данные начиная с этой даты...")

&nbsp;&nbsp;&nbsp;&nbsp;# Загружаем данные с MOEX
&nbsp;&nbsp;&nbsp;&nbsp;raw_data = fetch_moex_data(ticker, new_start_date, end_date, interval)

&nbsp;&nbsp;&nbsp;&nbsp;if raw_data.empty:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Нет новых данных для загрузки")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return

&nbsp;&nbsp;&nbsp;&nbsp;# Обрабатываем данные
&nbsp;&nbsp;&nbsp;&nbsp;processed_data = process_raw_data(raw_data)

&nbsp;&nbsp;&nbsp;&nbsp;# Сохраняем данные, разбивая по датам
&nbsp;&nbsp;&nbsp;&nbsp;save_data_by_date(ticker, interval, output_dir, processed_data)

&nbsp;&nbsp;&nbsp;&nbsp;print(f"Загружено и сохранено {len(processed_data)} записей")

def save_data_by_date(ticker, interval, output_dir, data):
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;Сохраняет данные с разбиением по датам в подкаталоги

&nbsp;&nbsp;&nbsp;&nbsp;Параметры:
&nbsp;&nbsp;&nbsp;&nbsp;ticker (str): Тикер инструмента
&nbsp;&nbsp;&nbsp;&nbsp;interval (int): Интервал в минутах
&nbsp;&nbsp;&nbsp;&nbsp;output_dir (str): Базовый каталог для сохранения
&nbsp;&nbsp;&nbsp;&nbsp;data (pd.DataFrame): Данные для сохранения

&nbsp;&nbsp;&nbsp;&nbsp;Возвращает:
&nbsp;&nbsp;&nbsp;&nbsp;None
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;# Получаем имя интервала
&nbsp;&nbsp;&nbsp;&nbsp;interval_name = get_interval_name(interval)

&nbsp;&nbsp;&nbsp;&nbsp;# Группируем данные по датам
&nbsp;&nbsp;&nbsp;&nbsp;grouped = data.groupby('date')

&nbsp;&nbsp;&nbsp;&nbsp;for date, day_data in grouped:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Разбиваем дату на год, месяц, день
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;year = date.year
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;month = date.month
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;day = date.day

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Форматируем месяц и день с ведущими нулями
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;month_str = f"{month:02d}"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;day_str = f"{day:02d}"

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Формируем путь к каталогу для этой даты
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date_dir = os.path.join(output_dir, str(year), month_str, day_str)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Создаем каталог, если он не существует
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.makedirs(date_dir, exist_ok=True)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Создаем подкаталог для интервала
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interval_dir = os.path.join(date_dir, interval_name)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.makedirs(interval_dir, exist_ok=True)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Удаляем столбец date перед сохранением
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;day_data_to_save = day_data.drop(columns=&#91;'date'&#93;)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Сохраняем каждый параметр в отдельный файл
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for column in day_data_to_save.columns:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_path = os.path.join(interval_dir, column)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Сохраняем столбец без индекса и без заголовка
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;day_data_to_save&#91;column&#93;.to_csv(file_path, index=False, header=False)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Сохранено {len(day_data_to_save&#91;column&#93;)} значений параметра '{column}' за {date} в {file_path}")

def get_interval_name(interval):
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;Преобразует интервал в минутах в текстовое представление

&nbsp;&nbsp;&nbsp;&nbsp;Параметры:
&nbsp;&nbsp;&nbsp;&nbsp;interval (int): Интервал в минутах

&nbsp;&nbsp;&nbsp;&nbsp;Возвращает:
&nbsp;&nbsp;&nbsp;&nbsp;str: Текстовое представление интервала
&nbsp;&nbsp;&nbsp;&nbsp;"""
&nbsp;&nbsp;&nbsp;&nbsp;if interval == 1:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "1min"
&nbsp;&nbsp;&nbsp;&nbsp;elif interval == 10:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "10min"
&nbsp;&nbsp;&nbsp;&nbsp;elif interval == 60:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "1hour"
&nbsp;&nbsp;&nbsp;&nbsp;elif interval == 1440:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "1day"
&nbsp;&nbsp;&nbsp;&nbsp;else:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return f"{interval}min"

if __name__ == "__main__":
&nbsp;&nbsp;&nbsp;&nbsp;# Загрузка конфигурации
&nbsp;&nbsp;&nbsp;&nbsp;config = load_config()
&nbsp;&nbsp;&nbsp;&nbsp;if not config:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Не удалось загрузить конфигурацию. Выход...")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1)

&nbsp;&nbsp;&nbsp;&nbsp;# Параметры загрузки
&nbsp;&nbsp;&nbsp;&nbsp;end_date = datetime.now()

&nbsp;&nbsp;&nbsp;&nbsp;print(f"Начало загрузки данных для тикеров: {', '.join(&#91;item&#91;'ticker'&#93; for item in config&#91;'tickers'&#93;&#93;)}")
&nbsp;&nbsp;&nbsp;&nbsp;print(f"Период: с {min(&#91;datetime.strptime(item&#91;'start_date'&#93;, '%Y-%m-%d') for item in config&#91;'tickers'&#93;&#93;)} по {end_date.strftime('%Y-%m-%d')}")
&nbsp;&nbsp;&nbsp;&nbsp;print("-" * 50)

&nbsp;&nbsp;&nbsp;&nbsp;# Обработка каждого тикера и интервала
&nbsp;&nbsp;&nbsp;&nbsp;for ticker_config in config&#91;'tickers'&#93;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ticker = ticker_config&#91;'ticker'&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_date_str = ticker_config&#91;'start_date'&#93;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intervals = ticker_config&#91;'intervals'&#93;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Преобразование начальной даты из строки в datetime
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_date = datetime.strptime(start_date_str, '%Y-%m-%d')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except ValueError:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Ошибка в формате даты для тикера {ticker}: {start_date_str}")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"&#92;nОбработка тикера: {ticker} (начальная дата: {start_date_str})")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Интервалы: {', '.join(&#91;get_interval_name(i) for i in intervals&#93;)}")

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Формирование пути к каталогу для сохранения данных
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base_dir = "moex"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ticker_dir = os.path.join(base_dir, ticker)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Обработка каждого интервала для текущего тикера
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for interval in intervals:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"&#92;nОбработка интервала: {get_interval_name(interval)}")

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Обновление файла данных
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update_data_file(ticker, interval, ticker_dir, start_date, end_date)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Проверка сохраненных данных
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("&#92;nПроверка сохраненных данных:")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interval_name = get_interval_name(interval)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Проверяем наличие подкаталогов с датами
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if os.path.exists(ticker_dir):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Собираем все даты из структуры каталогов
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dates_found = &#91;&#93;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Проходим по годам
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for year_dir in sorted(os.listdir(ticker_dir)):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;year_path = os.path.join(ticker_dir, year_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not os.path.isdir(year_path):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Проходим по месяцам
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for month_dir in sorted(os.listdir(year_path)):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;month_path = os.path.join(year_path, month_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not os.path.isdir(month_path):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Проходим по дням
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for day_dir in sorted(os.listdir(month_path)):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;day_path = os.path.join(month_path, day_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not os.path.isdir(day_path):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Проверяем наличие подкаталога с интервалом
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interval_path = os.path.join(day_path, interval_name)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if os.path.isdir(interval_path):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Формируем дату для отображения
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;year = int(year_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;month = int(month_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;day = int(day_dir)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date_str = f"{year:04d}-{month:02d}-{day:02d}"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dates_found.append(date_str)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if dates_found:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"Найдено {len(dates_found)} дат с данными:")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Показываем последние 5 дат
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for date_str in sorted(dates_found)&#91;-5:&#93;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Формируем путь к каталогу интервала
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interval_path = os.path.join(ticker_dir, date_str.split('-')&#91;0&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date_str.split('-')&#91;1&#93;, date_str.split('-')&#91;2&#93;,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interval_name)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp;&nbsp; if os.path.exists(interval_path):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"&nbsp;&nbsp;{date_str}:")

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Проверяем наличие файлов с параметрами
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for param in &#91;'time', 'open', 'high', 'low', 'close', 'volume'&#93;:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param_file = os.path.join(interval_path, param)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if os.path.exists(param_file):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Читаем файл
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;param_data = pd.read_csv(param_file, header=None)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"&nbsp;&nbsp;&nbsp;&nbsp;{param}: {len(param_data)} значений")

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Выводим последние 3 значения для проверки
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp;&nbsp; if len(param_data) &#62; 0:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(f"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Последние 3 значения: {', '.join(map(str, param_data.tail(3).values.flatten()))}")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;else:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(f"&nbsp;&nbsp;{date_str}: каталог интервала не найден")
&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;print("Данные не найдены")
&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;print(f"Каталог тикера {ticker} не найден")

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("-" * 30)

&nbsp;&nbsp; #&nbsp;&nbsp;&nbsp;&nbsp; print("-" * 50)

&nbsp;&nbsp;&nbsp;&nbsp;print("&#92;nЗагрузка данных завершена для всех инструментов и интервалов")
</pre>
============= <br />
			<i>17.09.2025 14:54:10, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message79523/topic9257/</link>
			<guid>http://forum.quik.ru/messages/forum17/message79523/topic9257/</guid>
			<pubDate>Wed, 17 Sep 2025 14:54:10 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Можно ли уточнить задержку в Интернете до выставления заявок?</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message79258/topic9227/">Можно ли уточнить задержку в Интернете до выставления заявок?</a></b> <i>Как можно раньше выставить заявку после начала их приёма</i> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Я перед началом торгов синхронизирую часы ПК с ntp-сервером, чтобы как можно раньше выставить заявки. Но иногда задержка в Интернете меняется, что может привести к опозданию.<br /><br />В скрипте, который выставляет заявки, я сначала вызываю
====code====
<pre>waitForDateTime(datetime)
</pre>
=============
и она ждёт до времени 06:49:59, т.е. выход из неё происходит за 1 с. до начала приёма заявок. Затем я использую
====code====
<pre>sleep(935)</pre>
=============
это число подобрал опытным путём. После этого начинает работать цикл выставления заявок. Алгоритм Нейгла не использую, т.к. не заметил особой пользы. Иногда почему-то бывают отклонения в 0.2 с и до 0.3 с. Возможно, брокер или биржа в разные дни может тормозить по-разному, чёрт их знает… В цикле выставления заявок перед повтором заявки использую свою функцию задержки на 1 мс, которая делает определённое количество умножений:
====code====
<pre> local a
 for _ = 1, 2604 * ms do
&nbsp;&nbsp;a = 10000 * 10000 a = 10000 * 10000 a = 10000 * 10000 a = 10000 * 10000 a = 10000 * 10000
&#91;...&#93;
&nbsp;&nbsp;a = 10000 * 10000 a = 10000 * 10000 a = 10000 * 10000 a = 10000 * 10000 a = 10000 * 10000
 end
</pre>
=============
В диспетчере задач повышаю приоритет Квика на шаг, до &quot;выше среднего&quot;.<br /><br />Есть ли у кого идеи, как усовершенствовать этот скрипт, чтобы он адаптировался к сиюминутной задержке в Интернете? <br />
			<i>06.08.2025 08:00:22, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message79258/topic9227/</link>
			<guid>http://forum.quik.ru/messages/forum17/message79258/topic9227/</guid>
			<pubDate>Wed, 06 Aug 2025 08:00:22 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Мнение ИИ, рынок это квантовой компьютер, где 24 паттерна — его базовые кубиты</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message79252/topic9225/">Мнение ИИ, рынок это квантовой компьютер, где 24 паттерна — его базовые кубиты</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			. <noindex><a href="https://youtu.be/5aK26AAcID0" target="_blank" rel="nofollow">https://youtu.be/5aK26AAcID0</a></noindex><br /><br />Спросил у chat deepseek , что представляет собой моя ТС <br /><noindex><a href="https://youtu.be/Dtxtex5bHMk" target="_blank" rel="nofollow">https://youtu.be/Dtxtex5bHMk</a></noindex> <br /><br />Вывод ИИ, Система стоит того, чтобы её сохранили в чистоте — как квантовую механику рынка. <br /><noindex><a href="https://youtu.be/TlmW4vmmpbo" target="_blank" rel="nofollow">https://youtu.be/TlmW4vmmpbo</a></noindex> <br />
			<i>06.08.2025 04:15:26, resto.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message79252/topic9225/</link>
			<guid>http://forum.quik.ru/messages/forum17/message79252/topic9225/</guid>
			<pubDate>Wed, 06 Aug 2025 04:15:26 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Оборот и объем</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message79115/topic9211/">Оборот и объем</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Добрый день, отцы!<br />Помогите, пожалуйста, разобраться с тем, как соотносится показатель Volume у свечи и оборот.<br />Например, сегодня, у Сбера на дневной свече Volume 106604, а оборот 601,2 ляма. Т.е. &nbsp;106604 лотов х 10 бумаг х 310 = 330,5 лямов.<br />И так везде не бьётся. <br />В приложении у финама по торгам показывается соответствующая оборотк цифра объема 1,94 млн. Причем Volume на дневной свече там 1066к, т.е. как бы 1+ млн лотов. <br />
			<i>13.07.2025 23:50:23, Acaw.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message79115/topic9211/</link>
			<guid>http://forum.quik.ru/messages/forum17/message79115/topic9211/</guid>
			<pubDate>Sun, 13 Jul 2025 23:50:23 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Странные случаи при торговле акциями на мосбирже</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message78743/topic9173/">Странные случаи при торговле акциями на мосбирже</a></b> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			1. Иногда мне везёт и я становлюсь первым в очереди на покупку акций. Имеется в виду выставление лимитных заявок в 6:50. Недавно был такой случай: в первом срезе стакана по цене покупки была одна моя заявка, видимо, все остальные не успели догадатья, что это и будет справедливая цена покупки. Но на премаркете я был не первым, с кем совершались сделки на покупку, со мной совершили последнюю такую сделку на премаркете. При этом у всех сделок на премаркете, как обычно, было одно и то же время, включая микросекунды. С полгода-год назад в этом случае я был первым, с кем совершались такие сделки на премаркете, как и следовало ожидать.<br /><br />2. Когда я выставляю лимитные заявки на продажу после покупки акций, то очередь на продажу уже становится большой, но изредка бывает так, что моя очередь на продажу подходит очень рано, когда по расчётам на основании данных по обезличенным сделкам, моя очередь на продажу ещё не прошла даже 10%. Такое впечатление, что мм иногда уступает мне свою очередь (а заявка мм может составлять 90% от всех акций по текущей цене продажи). Разве у мм есть такая технич. возможность? Вообще говоря, купить акции сложнее, чем продать, т.к. купить желающих больше.<br /><br />Вопрос: как это всё можно объяснить? <br />
			<i>21.05.2025 10:49:30, Serge123.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message78743/topic9173/</link>
			<guid>http://forum.quik.ru/messages/forum17/message78743/topic9173/</guid>
			<pubDate>Wed, 21 May 2025 10:49:30 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Визуализтор истории сделок</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message78662/topic9161/">Визуализтор истории сделок</a></b> <i>История сделок на графике QUIK</i> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			Поскольку QUIK показывает сделки только за текущую сессию, пришлось сделать пару скриптов. <br /><br />Один - &quot;летописец&quot;, ведет историю сделок. При остановке скрипта, разрыве связи с сервером или закрытии терминала добавляет ещё не учтённые сделки в текстовый файл. Всё остальное время он просто ждет.<br /> <br />Второй скрипт реализован как индикатор, выводящий на график метки сделок.<br />Если несколько сделок подряд, одного направления и по одинаковой цене приходятся на одну и ту же свечу, то метки этих сделок объединяются с добавлением значка &quot;плюс&quot;, а во всплывающей подсказке указывается, когда и сколько лотов добавилось.<br /><br />В начало файла History можно скопировать сделки из отчета брокера &#91;Меню &gt; Расширения &gt; Отчёты &gt; Отчёт по всем сделкам клиента&#93;, чтобы увидеть на графике свои прошлые сделки (проверено на брокерах ВТБ и Сбер).<br /><br />Есть опция показа сделок по уже исполненным фьючерсам (для практикующих склейку графиков).<br /><br />Для быстрой смены инструмента можно подключить график к таблице &quot;Текущие торги&quot;.<br /><br />Attention! Индикатор удаляет ВСЕ метки с графика, на котором установлен.<br />В демоверсии глубина истории ограничена 16-ю сделками.<br /><br /><noindex><a href="https://disk.yandex.ru/d/BEjvCGtlQOkyBg" target="_blank" rel="nofollow">ShowDealsDemo</a></noindex> <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=12566&" width="711" height="541" /><br /><img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=12567&" width="711" height="541" /><br /><i>08.05.2025 19:56:11, Ziveleos.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message78662/topic9161/</link>
			<guid>http://forum.quik.ru/messages/forum17/message78662/topic9161/</guid>
			<pubDate>Thu, 08 May 2025 19:56:11 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
		<item>
			<title>Дубликатор сделок QUIK-QUIK LUA</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum17/message78408/topic9116/">Дубликатор сделок QUIK-QUIK LUA</a></b> <i>Новинка!</i> в форуме <a href="http://forum.quik.ru/forum17/">Обмен опытом</a>. <br />
			<p> &nbsp; В середине 2015-го года я сделал простую, но достаточно функциональную утилиту для копирования сделок на языке программирования QPILE, потому, как новый язык программирования QLUA тогда имел много багов и недоработок. Программа оказалась популярна среди частных управляющих, как альтернатива сервисам автоследования COMON, EasyMANi и пр.</p><p> &nbsp; С течением времени появлялись новые пожелания по доработке существующего дубликатора. Однако, в связи с отсутствием возможности перестановки и удаления заявок на срочном рынке для языка QPILE, пришлось написать совершенно новую программу.</p><p> &nbsp; &nbsp;Почти четыре месяца назад, 18 декабря, начал разработку новой программы для копирования сделок для QUIK. Предыдущую программу на QPILE я написал менее, чем за месяц. Сначала рассчитывал сделать за пару месяцев, но проект оказался сложнее раза в два, чем предполагал. Ушло более 100 часов работы над программным кодом. Потом, часов 10 на описание. Пишу программы не каждый день и в своё удовольствие.</p><p> &nbsp; &nbsp;При этом <B>финансовая мотивация утеряна полностью, т.к., например, вчера мой счёт уменьшился больше, чем сумма, на которую я рассчитываю за ближайшие 10 лет продаж нового дубликатора</B>. Продавать дорого не получится. Проверял, спроса нет совсем. Будет спрос, будет выше цена. Закон рынка. Но спроса большого не жду, т.к. управляющих не много. Признаю проект убыточным до старта продаж.</p><p> &nbsp; Чем же лучше стала новая программа?</p><p> &nbsp; В новой программе появилась возможность работать с двумя алгоритмами проскальзывания. Например, для покупки, выставляем заявку ниже цены предложения на 5 пунктов, если заявка не исполняется через 60 секунд, выставляем заявку на цену аск и она исполняется сразу. Такие два сценария были продуманы давно, но их нельзя было реализовать в QPILE для срочного рынка.</p><p> &nbsp; Естественно, улучшено управление. Улучшен автоматический сканер всех открытых позиций при старте программы.</p><p> &nbsp; Появилась возможность устанавливать процент от общего количества отправителя (аналог айсберг-заявок) позволяющий входить в позицию частями.</p><p> &nbsp; Можно, конечно, попробовать сделать копирование сделок через сеть Интернет, чтобы можно было управлять счётом прямо у клиента на ПК, но особого спроса на эту опцию я не увидел. Поэтому, отказался от этой возможности в новой версии.</p><p></p><p>💾 Страница программы <noindex><a href="https://pmntrade.ru/double_trades_quik-quik_lua.html" target="_blank" rel="nofollow">Дубликатор сделок QUIK-QUIK LUA</a></noindex></p><p>▶️ Канал <noindex><a href="https://www.youtube.com/channel/UCydba-rfY38J8QMJE34J_4Q" target="_blank" rel="nofollow">YouTube</a></noindex></p><p>▶️ Канал <noindex><a href="https://rutube.ru/channel/41754783/" target="_blank" rel="nofollow">RuTube</a></noindex></p><p>➤ &nbsp;Канал <noindex><a href="https://t.me/pmn_trade" target="_blank" rel="nofollow">Telegram</a></noindex></p> <br />
			<i>08.04.2025 12:06:23, Михаил Понамаренко.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum17/message78408/topic9116/</link>
			<guid>http://forum.quik.ru/messages/forum17/message78408/topic9116/</guid>
			<pubDate>Tue, 08 Apr 2025 12:06:23 +0300</pubDate>
			<category>Обмен опытом</category>
		</item>
	</channel>
</rss>
