nikolz (Автор тем)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 След.
Уменьшаю время локальной загрузки QUIK до нуля.- Это просто.
 
Преамбула:
Раньше неоднократно пытался перейти на новые версии терминала, но получение тормозов при старте, и не только, терминала возвращало меня  на версию 8.7
-----------------
Неделю назад Сбербанк без объявления перевел своих клиентов на единый брокерский счет,
что привело к необходимости установить версию 12 без вариантов.
---------------
В конечном итоге пришлось установить версию 12.8.3.4 из установочного пакета разработчиков, так как Сбербанк пока предлагает более глючную версию 12.6
------------------
Сегодня на хабре написал статью, в которой  привел высказывание автора Claude Code:
«Мы начинаем видеть мир, в котором клиент жалуется на что-то, а проблема решается за считанные минуты, — сказал он.
-------------------
Надеюсь, что когда-то и разработчики QUIK достигнут это.
-------------------
Но пока актуальным является высказывание Остапа Бендера:"Спасение утопающих - дело рук самих утопающих"
-----------------------
Поэтому, познав все прелести 6-8 минутной загрузки терминала был вынужден решать эту проблему самостоятельно.
--------------
Решение:
Свои результаты и рекомендации размещаю на этом форуме.
Я никого не заставляю делать так, как делаю сам.
Я лишь рассказываю что и как делаю и что из этого получилось.
================
В результате исследований мне удалось уменьшить время загрузки с 240...320 сек до 110 секунд.
Из этих 110 секунд 70 секунд тратится на локальную загрузку терминала.
Для тех, кто не читал мой пост по этой проблеме, поясняю:
----------------
Процесс старта терминала QUIK условно разделяю на три этапа
1) загрузка терминала на основе сохраненной на ПК информации до подключения к серверу брокера
2) ввод логина и пароля и подключение к серверу
3) ввод кода со смартфона для двухфакторной аутентификации и получения текущей информации с сервера.
======================
В этой теме рассказываю как сделал время первого этапа равным нулю.
--------------------------------
Это можно сделать, если есть свободное место на жестком диске в размере объема памяти на ПК.
Для этого  включаю на  ПК либо гибридный режим сна, либо режим Гибернации. Предпочитаю Гибернацию.
Режим гибридного сна отличается от режима сна тем, что образ памяти сохраняется на диске и это позволяет восстановить состояние ПК при выходе из сна после отключения сетевого питания.
-----------------
Режим Гибернации отличается от режима сна тем, что ПК полностью выключается, как обычно.
Но перед выключением ОС запишет на диск образ памяти и загрузит его при включении.
--------------------
Это не только исключает локальную загрузку QUIK, но и сокращает загрузку Windows.
=============
При этом последовательность действий такая.
Надо не закрывать QUIK, а лишь разорвать соединение с сервером.
Перевести ПК в режим Гибернации.
---------------------
После включения получаю состояние ПК в момент выключения
и перехожу ко 2-ому этапу загрузки терминала QUIK.
Уменьшить объем памяти и время старта QUIK-это просто
 
Всем, добрый день,
--------------------
Ранее я уже писал, что в старте  терминала QUIK условно можно выделить 3 этапа.
------------
Первый - автономная загрузка терминала до момента запроса пароля.
Второй - ожидание кода авторизации со смартфона
Третий - загрузка с сервера брокера текущего состояния торгов
------------------------
В этой теме я расскажу как сократить первый этап.
Для этого написал bat файл (nk.bat)
Код
@echo off
del /f /q "*.log"
start "" "info.exe"
создайте его текстовым редактором и поместите в папку QUIK, где находится info.exe
----------------
чтобы запустить QUIK надо запустить этот файл (щелкнуть вместо info.exe по файлу nk.bat)
====================
Зачем нужен этот файл?
Проблема в том, что терминал QUIK зачем-то при старте загружает в память info.log (этот файл особо влияет на объем занимаемой памяти)
Данный bat файл сначала сотрет все log файлы, а потом запустит QUIK.
----------------------
Если не хотите удалять все лог файлы, то вместо *.log  поставьте info.log . Этого достаточно, чтобы получить сокращение.
-----------------------------
У меня при использовании этого bat файла объем памяти  занятой  терминалом  сокращается с 900 Мбайт до 600 Мбайт.
-------------------------
Для сбора статистики просьба сообщить как влияет bat файл в Вашем случае на старт терминала.
Причины тормозов при старте. Вскрытие покажет.
 
Всем,добрый день,
Предлагаю обсудить проблему тормозов при старте терминала.
-------------------
До последней прошедшей недели пользовался версией 8.7
Неоднократно пытался установить более свежую версию, но всегда получал тормоза и возвращался к 8.7
-------------------
На прошедшей неделе Сбербанк перешел на единый счет и мне пришлось устанавливать версии 12
так как исчезли параметры по фьючерсам.
-----------------------
Сначала установил версию 12.6 которая выложена у Сбербанка.
Получил увеличение объема занятой памяти терминалом в 2 раза с 600 Мбайт до 1200Мбайт и жуткие тормоза
--------------------------
По совету разработчиков установил новую версию 12.8.4
Объем занимаемой памяти при старте сократился с 1200 до 900.
Почему он изменяется ?
-----------------------------
Самое странное, что во время торгов объем занимаемой памяти постепенно уменьшается.
Если никаких действий не совершать , то объем занимаемой памяти сокращается до 50Мбайт.
Но если начать что-то делать, то он снова увеличивается, но не более 700, а иногда и не более 350Mбайт.
--------------------
Трудно что-либо придумать почему так происходит.
--------------------------
Но так как максимальный объем всегда получается при старте и это приводит к очень длительной загрузки, то
давайте обсудим возможные причины этого.
----------------------------
Время старта можно разделить на три этапа.
Первый - запуск терминал.
Второй -ввод пароля
Третий- ввод кода со смартфона.
-------------------
самый короткий интервал - второй. Задержки при нем пока не будем рассматривать.
-----------------
Сначала я предположил, как и многие на форуме, что проблема медленной загрузки  в длительном получении начальной информации с сервера брокера.
Но теперь у меня другая рабочая гипотеза.
=================
Основа ее в том, что время первого и третьего этапов одинаковое.
Характерно , первый и третий этапы имеют одинаковое значение времени исполнения  -в моем случае это по 4 минуты каждый.
Но в первом этапе нет никакой связи с сервером.
Получается, что соединение с сервером не влияет ни на объем занимаемой памяти ни на время старта.
=================
Поэтому я считаю, что указанные проблемы (время старта и объем занимаемой памяти )
связаны исключительно  с вычислениями, которые совершает терминал при старте.
=====================
Более того, эта гипотеза подтверждается тем, что в третьем этапе терминал сначала уменьшает объем занятой памяти
до 350 Мбайт. А потом медленно начинает увеличивать его до тех же 900 Мбайт что и в первом этапе.
=====================
Как правило время и занятая память у всех пользователей разные.
Это связано с конкретной настройкой интерфейса. Т е числом окон с графиками, числом таблиц и стаканов и числом скриптов на Lua.
=====================
Полагаю, что максимальный объем памяти в момент старта возникает по причине, возможно не единственной, но одной из основных,
РАСЧЕТА ИНДИКАТОРОВ НА LUA.
========================
Известно, что индикаторы на луа вычисляются  несколько раз при открытии графика.
----------------------------------------
В результате такого расчета возникает куча мусора от этих расчетов, так как сборщик мусора при старте не работает.
------------------------
В начале третьего этапе терминал удаляет все расчеты первого этапа и память сокращается.
-------------------------
Так как у меня установлена подписка вручную, то ничего нового при соединении с сервером не приходит.
---------------------------------
Терминал снова начинает свой расчет индикаторов и графиков и это увеличивает объем памяти до максимума для всей сессии.
-------------------------
Но это еще не все.
Длительный расчет индикаторов и графиков при старте связан с тем, что хотя все свечи от первой до последней имеются в начале расчета,
Расчет индикаторов, а возможно и построение графиков выполняется для каждой свечи отдельно в цикле Calculate.
Так как большинство индикаторов - это интегральная обработка данных в окне,
то при 3000 свечах (это то что сохраняет сервер) для каждого индикатора
в цикле при старте вычисления в скользящем окне выполняются 3000 и более раз.
Если история сохраняется на ПК, то со временем тормоза и объем занимаемой памяти растет.
--------------------------------
Предположу, что это тупиковый момент в развитии QUIK и он требует кардинальных изменений.
---------------------------
Еще заметил, что число подписанных инструментов не влияет на объем и время при старте.
------------------------
Резюме:
На объем и время при старте  влияет повторный расчет индикаторов на Lua,
циклический расчет индикаторов (возможно и графиков) для каждой свечи при старте
и размер сохраненной истории, по которым считаются эти индикаторы.
----------------------------
Тот факт, что объем памяти при старте версии 12.6 на 300 Мбайт больше, чем при старте версии 12.8 говорит о том,
что, как говорил сатирик "что-то не так в консерватории"
-------------------------
Возможно, решением было бы исключение повторных расчетов индикаторов и принудительный запуск сборщика мусора при завершении третьего этапа.
-------------------------
Исследования продолжаются....
=========================
P.S. В настоящее время кувыркаюсь с единим счетом. Постоянно исчезают позиции по фьючерсам.
Кроме того, как уже писал на форуме,но без ответа, сваливание в кучу информации об акциях и фьючерсах имеет не только систематические ошибки, но и противоречит ФЗ "О рынке ЦБ"
Но это уже другая история  
Окно сообщений закрывает окно ввода
 
Версия 12.8.3.4
при старте терминала:
Варианты построения робота
 
Тема предназначена для начинающих писателей роботов
------------------  
Вариантов написания роботов в терминале QUIK на луа множество.
Кратко расскажу о них на основе своего опыта.
-------------
По функциональному назначению можно разделить роботов на 3 класса.
1) Роботы , которые прогнозируют моменты изменения рынка для изменения позиции.Роботы-советники
2) Роботы, которые совершают транзакции на основе простейших алгоритмов и управляют стоп-заявками.
3) Роботы , которые объединяют функции 1 и 2.
---------------
Любого робота можно написать либо в виде скрипта-индикатора,далее робот-индикатор,
либо в виде скрипта не индикатора, далее робот-скрипт.
Разница в том, что робот на основе индикатора запускается на графике инструмента, которым торгуем,
а робот-скрипт, не индикатор, запускается без автоматической привязки к инструменту.
------------------
Робот индикатор самый простой в написании. в нем не надо подписываться на инструмент.
В него автоматически поступают данные лишь конкретного инструмента.
--------------------
Недостаток его в том,
что его надо запускать на графике инструмента и следовательно надо открывать окно с графиком.
Но обычно так все и торгуют.
---------------
Робот-скрипт  является универсальным и позволяет построить рой роботов, которые могут обмениваться данными и проводить расчеты параллельно.
----------------------------------
На этом пока все.
Если есть вопросы, то отвечу
---------------------
Продолжение следует...


   
Скрипт для обнаружение задержек данных
 
Для обнаружения ситуаций, когда соединение с сервером нормальное, но с сервера не поступают данные ВООБЩЕ написал скрипт.
Скрипт пишет данные о времени последней связи с сервером и фиксирует задержу в лог файле.
скрипт в стадии тестирования.
Желающие присоединяйтесь.
Код
function HMS(T) 
   local hms=0; for s in T:gmatch("[^:]+") do hms=60*hms+tonumber(s) end 
return hms;
end
MaxTime=30 
function main()
   while run do
      TS=getInfoParam("SERVERTIME")--  Время сервера  
      TW=getInfoParam("LASTRECORDTIME")--  Время последней записи  
      if TS and TW  then 
         TL=getInfoParam("LASTPINGTIME")  --Время последней проверки связи  
         if TL_OLD and TL~=TL_OLD then
            local str=os.date()
            if D>MaxTime then str=str..",задержка(сек)="..D; end 
            Log:seek("set",begin); 
            Log:write(str.."\n");    Log:flush(); 
            if D>MaxTime then begin=Log:seek(); end
         end
         TS_HMS=HMS(TS);   D=math.abs(HMS(TW)-TS_HMS)
      end
         TL_OLD=TL;
      sleep(200);
   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;
   run=true
end

На едином счете клиентский портфель считается с грубыми системными ошибками
 
Ув.Разработчики.
Сообщаю Вам о следующих грубейших ошибках расчета клиентского портфеля.
-------------------
При торговле фьючерсами не может быть никаких маржинальных сделок.
Т е такие показатели как НПР1, НПР2, Требование, УДС, и все показатели со словом маржа не существуют для фьючерсов.
Так как никаких займов брокер клиентам на фьючерсном рынке не дает и не может давать ни по регламенту ни по закону.
Указание Банка России от 12.02.2024 N 6681-У "О требованиях к осуществлению брокерской деятельности при совершении брокером отдельных сделок за счет клиента" (Зарегистрировано в Минюсте России 02.07.2024 N 78736)
У Вас же все эти показатели считаются для фьючерсов как для акций.
--------------------
Если Вы полагаете, что Вы считаете все правильно, то дайте ссылку на документ,
где указана методика расчета этих показатель для фьючерсов и объясните о какой марже  идет речь,
что такое нач и кон маржа для фьючерсов.
----------------------
Брокер Сбербанк это объяснить не смог.
====================
Есть ошибки и в других таблицах, но давайте решим сначала по клиентскому портфелю для единого счета.
Причина очень медленной загрузки QUIK
 
В данной теме раскрою вам секрет, почему при старте терминала QUIK  приходится ждать не просто минуты, а десятки минут.
------------------------
Все происходит очень просто.
Любой желающий может повторить мой эксперимент.
-------------------
Берем версию QUIK 12.8.3
Открываем диспетчер задач и наблюдаем объем занимаемой памяти
Начальный объем примерно 170Мбайт, но он быстро увеличивается до 400 и потом медленно, минут за 5 до 800 Мбайт.
Это происходит загрузка сохраненных данных торгов и истории.
----------------------------
После этого QUIK запрашивает логи и пароль и через некоторое время код со смартфона.
---------------------
После этого QUIK сбрасывает объем занимаемой памяти до 400 МБайт и начинает через интернет получать данные для настройки графиков и таблиц .
-------------------------
В конечном итоге он займет 1200 Мбайт (если удалите всю накопленную историю, то получите  от 850 до 1100 Мбайт)
---------------------
Т е ему надо получить с сервера данные и чего-то там наплодить размером от 400 до 800 Мбайт
=======================
При этом процессе Вам надо наблюдать работу сети
==================
Прикольно, но факт.
Обмен данными с сервером происходит малыми посылками.
Например , у меня для полной загрузки терминал QUIK обменялся с сервером  аж 1 млн. пакетов.
При этом канал Ethernet  и Интернет был загружен аж на 0.1% !!!
Т е при возможности обмена на скорости 100Мбит/s, сервер и терминал обмениваются мелкими пакетами на скорости в среднем 50 Кбит/s Т е в 2000 раз медленнее, чем возможно.
--------------------------
Причем возникает естественный вопрос. Нафига надо обмениваться 1 000 000 сообщений при старте?
Почему невозможно все передать на скорости в 1000 раз большей и пакетами в 1000 раз длиннее?
-------------------------
Но это риторические вопросы.
=================
Учитывая, что версии 12 занимают памяти в 2 раза больше, чем версии 8  (ранее писал 1200 -12 версия 600- .8 версия)  следует ожидать еще большего зависания терминалов в следующих версиях.
------------------------------
Еще замечу, что у меня очень малая подписка на инструменты и индикаторы,  открыто обычно не более  5 графиков и  2 стакана и таблицы, включая ТТП,  с сотней инструментов.  
На бирже инструментов тысячи.
------------------------------------
Представляю сколько ждут начинающие, которые открывают сотню графиков и стаканов.
============================
Поэтому начинайте загружать терминал вечером.
Утром все будет загружено. (Шутка)
Приколы терминала QUIK
 
Так как после установки версии 12.6 начались чудеса, то решил провести подробные исследования процесса загрузки терминала.
-------------
Для начала я восстановил архив котировок, который у меня составлял 100 Мбайт и запустил QUIK
----------------------
Начальный размер памяти при старте составил 800Мбайт:


терминал грузился 5 минут и конечный размер составил 1100 Мбайт


после того как ввел пароль терминал снова стал загружать данные с сервера и далал это следующие 5 минут
начал с 800Мбайт



в результате получилось 1200Мбайт


==============================  
После этого я решил перезаказать данные для построения графиков . У меня лишь графики сбербанка и индекса
Загрузка началась с 400Мбайт


В итоге загрузка данных продолжалась следующие 10 минут и результат 1200 Мбайт занятой памяти


================================
А теперь внимание, будет самое интересное.
====================
У меня есть скрипт советника, который без проблем работал уже 2 года на версии 8.7
----------------------------------
Я его загружаю на версию 12.6 и о ЧУДО  получаю  22 Мбайт !!! занятой памяти терминалом.

Но при этом получаю большую загрузку процессора (на 8.7 такого не было)
-----------------------
Тогда я удаляю свой скрипт
Загрузка процессора возвращается в норму
А что же с занятой памятью?
68 Мбайт  вместо 1200 Мбайт

Зависание версии 12.6. при откреплении окна.
 
Спешу поздравить всех с ляпом в версии 12.6.
----------------------
Если открепить окно с графиком для перемещения его за пределы основного окна QUIK, например на второй монитор, то получаем зависание терминала.
-----------------------
При этом загрузка процессора возрастает с 3% до 30%.
--------------------------
Если это окно свернуть, то все возвращается обратно.
Вопрос по единому счету
 
Сегодня сбербанк перешел на единый счет
Торгую лишь фьчерсами
В результате нигде не могу найти сумму свободных средств по фьючерсам
Кто знает где искать?
----------------
В сбербанке не знают.
Тест быстродействия многопоточного бота
 
Тема для начинающих писателей роботов
-----------------------
Алгоритм теста:
---------------------
Скрипт на Lua в терминале  QUIK обрабатывает колбеки и выставляет заявки по требованию приложения.
---------------------------------
Полученные события,
кроме событий OnOrder, OnStopOrder, OnTransReply,
которые обрабатывает сам, скрипт рассылает приложениям.
-------------------------------------
Для каждого инструмента или класса работает отдельное приложение,
которое получает данные от скрипта ,
прогнозирует изменение позиции и отсылает требования на выставление или снятие заявок скрипту.
-----------------------------------  
Приложения можно реализовать в виде отдельного скрипта для терминала QUIK ,
либо отдельного приложения Windows.
--------------------------------------
Механизм обмена сообщениями реализован через файлы, поэтому он один и тот же как для скриптов так и для приложений.
-------------------------------------
Весь процесс обмена сообщений пишется в лог файлы.
Результаты теста такие:
это логи событий, от скрипта к приложениям для инструментов. Первое число - задержка получения события приложением.
В данном тесте задержка  равна кванту windows, который установлен 2ms.
В конце каждого события через символ "> " указано сколько всего событий в очереди.
Код
1024us, 19545940221.4:1,GAZP,126.22,126.22,126.31>4
2069us, 19547996621.9:1,VTBR,81.79,81.770,81.790>1
1761us, 19548976031.1:1,ALRS,40.96,40.94,40.96>1
2122us, 19548975763.9:1,AFKS,13.446,13.442,13.446>2
164us, 19548977786.8:1,GAZP,126.23,126.22,126.23>3
3020us, 19551013990.4:1,AFKS,13.445,13.442,13.446>3
2904us, 19552031852.1:1,GMKN,156.28,156.24,156.28>3
2961us, 19552031904.2:1,VTBR,81.79,81.790,81.815>1
2068us, 19553048370.0:1,AFLT,56.53,56.49,56.53>7
19550003064us, 6120562.3:1,HYDR,0.4386,0.4383,0.4386>2
2116us, 19557151989.5:1,AFLT,56.52,56.49,56.53>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}}}>1
2946us, 19559169335.8:1,CHMF,974.4,974.0,975.2>3
3149us, 19559169199.5:1,AFLT,56.53,56.49,56.53>4
3024us, 19559187312.8:1,VTBR,81.815,81.790,81.815>1
718us, 19560195155.7:1,RUAL,37.495,37.480,37.495>2
2916us, 19560193051.8:1,GAZP,126.28,126.28,126.31>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}}}>1
249us, 19561199970.8:1,SBER,303.5,303.50,303.58>1
3111us, 19562215668.5:1,AFKS,13.451,13.442,13.451>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}}}>1
1699us, 19563239495.6:1,SBER,303.5,303.48,303.50>1
1073us, 19564257502.6:1,AFLT,56.54,56.49,56.54>3
1975us, 19564259571.1:1,RUAL,37.5,37.480,37.500>3
2916us, 19565367155.3:1,CHMF,974.6,974.6,975.2>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}}}>1
1117us, 19568731056.8:1,AFLT,56.55,56.49,56.55>6
1013us, 19571884419.5:1,AFKS,13.452,13.442,13.452>4
980us, 19571884533.0:1,GAZP,126.28,126.28,126.29>2
2909us, 19572876032.2:1,GAZP,126.29,126.28,126.29>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}}}>1
1817us, 19573893073.2:1,SBER,303.59,303.59,303.70>2
2998us, 19576946543.6:1,SBER,303.6,303.59,303.70>1
3060us, 19577952638.5:1,GAZP,126.31,126.28,126.31>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}}}>1
2844us, 19578998223.5:1,SBER,303.64,303.64,303.70>1
2096us, 19579996246.4:1,CHMF,975.2,974.6,975.2>6
3024us, 19580058598.2:1,VTBR,81.85,81.790,81.850>1
1032us, 19581000600.7:1,RTKM,65.62,65.53,65.62>3
3160us, 19580998565.3:1,AFLT,56.57,56.49,56.57>2
2599us, 19582061555.8:1,RUAL,37.505,37.480,37.505>1
1168us, 19582063123.7:1,SBER,303.66,303.64,303.66>3
1721us, 19583137903.4:1,GMKN,156.32,156.24,156.34>3
19584266007us, 705.9:1,MTSS,227.35,227.00,227.35>2
779us, 19585436100.9:1,ALRS,40.97,40.94,40.97>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}}}>1
880us, 19586562910.9:1,RUAL,37.525,37.480,37.525>2
1081us, 19586562802.1:1,AFKS,13.457,13.442,13.457>3
988us, 19586562976.9:1,SBER,303.64,303.64,303.66>1
1998us, 19586564896.4:1,VTBR,81.84,81.790,81.850>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}}}>1
2879us, 19587645272.0:1,VTBR,81.85,81.790,81.850>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}}}>1
1914us, 19588755163.3:1,SBER,303.65,303.65,303.66>2
3076us, 19588757012.6:1,VTBR,81.85,81.850,81.855>2
2780us, 19592899311.6:1,RUAL,37.51,37.480,37.510>1
2002us, 19593894417.4:1,VTBR,81.855,81.850,81.855>1
2050us, 19594927136.5:1,AFKS,13.448,13.442,13.452>6
1978us, 19594927300.1:1,MTSS,227.2,227.00,227.20>4
1986us, 19595921782.1:1,AFKS,13.448,13.448,13.449>4
2013us, 19596942548.8:1,AFKS,13.449,13.449,13.452>3
1955us, 19596942729.0:1,SBER,303.66,303.65,303.66>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}}}>1
1832us, 19598988870.0:1,GMKN,156.34,156.24,156.34>4
109us, 19598990711.0:1,SBER,303.71,303.65,303.71>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}}}>1
2059us, 19599991800.5:1,MTSS,227.3,227.00,227.30>5
1369us, 19601010287.6:1,RUAL,37.53,37.480,37.530>1
1026us, 19602016692.1:1,AFKS,13.453,13.449,13.453>5
3040us, 19605200077.0:1,SBER,303.7,303.65,303.71>2
1963us, 19607223681.8:1,SBER,303.7,303.70,303.71>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}}}>1
246us, 19609261908.6:1,RUAL,37.525,37.480,37.525>2
1145us, 19609261165.6:1,AFLT,56.57,56.56,56.57>9
2001us, 19612320640.0:1,AFKS,13.45,13.449,13.453>2
3017us, 19613357085.7:1,VTBR,81.85,81.850,81.855>1
873us, 19618420864.4:1,RUAL,37.525,37.525,37.530>1
1070us, 19618420750.7:1,ALRS,40.95,40.94,40.95>3
2965us, 19620569675.3:1,SBER,303.69,303.65,303.69>2
3029us, 19621672486.3:1,AFKS,13.45,13.449,13.450>3
2871us, 19622754415.3:1,SBER,303.7,303.65,303.70>1
1814us, 19624963547.9:1,GMKN,156.36,156.24,156.36>2
1005us, 19629285145.6:1,ALRS,40.95,40.94,40.97>2
2974us, 19631443340.0:1,ALRS,40.95,40.94,40.95>2
839us, 19632517491.0:1,MTSS,227.15,227.00,227.30>1
2017us, 19633576478.9:1,ALRS,40.95,40.95,40.97>2
1028us, 19636788872.1:1,AFKS,13.452,13.449,13.452>3
936us, 19636789059.0:1,SBER,303.68,303.65,303.70>1
3004us, 19638830536.8:1,GAZP,126.31,126.30,126.31>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}}}>1
1002us, 19639893190.4:1,ALRS,40.94,40.94,40.97>5
2987us, 19640857405.7:1,ALRS,40.93,40.93,40.97>3
2990us, 19640857505.9:1,SBER,303.57,303.57,303.70>1
1862us, 19641904165.2:1,SBER,303.58,303.58,303.70>1
3021us, 19641905963.7:1,VTBR,81.855,81.850,81.855>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}}}>1
1792us, 19642903655.9:1,RUAL,37.53,37.525,37.530>2
2965us, 19643911832.3:1,SBER,303.6,303.60,303.70>1
1027us, 19644926434.1:1,ALRS,40.97,40.93,40.97>5
877us, 19647965299.3:1,MTSS,227.3,227.00,227.30>2
2038us, 19648980013.8:1,RTKM,65.63,65.53,65.63>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}}}>1
910us, 19651219492.2:1,SBER,303.63,303.63,303.70>1
1023us, 19653450111.0:1,GAZP,126.3,126.30,126.31>1
1034us, 19656678685.6:1,ALRS,40.94,40.93,40.97>3
2986us, 19657784199.8:1,ALRS,40.94,40.93,40.94>3
849us, 19658870958.0:1,RUAL,37.525,37.525,37.530>3
1072us, 19658870804.0:1,ALRS,40.94,40.93,40.97>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}}}>1
3016us, 19659998924.8:1,ALRS,40.97,40.93,40.97>6
966us, 19661037394.8:1,VTBR,81.855,81.855,81.860>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}}}>1
2812us, 19661996560.1:1,GMKN,156.34,156.34,156.36>4
3136us, 19661996364.4:1,CHMF,974.8,974.6,974.8>6
3024us, 19662056764.5:1,VTBR,81.86,81.855,81.860>1
2011us, 19666067757.2:1,GMKN,156.32,156.32,156.36>2
2051us, 19668088665.3:1,GMKN,156.36,156.32,156.36>2
2085us, 19668143011.9:1,VTBR,81.855,81.855,81.860>2
2083us, 19669133655.1:1,GAZP,126.31,126.30,126.31>4
865us, 19673197714.8:1,RUAL,37.505,37.505,37.530>1
3028us, 19675273824.7:1,VTBR,81.825,81.825,81.860>1
911us, 19676266770.5:1,VTBR,81.855,81.855,81.860>1
3046us, 19678333887.3:1,HYDR,0.4388,0.4383,0.4388>2
955us, 19680341257.4:1,SBER,303.58,303.57,303.58>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}}}>1
3046us, 19681356411.9:1,GAZP,126.3,126.30,126.31>2
841us, 19682375223.5:1,SBER,303.59,303.58,303.59>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}}}>1
980us, 19685485494.8:1,VTBR,81.82,81.820,81.860>1
2043us, 19687552516.3:1,VTBR,81.855,81.820,81.860>1
1887us, 19689492369.4:1,VTBR,81.855,81.820,81.855>1
это сообщения от приложений.  Сообщение отсылается на каждое событие по данному инструменту:
В сообщении первым указано время задержки приема его скриптом.  
Если сообщения от приложения скрипт получил одновременно,
т е они были все записаны до того момента как скрипт их прочитал,
то в таблице у них одно время и они отделены пустой строкой от следующих сообщений.
 
Код
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,привет
Отключать сборщик мусора при работе с колбеками. Вы прикалываетесь?
 
Тема для начинающих писателей роботов.
--------------------------
Рано и поздно у Вас возникнет желание, либо необходимость, ускорить работу вашего робота.
Да, это скорее всего, реально
Но существует много ненужных телодвижений там, где что-либо делать не имеет смысла.
-----------------------
Например, отключать сборщик мусора в колбеках , а потом его включать.
-------------------------
Поясняю, почему в этом нет смысла.
======================
Для этого напишем следующий тест:
Код
local t1=nkQt.count(); local x1=collectgarbage("count");
 print("занято память КБ= "..x1//1)
local e={}; for j=1,100000 do e[j]=j end --создаем таблицу
local t1=nkQt.count(); local x=collectgarbage("count")-x1;
e=nil; --удаляем таблицу в мусор
print("объем мусора КБ="..x//1)
local t1=nkQt.count(); local x=collectgarbage("collect")
 print("сборка мусора(ms)="..(0.1*(nkQt.count()-t1))/1000)
local x=collectgarbage("count")  print("занято память КБ= "..x//1)
а это результат его исполнения:
Код
>D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "QUIKman.lua" 
занято память КБ= 220.0
объем мусора КБ=2048.0
сборка мусора(ms)=0.0379
занято память КБ= 156.0
>Exit code: 0
В тесте создаем таблицу и заполняем ее.
Потом удаляем таблицу.
В результате у нас создается объем мусора в 2 Мбайта.
Сборщик мусора собирает его за 0.038 ms(0.000038  сек).
---------------------------
Как уже писал на форуме,
Скрипт на луа  из-за Sleep(1) в Main имеет задержу исполнения не менее 16 ms, равную кванту времени Windows.
--------------------------------------
Многие, по рекомендации разработчиков QUIK, ставят Sleep(1000)  т.е. задержку в 1000 ms
----------------------------------------
Таким образом, если до очередного срабатывания колбека включится сборщик, то он задержит колбек на 0.04 ms.
и сборщик мусора создаст дополнительную задержку не более, чем  в 0.25% от задержки от Sleep(1)
------------------------
Можно перепрограммировать системный таймер и получить задержку не менее 1 ms.  
------------------------------
Тогда задержка от сборщика составит не более 4% от задержки Sleep(1), но это всего 0.00004 секунды.
--------------------------------------------------
Полагаете, что с этим надо бороться. Вы серьезно?
========================================================
Для справки:
------------------
За  квант времени в 1-2 мс поток получает возможность выполнить многие миллионы инструкций процессора.
------------------
Не забывайте и тот факт, что информация с биржи, поступающая к Вам через интернет, приходит с задержкой десять и более ms.
Тест ускорения скриптов
 
Ранее привел результаты теста обмена данными через файлы.
https://forum.quik.ru/messages/forum10/message81107/topic9441/#message81107
Основной вывод :
------------------------------
SLEEP в MAIN  приводит к задержке работы скриптов минимум
на  квант Windows. Его величина по умолчанию равна 16 ms.
-------------------------------
Прикольно то, что до Windows10 2004 года этот квант можно было сравнительно просто уменьшить до 0.5ms.
Теперь это сделать просто не получится.
--------------------------------
Для решения проблемы сделал другую функцию sleep, которая уменьшает этот интервал до 2 ms.
----------------------
Результаты теста:
Тест с функцией sleep(1) из библиотеки QLUA  Задержка 15985 мкс округляем 16 ms
Код
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}

Тест с функцией sleep(1) из библиотеки nkQt.  Задержка 1939 мкс округляем 2 ms
Код
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}
Таким образом удалось уменьшить задержку в скриптах в 8 раз.
Передача данных из скрипта в скрипт QUIK или приложение
 
Алгоритм теста:
---------------
два скрипта.
------------------
Первый скрипт:
Содержит колбеки. Полученная в колбеке таблица преобразуется в строку и записывается в файл.
-------------------------
Второй скрипт:
В функции main читает новые строки из файла. Если строки есть, то выводит их в лог файл.
--------------------------
В результате получаем в лог файле вторго скрипта таблицы из колбеков первого.
Ниже приведено содержимое лог файла при купокупки и продажи  акции на демо сервере
----------------------------
В строке записана следующая информация
136, млсек --задержка приема данных вторым скриптом в ms  относительно колбека первого скрипта.
307620878521: --значение счетчика в мкс во втором скрипте
307620741599:  --значение счетчика в мкс в первом скрипте
6,  мксек-- время на передачу таблицы из колбека в функцию вывода в файл в первом скрипте,
Param={sec_code=RUAL,class_code=QJSIM},  -- таблица параметров колбека
14  мксек  -- время на преобразование таблицы в строку.
Код
136,307620878521:307620741599:6,Param={sec_code=RUAL,class_code=QJSIM},14
46,307632222474:307632175847:6,Param={sec_code=PLZL,class_code=QJSIM},15
47,307632223018:307632175847:6,Param={sec_code=PLZL,class_code=QJSIM},15
151,307644227744:307644075798:4,DepoLimit={openlimit=0.0,locked_buy_value=332.37,currentbal=0.0,wa_price_currency=SUR,sec_code=SBER,locked_buy=1.0,openbal=0.0,locked_sell_value=0.0,currentlimit=0.0,firmid=NC0011100000,limit_kind=-260202016,client_code=10057,trdaccid=NL0011100043,locked_sell=0.0,awg_position_price=0.0,wa_position_price=0.0},67
152,307644228721:307644075798:4,DepoLimit={openlimit=0.0,locked_buy_value=332.37,currentbal=0.0,wa_price_currency=SUR,sec_code=SBER,locked_buy=1.0,openbal=0.0,locked_sell_value=0.0,currentlimit=0.0,firmid=NC0011100000,limit_kind=-260202016,client_code=10057,trdaccid=NL0011100043,locked_sell=0.0,awg_position_price=0.0,wa_position_price=0.0},67
76,307656202404:307656125744:6,Param={sec_code=PLZL,class_code=QJSIM},14
156,307668145723:307667989434:6,Param={sec_code=GAZP,class_code=QJSIM},15
156,307668145886:307667989434:6,Param={sec_code=GAZP,class_code=QJSIM},15
74,307679654875:307679580857:6,Param={sec_code=AFKS,class_code=QJSIM},15
74,307679655479:307679580857:6,Param={sec_code=AFKS,class_code=QJSIM},15
150,307692504242:307692353605:6,Param={sec_code=PLZL,class_code=QJSIM},14
151,307692504717:307692353605:6,Param={sec_code=PLZL,class_code=QJSIM},14
74,307705089868:307705015404:6,Param={sec_code=AFLT,class_code=QJSIM},23
72,307718039330:307717966568:6,Param={sec_code=AFLT,class_code=QJSIM},17
75,307730093355:307730017462:6,Param={sec_code=GAZP,class_code=QJSIM},15
64,307742024710:307741960032:6,Param={sec_code=GMKN,class_code=QJSIM},15
64,307742024919:307741960032:6,Param={sec_code=GMKN,class_code=QJSIM},15
4,307743459241:307743454534:5,DepoLimit={openlimit=0.0,locked_buy_value=0.0,currentbal=1.0,wa_price_currency=SUR,sec_code=SBER,locked_buy=0.0,openbal=0.0,locked_sell_value=304.88,currentlimit=0.0,firmid=NC0011100000,limit_kind=20260202,client_code=10057,trdaccid=NL0011100043,locked_sell=1.0,awg_position_price=304.92,wa_position_price=304.92},57
152,307743606854:307743454534:5,DepoLimit={openlimit=0.0,locked_buy_value=0.0,currentbal=1.0,wa_price_currency=SUR,sec_code=SBER,locked_buy=0.0,openbal=0.0,locked_sell_value=304.88,currentlimit=0.0,firmid=NC0011100000,limit_kind=20260202,client_code=10057,trdaccid=NL0011100043,locked_sell=1.0,awg_position_price=304.92,wa_position_price=304.92},57
152,307754399207:307754246493:7,Param={sec_code=GAZP,class_code=QJSIM},16
153,307754399652:307754246493:7,Param={sec_code=GAZP,class_code=QJSIM},16
151,307754554695:307754402703:2,Order={revision_number=0,side_qualifier=0,price=0.0,qty2=0.0,firmid=NC0011100000,account=NL0011100043,external_qty=0.0,uid=0,repoterm=0,operation_type=0,linkedorder=0,bank_acc_id=,passive_only_order=0,client_short_code=0,reject_reason=,filled_value=0.0,ext_order_flags=0,datetime={week_day=5,hour=13,min=34,day=30,ms=0,sec=46,year=2026,mcs=0,month=1},order_num=10210576492,accruedint=0.0,price_currency=,visibility_factor=0.0,expiry=-1,exec_type=0,exchange_code=,visible=0.0,price2=0.0,yield=0.0,value_entry_type=0,userid=NC0011100000,lseccode=,on_behalf_of_uid=0,executing_trader_qualifier=0,executing_trader_short_code=0,ordernum=10210576492,awg_price=0.0,accepted_uid=0,start_discount=0,visible_repo_value=0.0,expiry_time=-1,trans_id=0,canceled_uid=0,settlecode=,price_entry_type=0,benchmark=,flags=20,seccode=SBER,trading_session=0,repovalue=0.0,acnt_type=0,start_date=0,withdraw_datetime={week_day=1,hour=0,min=0,day=1,ms=0,sec=0,year=1601,mcs=0,month=1},client_code=10057,sec_code=SBER,settle_date=0,value=0.0,repo2value=0.0,brokerref=10057//,investment_decision_maker_short_code=0,investment_decision_maker_qualifier=0,settle_currency=,ext_order_status=0,class_code=QJSIM,repo_value_balance=0.0,activation_time=0,client_qualifier=0,qty=1.0,extref=,value2=0.0,settle_date2=0,balance=0.0,capacity=0,min_qty=0.0},169
150,307766405391:307766254827:6,Param={sec_code=NVTK,class_code=QJSIM},16
150,307766405474:307766254827:6,Param={sec_code=NVTK,class_code=QJSIM},16
59,307777503003:307777443230:6,Param={sec_code=PLZL,class_code=QJSIM},15
143,307790104848:307789961057:6,Param={sec_code=HYDR,class_code=QJSIM},15
146,307802247682:307802101258:5,Param={sec_code=GAZP,class_code=QJSIM},14
146,307802247877:307802101258:5,Param={sec_code=GAZP,class_code=QJSIM},14
Возможный источник утечки памяти в скриптах.
 
Гонял тест на версии 12.8.3.4 и обнаружил такое :
---------------------
Если принудительно не удалять таблицы параметров в колбеках, то сборщик мусора их не собирает.
-----------------------------
В итоге растет объем используемой памяти.
---------------------
Предлагаю заинтересованным проверить это.
Подтвердить или опровергнуть.
Вопрос к Разработчикам. Можете объяснить этот прикол?
 
Прикол от Сбербанка.
Торги сегодня акции сбербанка
Соединение есть, но данные не приходят уже 5 минут.
Потом данные поступают
----------------------
Такой прикол наблюдается эпизодически уже не первый день.
-------------------
Можете объяснить:
Универсальный обработчик событий - это просто
 
Эта тема для начинающих писателей роботов на Lua в QUIK.
Cкрипт, на основе которого можно строить различных роботов.
В нем реализована очередь , что обеспечивает обработку всех событий
Код
 TQ={}; jQr,jQw=0,0; --очередь
----------------------------
function main()
   while run==1 do wait_connect()
   while run==2 do
     while jQw>jQr do local n=jQr+1;local t=TQ[n];TQ[n]=nil;jQr=n;t.fun(t);end
     sleep(10)
      end
   end
end 
-----------------------------
local function wQ(t,fun) --функция записи обработчика в очередь 
   if fun then
   t.fun=fun; local n=jQw;if jQr==jQw then jQw=0;jQr=0;end n=jQw+1;TQ[n]=t; jQw=n;
   end
end
-----функции обратного вызова QLua------------------------
function OnDepoLimit(t) wQ(t,setPos);  end
----------------------------
function OnFuturesClientHolding(t) wQ(t,setPos);  end
-----------------------------
function OnOrder(t) wQ(t,Order);  end
----------------------------
function OnStopOrder(t) wQ(t,StopOrder);  end
-----------------------
function OnTransReply(t) wQ(t,TransReply);  end
----------------------------
function OnParam(c, s) wQ({sec_code=s,class_code=c},Param); end  
----------------------------
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  
---------------------------
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()  CloseTH() end 
---------------------------
function OnCleanUp() run=1; end
---------------
function OnInit(path) OnConnected(true); end
Функции обратного вызова записываются одинаково.
В них мы помещаем в очередь TQ  полученные параметры и имя функции, которая обрабатывает данное событие.
Функция обработки событий реализуется отдельно.
Если функция обработки события отсутствует, то событие не будет записываться во очередь.  
Изменение параметров встроенных индикаторов из скрипта
 
Добрый день,
---------------------
Сейчас в QLUA есть возможность перезапустить скрипт индикатора при изменении параметров в окне настройки индикатора.
-----------------------
Предлагаю реализовать возможность изменения параметров встроенного индикатора из скрипта.
==================
Поясняю:
--------------------
Да, можно написать копию встроенного индикатора на луа и таким образом решить задачу изменения параметров индикатора.
-----------------
Но такое решение работает раз в 100 медленнее, чем встроенное.
--------------------
Кроме того, в терминале QUIK много встроенных индикаторов и нет смысла  делать их в виде копии на луа,
либо использовать Вашу библиотеку скриптов на луа и изучать алгоритмы индикаторов.

 
алгоритм бота - стопа
 
Предлагаю обсудить один из моих вариантов бота, который управляет стопом.
-------------------------
Конструктивная критика приветствуется.
===================
Открываем график с инструментом , помещаем на него скрипт-индикатор бота и совершаем сделки.
----------------------
Бот имеет два режима.
----------------------------------
В первом режиме бот автоматически установит стоп, если есть позиция  по инструменту.
--------------------------
Во втором режиме бот начнет управлять стопом, если руками установить стоп  в любую позицию.
Когда бот обнаружит установленный стоп, он будет его переставлять в соответствии с заданным алгоритмом.
----------------------
Если позиция закроется, то стоп будет снят.
При появлении новой позиции бот будет управлять стопом.
----------------------------------
Чтобы бот перестал управлять, надо снять стоп руками.
---------------------------------
При старте QUIK бот начинает работать в установленном режиме.

 
Торговый советник - это просто.
 
Тема для начинающих писателей роботов.
Продолжение темы:
https://forum.quik.ru/messages/forum17/message80773/topic9417/#message80773
-------------------------
Чтобы сразу не сливать депозит,  лучше написать робот-советник, который на истории покажет , что он сможет.
---------------------------
Напишем такой советник.
Для этого в приведенный по ссылке выше скрипт добавим расчет прибыли/убытков при совершении сделок по приведенному ранее(см ссылку) алгоритму
------------------------
Примем что брокер и биржа забирают com=0.006 (0.6%)
Расчет будет проводить в %, количество лотов примем равным 1. Сделки совершаются в long и short.
В результате получился вот такой скрипт:
Код
function OnCalculate(i)
  local buy,sel;
  if i==1 then OnChangeSettings() 
    i1=0; t={}; Prof=0; Los=0; Q=Settings.Q; com=Settings.com; ProfAll=0;  BS=0;
  elseif i1~=i  then 
     ind(i1,Settings.tag,t); 
     if #t>0 then
          local Oi,Hi,Li=O(i1),H(i1),L(i1)  local prib=0;  local z=T(i1);   x=t[#t]; 
          params.DATE=100*(100*z.year+z.month)+z.day; 
          params.TIME=100*(100*z.hour+z.min)+z.sec;
          if Li>x and 0>=BS then buy=Li-0.05;  if BS==0 then prib=-com; else prib=(1-com)*(price/Oi-1); end  BS=1; price=Oi; params.YVALUE=buy-0.1; end
          if x>Hi and BS>=0  then  sel=Hi+0.05 if BS==0 then prib=-com; else prib=(1-com)*(Oi/price-1); end price=Oi;  BS=-1; params.YVALUE=sel+0.1; end
          if buy or sel then
            ProfAll=ProfAll+prib;    params.TEXT=(0.1*(1000*ProfAll//1)).."%" 
            if ProfAll>=0 then params.B=255 params.R=0 else params.B=0 params.R=255 end
            Label=AddLabel(Settings.tag,params);
          end
      end
  end
  i1=i;  
 return buy,sel;
 end

function Init() 
local t={} Settings.line =t;
   t[#t+1]={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 4};
    t[#t+1]={Name = "Se",Color = RGB(255,0,0),Type = 11,Width = 4};
   return #t; end
    
function OnDestroy ()  DelAllLabels(Settings.tag) end
function OnChangeSettings() 
   DelAllLabels(Settings.tag); 
end


а это результат его тестирования на демо-сервере:
Данные с индикатора. Просто и быстро.
 
Тема для начинающих писателей роботов.
----------------------------
Ранее на форуме я рассказывал как построить робота-эксперта  на основе двух любых индикаторов отображаемых на графике.
https://forum.quik.ru/forum17/topic7630/
---------------------------
В этой теме поясню как читать данные с индикатора быстро и просто.
------------------------
Напишем пример скрипта индикатора, который считывает значения индикатора moving в массив t и выводит на график значения индикатора смещенные на 0.1 в виде зеленых треугольников .
---------------------------
При этом  сделаем так, чтобы индикатор не тратил время на считывание тиков, а читал значение индикатора один раз в момент появления новой свечи цены.

В моих роботах именно в этот момент и принимается решение о выставлении заявки.

Т е решение принимается в момент открытия новой свечи .
------------------------------  
Если робот будет торговать на интервала 30 минут, то чтение индикатора будет происходить всего 1 раз в 30 минут именно на открытии новой свечи.
Код
Settings={ tag="moving", Name = '*nk_test'}

function OnCalculate(i)
 if i==1 then  i1=0; t={};
 elseif i1~=i  then local M=getNumCandles (Settings.tag);  
    if M>=i then x=getCandlesByIndex(Settings.tag,0,i1,1); if x then t[#t+1]=x[0].close end  i1=i;  end
 end
 i1=i;  if #t>0 and t[#t]~=0 then  return t[#t]+0.1; end
end

function Init() 
local t={} Settings.line =t;
t[#t+1]={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 3};
return #t;
end



это результат:
Торговые роботы без программирования
 
Тема создана с целью  обсудить мой подход к созданию торговых роботов без написания сложных скриптов на Lua.
--------------------------
Приведу примеры, потом объясню что и как.
----------------------
Пример 1: Скрипт скользящего стопа на основе индикатора fractals записывается таким образом:



Пример 2: Скрипт торгового робота на основе индикаторов moving и RSI



Робот строится как скрипт индикатора и состоит из обязательной таблицы Settings, встроенных в QUIK индикаторов  и библиотеки nklibi, начальным объемом  11 КБ.
-------------------
Все необходимые параметры робота определяются в Settings.
Изначально указывается, если надо, создание лог файла, набор индикаторов, на основе которых будет работать робот.  Для каждого индикатора указывается линия, параметр свечи и смещение относительно текущего значения.
-------------------  
Для применения робота необходимо открыть график инструмента, поместить на него указанные в Settings индикаторы и записать им в качестве идентификаторов указанные имена.
-------------------
Алгоритмы новых роботов можно добавить либо в библиотеку, либо в конец скрипта.
===================
Библиотека nklibi реализует конечный автомат  управления заявками и стоп-заявками, а также определяет по графику инструмента все необходимые для торговли параметры.
====================
Если график с индикатором робота связать якорем с таблицей текущих параметров(ТТП) торгов, то, перебирая инструменты в ТТП,  можно переключать робота  на различные торгуемые инструменты.
----------------------------------
Конструктивные предложения по расширению возможностей данного подхода приветствуются.
----------------------------
В настоящее время библиотека nklibi находится в стадии тестирования.


 
Индикатор с метками
 
По просьбе трудящихся, написал Пример ПРАВИЛЬНОГО индикатора, который  через секунду удаляет ранее выставленную метку и выводит новую.
--------------------------------
Пользуйтесь на здоровье.
----------------------------

Код
Settings={ Name = "*nk_test", tag ="Metka"  }

params={R = 255, G = 255, B = 255, TRANSPARENCY = 0,FONT_HEIGHT = 10,TRANSPARENT_BACKGROUND = 1, FONT_FACE_NAME = 'Verdana' }

function OnCalculate(i)
  if i==1 then
  OnChangeSettings()  
  elseif i== Size() then    -- последняя свеча
     if os.time() > LastSecond  then          -- раз в секунду (или больше)  
          LastSecond = os.time();    -- потиковое обновление (с задержкой)  
        if Label then DelLabel(Settings.tag,Label) end
           params.TEXT =tostring(C(i))
           params.HINT = tostring(i)
        local h=0   local  m=i;  
        while 14>i-m  do if H(m) > h then h=H(m) end;m=m-1;   end
        local Ti=T(i-3)
        params.DATE=100*(100*Ti.year+Ti.month)+Ti.day;
        params.TIME=100*(100*Ti.hour+Ti.min)+Ti.sec;  
        params.YVALUE =h;
        Label= AddLabel(Settings.tag, params)
       end -- every second
   end
end

function OnChangeSettings()
sec = getDataSourceInfo().sec_code; DelAllLabels(Settings.tag);
LastSecond=0  end
function OnDestroy() OnChangeSettings() end
function Init()  return 1 end




Ускорение загрузки QUIK
 
Добрый день,
Предлагаю следующие решения :
------------------------------
1) Сделать возможным указывать начальную дату загрузки  сохраненной на ПК  истории при старте QUIK.
--------------------------
2) Сделать возможным сохранять слепок памяти для последующей загрузки.
Время загрузки тарминала QUIK
 
Я утверждаю, что время загрузки(старта)  существенно зависит от наличия скриптов индикаторов на луа и архива истории.
------------------
Провел тест времени загрузки (начала работы )терминала QUIK (брокер Сбербанк)
---------------------

Тест 1:
Сделал копию рабочей папки QUIK
Удалил папку архивы и индикаторы и подключился к брокеру:
-------------
Время старта вычислял по интервалу от момента двухфакторной до начала отображения стакана и графиков





Тест2:  загрузил рабочий вариант QUIK



В результате Тест 1 время загрузки без скриптов на луа составляет  12 секунд, а время загрузки со скриптами индикаторов 69 секунд
----------------------------------  
Выводы делайте сами.
Такого не может быть, но опять.
 
Вопрос к разработчикам.
--------------------
можете объяснить причину такого явления.
------------------
Терминал работает нормально. На рынке все спокойно.
вдруг приходит сообщение:  "Сервер принудительно разорвал соединение"
-----------------------
после этого терминал пытается автоматически восстановить соединение.
----------------------
приходит сообщение: "Вы уже работаете в системе"

потом сообщение "соединение восстановить не удалось"
---------------------
И так пока не надоест.
=====================
Приходится закрывать принудительно терминал и запускать снова.
====================
Что за хрень происходит?
Структура моего робота
 

В данной теме рассказываю, как построен мой торговый робот.

Полагаю, что тема будет интересна не только начинающим писателям роботов,

так как излагаю свои идеи, которые обладают определенной новизной .

----------------------------

Структура робота организована в виде сети роботов типа “звезда”.

Каждый робот – это отдельный поток или процесс ОС Windows.

------------------------------

В центре звезды находится главный робот nkbot, который обрабатывает события колбеков и таймера  и раздает задания другим роботам.

События организованы в виде очереди. Если событий нет в течении заданного интервала, то робот выполняет задание по таймеру.

---------------------------

Все остальные роботы работают с заданной для каждого робота группой инструментов

и выполняют свои задачи по команде nkbot, либо по истечению заданного интервала времени.

---------------------------

Каждый робот работает в своем потоке OS Windows, либо в процессе терминала  QUIK и имеет доступ к библиотеке QLua, либо в изолированном потоке(процессе) OS  

Роботы в терминале запускаются как скрипты терминала QUIK.

----------------------------

Связь робота nkbot с каждым роботом сети выполняется через очередь команд в общей памяти.

Список работающих роботов создается в файле инициализации nkbot_ini.lua.

Задачи для роботов создаются в отдельных файлах в виде функций и загружаются в робота во время запуска скрипта по заданному списку задач для каждого робота.

--------------------------

Несколько примеров реализации отдельных элементов данной структуры.

Все роботы сети, кроме nkbot, имеют одинаковую структуру и реализуются одним скриптом.

Имя робота состоит из “nkbot_” и далее идентификатор робота.

Например, nkbot_B.lua, nkbot_C.lua  два робота B и C

Файл nk_bot_B.lua

Код
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"  -- задачи, которые
быдет исполнять робот  

nkLog=true;  -- -включить вывод в лог файл

----------------не трогать---------------

minfo =
debug.getinfo(1, "S").source:sub(2); path =
minfo:match("(.*[/\\])") or "."

dofile(path.."stream.lua")

Файл nk_bot_С.lua
Код
Ts={SiZ5={int={5}}, RIZ5={int={5,10},},SRZ5={int={30}}}
--инструменты и интервалы свечей

list_task="task3,task4"  -- список задач

nkLog=true;

----------------не трогать---------------

minfo =
debug.getinfo(1, "S").source:sub(2); path =
minfo:match("(.*[/\\])") or "."

dofile(path.."stream.lua")

файл инициализации nkbot_init.lua
Код
list_stream="B,C"  --список потоков
nkLog=true; --включаем лог файл
Асинхронная подписка на свечи
 
Это можно сделать так:
Код
--Пример ассинхронного запроса свечей--
--результат в массиве 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)
   local tc=Tclas[c]
   if tc then  local ts=tc[s];  
     if ts then local ts=tc[s]; local int=ts.int; local ds=ts.ds;local  N=#int; local M=#ds;
      if N~=M then local j=0; 
       while N>j do j=j+1; 
          if ds[j]==nil then local x=CreateDataSource(c,s, int[j]);  
        if x:Size()>0  then    local ti=math.tointeger(1000*(os.clock()-tim)//1);
           ds[j]=x; nkLog:write("time(ms)="..tostring(ti)..","..c..","..s..",j="..j..",int="..int[j]..",size="..ds[j]:Size().."\n"); nkLog:flush();
         end
      end
       end
    M=#ds; if N==M then nkLog:write(s..",подписка завершена\n"); nkLog:flush(); end
   end
      end
   end
end

RUN = truefunction main()
    while RUN do 
 --  Выполнение заданий скрипта --
      sleep (10)
   end 
end

function OnStop(signal)    RUN = false   return 5000 end

function OnInit(p)
  local p=string.reverse(p); local n,m=string.find(p,"\\"); 
  local pS=string.reverse(string.sub(p,n)); name=string.reverse(string.sub(p,5,n-1)) ;
  package.cpath =package.cpath..";"..pS.."?.dll;"
  package.path =package.path..";"..pS.."?.lua;"..pS.."?.luac;"
   fnlog=pS..name.."_nk.log";   nkLog=io.open(fnlog,"w")
end
В скрипте есть вывод в лог файл, который создается в каталоге скрипта.
Результат работы скрипта на тестовом сервере QUIK
Код
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,подписка завершена
Обсуждаем интерфейс для робота
 
Сейчас пишу робота  на основе ИИ Lua и QUIK.
Кратко изложу интерфейс для работы с ним.
---------------------  
Интерфейс имеет такой вид:


содержание строк и столбцов задается двумя строками в файле инициализации робота:
Код
list_sec="ROSN,GAZP,SBER,PLZL,GMKN,CHMF,HYDR,LKOH,MOEX,SNGS"   --список торгуемых инструментов
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." 
 -- описание столбцов
В таблице отображаются либо отдельные значения, либо значения из списка.
Например, я задаю типы стоп заявок в виде :
Код
T_stop={"stop","take","st_ta","oth_sec","linked","ord_st","ord_ta","ord_st_ta"}; T_stop[0]=#T_stop; --типы стоп-заявок
Пользователь может изменять данные лишь двумя способами  -- выбирать из существующего списка или изменять значение на плюс минус 1 нажатием правой или левой кнопки мышки..
Двойным щелчком мышки можно сделать значение активным или пассивным.
-----------------
Например, можно сделать неактивными все инструменты ,кроме одного, и робот будет торговать лишь этим инструментом.
Можно сделать неактивным стоп или short и робот не будет ставить стоп или покупать в шорт.
-------------------------  
Еще в файле инициализации задается список имеющихся алгоритмов торговли , я называю их задачами.  
Код
list_task="task1,task2,task3,task4"  -- список существующих задач
а также список задач для всех инструментов по умолчанию
Код
user_task={"task1","task2" } --задачи для каждого инструмента по умолчанию

для каждого инструмента можно указать индивидуальные параметры или задачи, которые в списке инструментов указываются через ":"
=========================
Это весь интерфейс.

Конструктивные предложения приветствуются.
Проблема с нажатием правой кнопки
 
Когда в таблице в скрипте нажимаю правую кнопку мышки, то вылезает окно квика


можно как-то это отключить?
проблема с двойным нажатием кнопки
 
При двойном нажатии кнопки мыши в таблице созданной в скрипте всегда сначала приходит сигнал об одинарном нажатии кнопки.
Код
msg=1,j=2
msg=1,левая кнопка
msg=5,j=-1
msg=5,изм текущей (выделенной) строки
msg=11,j=2
msg=11,отпущена левая кнопка
msg=3,j=2
msg=3,двойное левой кнопки
Как  устранить сигнал об одинарном нажатии при двойном нажатии?
Метки на графике в скрипте
 
По просьбе трудящихся.


Код
label_params={["TEXT"]="",["IMAGE_PATH"]="",["ALIGNMENT"]="Left",["YVALUE"]=0,["DATE"]=0,["TIME"]=0,["R"]=255,["G"]=255,["B"]=255,
["TRANSPARENCY"]=0,["TRANSPARENT_BACKGROUND"]=0,["FONT_FACE_NAME"]='Times New Roman',["FONT_HEIGHT"]=10,["HINT"]=""}

function labeldraw(price, YYYYMMDD,HMS,textlabel, texthint)  
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
   local  size= getNumCandles(tag);
   while  size>i do
         local t, _, _ = getCandlesByIndex(tag, 0, i, 1)  
         local z=t[0];    local Hi,Li,Ci,Oi=z.high,z.low,z.close,z.open;
             i=i+1;
         local Ti=ds:T(i)
      YYYYMMDD=100*(100*Ti.year+Ti.month)+Ti.day;
      HMS=100*(100*Ti.hour+Ti.min)+Ti.sec;
      labeldraw(Hi, YYYYMMDD,HMS,"A", "B")
   end
   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

остановка скрипта при запуске QUIK
 
Если Вам надо чтобы скрипт, запущенный в QUIK остановился при новом старте нужно первую строку в  колбек OnInit записать так:
Код
function OnInit(path)
 if os.clock()<2 then return  end
индикатор на Lua
 
Индикатор определяет максимум и минимум на заданном периоде и отображает среднее значение.
Алгоритм оптимизировал для ускорения вычислений.
Выкладываю для всех желающих:
Код
Settings = {Name = "*Kijun-sen",kijun_period = 6,}

function OnCalculate(i)
   Hi=H(i) or H1; Li=L(i) or L1; x1=x;
   if i1>i then
      ma=Hi; mi=Li; jma=i; jmi=i;
   end
   if Hi and Li then
      local j=i-Settings.kijun_period; if j<1 then j=1; end
      if j>jma or j>jmi then
         ma=Hi; mi=Li; jma=i; jmi=i;
         while i>j do
            Hi,Li=H(j),L(j)
            if Hi and Hi>ma then ma = Hi jma=j; end
            if Li and Li<mi then  mi =Li jmi=j;end
            j=j+1
         end
      else
         if Hi>ma then ma=Hi; jma=i; end
         if mi>Li then mi=Li; jmi=i; end
      end
      x=(ma + mi)/2;    H1,L1,i1=Hi,Li,i;
   end
return x1
end

function OnChangeSettings()
   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  end
это мой вариант модификации этого алгоритма .  
Код
Settings = {Name = "*ind_nk",period = 6,}

function OnCalculate(i)
   Hi=H(i) or H1; Li=L(i) or L1;
   Oi=O(i) or O1; Ci=C(i) or C1;
   if i1>i then
      ma=Hi; mi=Li; jma=i; jmi=i;
   end
   if Hi and Li and i1~=i then

      local j=i-Settings.period; if j<1 then j=1; end
      if j>jma or j>jmi then
         ma=Hi; mi=Li; jma=i; jmi=i;
         while i>j do
            Hi,Li=H(j),L(j)
            if Hi and Hi>ma then ma = Hi jma=j; end
            if Li and Li<mi then  mi =Li jmi=j;end
            j=j+1
         end
      else
         if Hi>ma then ma=Hi; jma=i; end
         if mi>Li then mi=Li; jmi=i;
         end
         if x then
            local z=2*Li-Hi; if Li>x and Ci>Oi then mi=z; jmi=i; end
            z=2*Hi-Li; if x>Hi and Oi>Ci then ma=z; jma=i; end
         end
      end
      if ma and mi then x=(ma + mi)/2; end
      H1,L1,O1,C1,i1=Hi,Li,Oi,Ci,i;
   end
return x
end

function OnChangeSettings()
   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  end
Если нравится, можете сказать "спасибо".
Скрипты от ИИ
 
Добрый день,
Выкладываю работающий скрипт, который написал ИИ под моим руководством.
-------------------------------
Скрипт позволяет загружать историю с биржи MOEX.
-------------------------
Состоит из двух файлов.
---------------
config.json  
Код
{
    "instruments": [
        {
            "name": "SBER",
            "start_date": "2015-01-01",
            "decimal_places": 2,
            "intervals": [1, 10, 60, 24],
            "parameters": ["open", "high", "low", "close", "volume"],
            "board": "TQBR"
        },
        {
            "name": "GAZP",
            "start_date": "2015-01-01",
            "decimal_places": 2,
            "intervals": [1, 10, 60, 24],
            "parameters": ["open", "high", "low", "close", "volume"],
            "board": "TQBR"
        }
    ]
}
data_fetcher.py
Код
import os
import pandas as pd
import requests
import json
from datetime import datetime, timedelta

def load_config(config_file="config.json"):
    """
    Загружает конфигурацию из JSON файла

    Параметры:
    config_file (str): Путь к файлу конфигурации

    Возвращает:
    dict: Конфигурация
    """
    if not os.path.exists(config_file):
        print(f"Файл конфигурации {config_file} не найден")
        return None

    try:
        with open(config_file, 'r', encoding='utf-8') as f:
            config = json.load(f)
        return config
    except Exception as e:
        print(f"Ошибка при загрузке конфигурации: {e}")
        return None

def fetch_moex_data(ticker, start_date, end_date, interval=60):
    """
    Загружает данные с MOEX API для указанного тикера и временного периода

    Параметры:
    ticker (str): Тикер инструмента
    start_date (datetime): Начальная дата загрузки
    end_date (datetime): Конечная дата загрузки
    interval (int): Интервал свечей в минутах (по умолчанию 60 минут)

    Возвращает:
    pd.DataFrame: DataFrame с загруженными данными
    """
    data = []
    current_start = start_date
    print(f"Загрузка данных с MOEX для {ticker} (интервал: {interval} мин) с {start_date} по {end_date}...")

    while True:
        url = f"http://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities/{ticker}/candles.json"
        params = {
            'from': current_start.strftime('%Y-%m-%d'),
            'till': end_date.strftime('%Y-%m-%d'),
            'interval': interval,
            'start': 0
        }

        try:
            response = requests.get(url, params=params)
            response.raise_for_status()  # Проверка на ошибки HTTP
            json_data = response.json()

            if 'candles' not in json_data or 'data' not in json_data['candles']:
                print("Нет данных в ответе API")
                break

            candles = pd.DataFrame(json_data['candles']['data'],
                                  columns=json_data['candles']['columns'])

            if len(candles) == 0:
                break

            data.append(candles)

            # Обновляем время для следующего запроса
            current_start = (pd.to_datetime(candles['end'].iloc[-1]) + timedelta(minutes=interval))

            if len(candles) < 500:  # Если получено меньше 500 записей, это последняя порция
                break

        except requests.exceptions.RequestException as e:
            print(f"Ошибка при запросе данных: {e}")
            break

    print(f"Загружено {len(data)} блоков данных")

    if not data:
        return pd.DataFrame()

    # Объединяем все блоки данных и удаляем дубликаты
    return pd.concat(data).drop_duplicates()

def process_raw_data(raw_data):
    """
    Обрабатывает сырые данные: разделяет begin на date и time, удаляет end

    Параметры:
    raw_data (pd.DataFrame): Сырые данные с MOEX

    Возвращает:
    pd.DataFrame: Обработанные данные
    """
    # Разделение begin на date и time
    raw_data['date'] = pd.to_datetime(raw_data['begin']).dt.date

    # Преобразование времени в формат без двоеточий (HHMMSS)
    raw_data['time'] = pd.to_datetime(raw_data['begin']).dt.strftime('%H%M%S')

    # Удаление ненужных столбцов
    columns_to_keep = ['date', 'time', 'open', 'high', 'low', 'close', 'volume']
    processed_data = raw_data[columns_to_keep].copy()

    # Сортировка по дате и времени
    processed_data = processed_data.sort_values(['date', 'time'])

    return processed_data

def get_last_available_date(ticker_dir):
    """
    Определяет последнюю дату, за которую есть данные в структуре каталогов

    Параметры:
    ticker_dir (str): Путь к каталогу тикера

    Возвращает:
    datetime.date: Последняя дата или None, если данных нет
    """
    last_date = None

    # Проходим по всем подкаталогам (годы)
    if not os.path.exists(ticker_dir):
        return None

    for year_dir in os.listdir(ticker_dir):
        year_path = os.path.join(ticker_dir, year_dir)
        if not os.path.isdir(year_path):
            continue

        # Проходим по месяцам
        for month_dir in os.listdir(year_path):
            month_path = os.path.join(year_path, month_dir)
            if not os.path.isdir(month_path):
                continue

            # Проходим по дням
            for day_dir in os.listdir(month_path):
                day_path = os.path.join(month_path, day_dir)
                if not os.path.isdir(day_path):
                    continue

                # Проверяем, что имя дня - это число (день месяца)
                if not day_dir.isdigit():
                    continue

                # Формируем дату: год, месяц, день
                try:
                    year = int(year_dir)
                    month = int(month_dir)
                    day = int(day_dir)
                    current_date = datetime(year, month, day).date()
                except:
                    continue

                # Сравниваем с последней датой
                if last_date is None or current_date > last_date:
                    last_date = current_date

    return last_date

def update_data_file(ticker, interval, output_dir, start_date, end_date):
    """
    Обновляет файлы данных, добавляя новые записи при необходимости

    Параметры:
    ticker (str): Тикер инструмента
    interval (int): Интервал свечей в минутах
    output_dir (str): Путь к каталогу для сохранения данных
    start_date (datetime): Начальная дата для загрузки
    end_date (datetime): Конечная дата для загрузки

    Возвращает:
    None
    """
    # Определяем последнюю дату, за которую есть данные
    last_date = get_last_available_date(output_dir)

    if last_date is None:
        # Данных нет, загружаем с начальной даты
        new_start_date = start_date
        print("Не найдено существующих данных. Загружаем все данные...")
    else:
        # Загружаем с последней даты (включительно)
        new_start_date = datetime.combine(last_date, datetime.min.time())
        print(f"Найдены данные до {last_date}. Загружаем новые данные начиная с этой даты...")

    # Загружаем данные с MOEX
    raw_data = fetch_moex_data(ticker, new_start_date, end_date, interval)

    if raw_data.empty:
        print("Нет новых данных для загрузки")
        return

    # Обрабатываем данные
    processed_data = process_raw_data(raw_data)

    # Сохраняем данные, разбивая по датам
    save_data_by_date(ticker, interval, output_dir, processed_data)

    print(f"Загружено и сохранено {len(processed_data)} записей")

def save_data_by_date(ticker, interval, output_dir, data):
    """
    Сохраняет данные с разбиением по датам в подкаталоги

    Параметры:
    ticker (str): Тикер инструмента
    interval (int): Интервал в минутах
    output_dir (str): Базовый каталог для сохранения
    data (pd.DataFrame): Данные для сохранения

    Возвращает:
    None
    """
    # Получаем имя интервала
    interval_name = get_interval_name(interval)

    # Группируем данные по датам
    grouped = data.groupby('date')

    for date, day_data in grouped:
        # Разбиваем дату на год, месяц, день
        year = date.year
        month = date.month
        day = date.day

        # Форматируем месяц и день с ведущими нулями
        month_str = f"{month:02d}"
        day_str = f"{day:02d}"

        # Формируем путь к каталогу для этой даты
        date_dir = os.path.join(output_dir, str(year), month_str, day_str)

        # Создаем каталог, если он не существует
        os.makedirs(date_dir, exist_ok=True)

        # Создаем подкаталог для интервала
        interval_dir = os.path.join(date_dir, interval_name)
        os.makedirs(interval_dir, exist_ok=True)

        # Удаляем столбец date перед сохранением
        day_data_to_save = day_data.drop(columns=['date'])

        # Сохраняем каждый параметр в отдельный файл
        for column in day_data_to_save.columns:
            file_path = os.path.join(interval_dir, column)

            # Сохраняем столбец без индекса и без заголовка
            day_data_to_save[column].to_csv(file_path, index=False, header=False)

            print(f"Сохранено {len(day_data_to_save[column])} значений параметра '{column}' за {date} в {file_path}")

def get_interval_name(interval):
    """
    Преобразует интервал в минутах в текстовое представление

    Параметры:
    interval (int): Интервал в минутах

    Возвращает:
    str: Текстовое представление интервала
    """
    if interval == 1:
        return "1min"
    elif interval == 10:
        return "10min"
    elif interval == 60:
        return "1hour"
    elif interval == 1440:
        return "1day"
    else:
        return f"{interval}min"

if __name__ == "__main__":
    # Загрузка конфигурации
    config = load_config()
    if not config:
        print("Не удалось загрузить конфигурацию. Выход...")
        exit(1)

    # Параметры загрузки
    end_date = datetime.now()

    print(f"Начало загрузки данных для тикеров: {', '.join([item['ticker'] for item in config['tickers']])}")
    print(f"Период: с {min([datetime.strptime(item['start_date'], '%Y-%m-%d') for item in config['tickers']])} по {end_date.strftime('%Y-%m-%d')}")
    print("-" * 50)

    # Обработка каждого тикера и интервала
    for ticker_config in config['tickers']:
        ticker = ticker_config['ticker']
        start_date_str = ticker_config['start_date']
        intervals = ticker_config['intervals']

        # Преобразование начальной даты из строки в datetime
        try:
            start_date = datetime.strptime(start_date_str, '%Y-%m-%d')
        except ValueError:
            print(f"Ошибка в формате даты для тикера {ticker}: {start_date_str}")
            continue

        print(f"\nОбработка тикера: {ticker} (начальная дата: {start_date_str})")
        print(f"Интервалы: {', '.join([get_interval_name(i) for i in intervals])}")

        # Формирование пути к каталогу для сохранения данных
        base_dir = "moex"
        ticker_dir = os.path.join(base_dir, ticker)

        # Обработка каждого интервала для текущего тикера
        for interval in intervals:
            print(f"\nОбработка интервала: {get_interval_name(interval)}")

            # Обновление файла данных
            update_data_file(ticker, interval, ticker_dir, start_date, end_date)

            # Проверка сохраненных данных
            print("\nПроверка сохраненных данных:")
            interval_name = get_interval_name(interval)

            # Проверяем наличие подкаталогов с датами
            if os.path.exists(ticker_dir):
                # Собираем все даты из структуры каталогов
                dates_found = []

                # Проходим по годам
                for year_dir in sorted(os.listdir(ticker_dir)):
                    year_path = os.path.join(ticker_dir, year_dir)
                    if not os.path.isdir(year_path):
                        continue

                    # Проходим по месяцам
                    for month_dir in sorted(os.listdir(year_path)):
                        month_path = os.path.join(year_path, month_dir)
                        if not os.path.isdir(month_path):
                            continue

                        # Проходим по дням
                        for day_dir in sorted(os.listdir(month_path)):
                            day_path = os.path.join(month_path, day_dir)
                            if not os.path.isdir(day_path):
                                continue

                            # Проверяем наличие подкаталога с интервалом
                            interval_path = os.path.join(day_path, interval_name)
                            if os.path.isdir(interval_path):
                                # Формируем дату для отображения
                                try:
                                    year = int(year_dir)
                                    month = int(month_dir)
                                    day = int(day_dir)
                                    date_str = f"{year:04d}-{month:02d}-{day:02d}"
                                    dates_found.append(date_str)
                                except:
                                    pass

                if dates_found:
                    print(f"Найдено {len(dates_found)} дат с данными:")
                    # Показываем последние 5 дат
                    for date_str in sorted(dates_found)[-5:]:
                        # Формируем путь к каталогу интервала
                        interval_path = os.path.join(ticker_dir, date_str.split('-')[0],
                                                    date_str.split('-')[1], date_str.split('-')[2],
                                                    interval_name)

                   #     if os.path.exists(interval_path):
                    #        print(f"  {date_str}:")

                            # Проверяем наличие файлов с параметрами
                    #        for param in ['time', 'open', 'high', 'low', 'close', 'volume']:
                    #            param_file = os.path.join(interval_path, param)
                    #            if os.path.exists(param_file):
                    #                # Читаем файл
                    #                param_data = pd.read_csv(param_file, header=None)
                    #                print(f"    {param}: {len(param_data)} значений")

                                    # Выводим последние 3 значения для проверки
                               #     if len(param_data) > 0:
                               #         print(f"      Последние 3 значения: {', '.join(map(str, param_data.tail(3).values.flatten()))}")
                    #    else:
                    #        print(f"  {date_str}: каталог интервала не найден")
                else:
                    print("Данные не найдены")
            else:
                print(f"Каталог тикера {ticker} не найден")

            print("-" * 30)

   #     print("-" * 50)

    print("\nЗагрузка данных завершена для всех инструментов и интервалов")
QUIK на VPS
 
Добрый день,
Вопрос к разработчикам и знатокам.
Хочу поставить торгового робота c возможностью ручной торговли на VPS.
QUIK или что-то подобное вполне устроило бы.
робота могу написать на любом языке, но предпочитаю С и Lua.
----------------------
Какое решение можете посоветовать.
-------------------
Какие требования к железу. Если есть что-то в интернете просьба дать ссылку.
Что-то с сайтом не так.
 
Сегодня при попытке зайти на Ваш сайт получаю это:
Данные с MOEX на Lua
 
Для этого надо установить пакет luasocket.
-------------------
Пример скрипта  получить данные по Сбер для тайма 10 минут
Код
p2 = "D:/luasocket/"; 
package.cpath =package.cpath ..";"..p2.."?.dll";
package.path =package.path..";"..p2.."?.lua;"
local http = require("socket.http")

local header="http://iss.moex.com/iss/"
local sec="SBER"
local Date="2025-03-10"
local interval="10"
Data=http.request(header..eng..sec.."/candles.csv?from="..Date.."&interval="..interval) --не более 500 значений
print(Data)
результат:
Код
candles

open;close;high;low;value;volume;begin;end
316.98;316.98;316.98;316.98;6558316.199999993;20690;2025-03-10 06:50:00;2025-03-10 06:59:59
317;318.71;318.71;317;175975306.3;553270;2025-03-10 07:00:00;2025-03-10 07:09:59
318.6;318.23;318.68;318.01;47408624.699999996;148930;2025-03-10 07:10:00;2025-03-10 07:19:59
318.26;318.35;318.6;318.07;84248628.7;264640;2025-03-10 07:20:00;2025-03-10 07:29:59
318.34;318.2;318.53;318.2;27067709.6;85020;2025-03-10 07:30:00;2025-03-10 07:39:59
318.2;318.47;318.5;318.16;19870959.499999996;62420;2025-03-10 07:40:00;2025-03-10 07:49:59
318.49;318.15;318.58;318.15;30327046.200000003;95250;2025-03-10 07:50:00;2025-03-10 07:59:59
318.14;318.03;318.2;317.98;41976335.3;131970;2025-03-10 08:00:00;2025-03-10 08:09:59
318.02;318.25;318.46;318;38795280.800000004;121920;2025-03-10 08:10:00;2025-03-10 08:19:59
318.24;318.21;318.43;318.16;21885336.900000002;68770;2025-03-10 08:20:00;2025-03-10 08:29:59
318.26;318.11;318.36;317.97;35239183;110760;2025-03-10 08:30:00;2025-03-10 08:39:59
318.12;318.15;318.24;318;21160924.200000003;66520;2025-03-10 08:40:00;2025-03-10 08:49:59
318.15;317.82;318.17;317.82;40041972.60000001;125950;2025-03-10 08:50:00;2025-03-10 08:59:59
317.81;317.76;318;317.75;133830122.00000001;421140;2025-03-10 09:00:00;2025-03-10 09:09:59
317.77;317.39;317.87;317.32;49434518.60000001;155660;2025-03-10 09:10:00;2025-03-10 09:19:59
317.39;317.85;317.93;317.39;66449996.699999996;209220;2025-03-10 09:20:00;2025-03-10 09:29:59
317.86;318.5;318.7;317.7;131819408.4;413940;2025-03-10 09:30:00;2025-03-10 09:39:59
318.49;318.4;318.51;318.24;49213137.300000004;154560;2025-03-10 09:40:00;2025-03-10 09:49:59
318.38;318.4;318.52;318.22;71269440.2;223850;2025-03-10 09:50:00;2025-03-10 09:59:59
318.36;318.05;318.53;317.92;219652877.20000002;690420;2025-03-10 10:00:00;2025-03-10 10:09:59
318.08;318.16;318.28;317.93;88167886;277180;2025-03-10 10:10:00;2025-03-10 10:19:59
318.16;316.67;318.2;316.37;471615257.1;1486720;2025-03-10 10:20:00;2025-03-10 10:29:59
316.67;317.23;317.63;316.67;204793272.60000005;645670;2025-03-10 10:30:00;2025-03-10 10:39:59
317.23;317.41;317.52;317;121681174.80000004;383570;2025-03-10 10:40:00;2025-03-10 10:49:59
317.41;317.29;317.93;317.26;164760496.00000003;518700;2025-03-10 10:50:00;2025-03-10 10:59:59
317.29;317.47;317.74;317.2;71508892.9;225250;2025-03-10 11:00:00;2025-03-10 11:09:59
317.44;317.8;318;317.3;100920005.19999999;317570;2025-03-10 11:10:00;2025-03-10 11:19:59
317.8;317.26;318.16;317;225224639.00000003;709590;2025-03-10 11:20:00;2025-03-10 11:29:59
317.25;317.6;317.82;317.25;115677122.69999997;364200;2025-03-10 11:30:00;2025-03-10 11:39:59
317.6;317.68;317.85;317.18;111280152.30000001;350360;2025-03-10 11:40:00;2025-03-10 11:49:59
317.6;317.37;317.97;317.31;105261628.70000003;331320;2025-03-10 11:50:00;2025-03-10 11:59:59
317.34;317.08;317.6;316.83;248860136.1000001;784780;2025-03-10 12:00:00;2025-03-10 12:09:59
317.08;316.99;317.15;316.8;120169067.6;379150;2025-03-10 12:10:00;2025-03-10 12:19:59
316.97;317.14;317.45;316.97;79511919.60000001;250680;2025-03-10 12:20:00;2025-03-10 12:29:59
317.14;317.74;317.79;317.13;100651973.49999999;317060;2025-03-10 12:30:00;2025-03-10 12:39:59
317.73;318.26;318.48;317.62;322494796.1;1013600;2025-03-10 12:40:00;2025-03-10 12:49:59
318.25;319.48;319.49;318.06;674781138.9000006;2115780;2025-03-10 12:50:00;2025-03-10 12:59:59
319.44;319.29;319.49;318.75;311378074.9000001;975590;2025-03-10 13:00:00;2025-03-10 13:09:59
319.3;319.12;319.94;319;553953558.5999991;1733680;2025-03-10 13:10:00;2025-03-10 13:19:59
319.16;319.18;319.31;318.67;258552251.50000006;810640;2025-03-10 13:20:00;2025-03-10 13:29:59
319.19;319.14;319.59;319.01;171823970.89999998;538100;2025-03-10 13:30:00;2025-03-10 13:39:59
319.15;318.92;319.2;318.57;188321384.6;590480;2025-03-10 13:40:00;2025-03-10 13:49:59
318.91;318.81;318.95;318.67;78612829.80000003;246570;2025-03-10 13:50:00;2025-03-10 13:59:59
318.78;319.38;319.95;318.77;513175851.2;1606420;2025-03-10 14:00:00;2025-03-10 14:09:59
319.38;318.96;319.38;318.84;182232033.90000004;571070;2025-03-10 14:10:00;2025-03-10 14:19:59
319;319.28;319.47;318.7;183904173.1;576430;2025-03-10 14:20:00;2025-03-10 14:29:59
319.23;319.15;319.37;319;157636132.9000001;494020;2025-03-10 14:30:00;2025-03-10 14:39:59
319.15;319.16;319.37;319;119519400.10000002;374540;2025-03-10 14:40:00;2025-03-10 14:49:59
319.17;319.55;319.75;319.1;136698176.20000002;427880;2025-03-10 14:50:00;2025-03-10 14:59:59
319.54;319.22;319.64;319;225211218.60000005;705350;2025-03-10 15:00:00;2025-03-10 15:09:59
319.27;319.55;319.55;319.12;57168158.599999994;179010;2025-03-10 15:10:00;2025-03-10 15:19:59
319.55;319.23;319.59;319.17;78352069.79999998;245310;2025-03-10 15:20:00;2025-03-10 15:29:59
319.23;319.33;319.5;319.2;50655222;158620;2025-03-10 15:30:00;2025-03-10 15:39:59
319.33;319.55;319.59;319.2;94761912.99999997;296650;2025-03-10 15:40:00;2025-03-10 15:49:59
319.55;319.71;319.75;319.42;85916305.70000002;268780;2025-03-10 15:50:00;2025-03-10 15:59:59
319.71;319.6;319.84;319.6;145533720.7;455280;2025-03-10 16:00:00;2025-03-10 16:09:59
319.6;320.48;320.63;319.6;667109220.6999998;2083330;2025-03-10 16:10:00;2025-03-10 16:19:59
320.46;320;320.51;319.92;281212775.49999994;878130;2025-03-10 16:20:00;2025-03-10 16:29:59
320;319.39;320.1;319.2;206595805.20000005;646280;2025-03-10 16:30:00;2025-03-10 16:39:59
319.4;319.41;319.72;319.21;133510730.40000004;417890;2025-03-10 16:40:00;2025-03-10 16:49:59
319.4;319.5;319.94;319.36;84631125.29999998;264730;2025-03-10 16:50:00;2025-03-10 16:59:59
319.51;319.55;319.76;319.4;62520826.6;195640;2025-03-10 17:00:00;2025-03-10 17:09:59
319.57;319.54;319.62;319.38;70866999.7;221830;2025-03-10 17:10:00;2025-03-10 17:19:59
319.53;318.52;319.56;317.5;517624221.59999996;1626050;2025-03-10 17:20:00;2025-03-10 17:29:59
318.53;318.64;318.88;318.33;94381582.50000001;296210;2025-03-10 17:30:00;2025-03-10 17:39:59
318.67;318.92;319.17;318.55;150513043.1;472080;2025-03-10 17:40:00;2025-03-10 17:49:59
318.85;318.5;318.9;318.5;51312515.699999996;161020;2025-03-10 17:50:00;2025-03-10 17:59:59
318.5;318.25;318.5;317.8;230751215.80000007;725410;2025-03-10 18:00:00;2025-03-10 18:09:59
318.25;318.34;318.6;318.07;75083299.89999999;235860;2025-03-10 18:10:00;2025-03-10 18:19:59
318.32;318.1;318.45;318;56363842.9;177190;2025-03-10 18:20:00;2025-03-10 18:29:59
318.09;318.15;318.41;317.91;72950185.7;229320;2025-03-10 18:30:00;2025-03-10 18:39:59
317.6;317.6;317.6;317.6;129739600;408500;2025-03-10 18:40:00;2025-03-10 18:49:59
317.95;318;318.18;317.72;61493505.89999999;193370;2025-03-10 19:00:00;2025-03-10 19:09:59
318;318.3;318.34;317.97;95886070.69999999;301400;2025-03-10 19:10:00;2025-03-10 19:19:59
318.3;317.76;318.45;317.75;45363522.7;142620;2025-03-10 19:20:00;2025-03-10 19:29:59
317.76;317.84;317.93;317.74;30867686.9;97120;2025-03-10 19:30:00;2025-03-10 19:39:59
317.83;318.05;318.36;317.75;47578783.3;149600;2025-03-10 19:40:00;2025-03-10 19:49:59
318.04;318.09;318.32;318.04;19216828.900000002;60410;2025-03-10 19:50:00;2025-03-10 19:59:59
318.08;317.9;318.16;317.9;28139057.39999999;88470;2025-03-10 20:00:00;2025-03-10 20:09:59
317.9;317.97;317.99;317.83;12054377.899999999;37920;2025-03-10 20:10:00;2025-03-10 20:19:59
317.94;317.98;318;317.88;9630865.600000001;30290;2025-03-10 20:20:00;2025-03-10 20:29:59
317.98;317.51;317.98;317.5;99723652.29999998;313920;2025-03-10 20:30:00;2025-03-10 20:39:59
317.5;317.15;317.5;316.68;357174365.49999994;1126890;2025-03-10 20:40:00;2025-03-10 20:49:59
317.15;317.02;317.34;316.97;28328302.4;89330;2025-03-10 20:50:00;2025-03-10 20:59:59
317.02;317.08;317.19;316.9;44550143.89999999;140530;2025-03-10 21:00:00;2025-03-10 21:09:59
317.07;317.92;317.96;317.06;98698390.19999999;310830;2025-03-10 21:10:00;2025-03-10 21:19:59
317.93;317.44;317.93;317.44;65801526.4;207060;2025-03-10 21:20:00;2025-03-10 21:29:59
317.44;317.84;317.88;317.24;27684769.1;87180;2025-03-10 21:30:00;2025-03-10 21:39:59
317.85;317.7;317.85;317.67;11610775.700000001;36540;2025-03-10 21:40:00;2025-03-10 21:49:59
317.68;317.67;317.8;317.67;7451154.200000001;23450;2025-03-10 21:50:00;2025-03-10 21:59:59
317.68;317.44;317.74;317.43;14800377.900000002;46600;2025-03-10 22:00:00;2025-03-10 22:09:59
317.43;317.19;317.57;317.02;43047580.3;135700;2025-03-10 22:10:00;2025-03-10 22:19:59
317.18;317.37;317.52;317.18;23116736.9;72830;2025-03-10 22:20:00;2025-03-10 22:29:59
317.37;317.57;317.68;317.33;24962601.300000004;78620;2025-03-10 22:30:00;2025-03-10 22:39:59
317.57;317.38;317.57;317.38;19585749.599999998;61700;2025-03-10 22:40:00;2025-03-10 22:49:59
317.39;317.38;317.39;317.3;14902353.6;46960;2025-03-10 22:50:00;2025-03-10 22:59:59
317.39;317.46;317.5;317.39;9695359.4;30540;2025-03-10 23:00:00;2025-03-10 23:09:59
317.46;317.49;317.49;317.41;33814353.800000004;106510;2025-03-10 23:10:00;2025-03-10 23:19:59
317.49;317.57;317.62;317.48;39505913.3;124420;2025-03-10 23:20:00;2025-03-10 23:29:59
317.57;317.5;317.57;317.31;31998754.200000003;100810;2025-03-10 23:30:00;2025-03-10 23:39:59
317.5;317.57;317.67;317.45;58358134.599999994;183770;2025-03-10 23:40:00;2025-03-10 23:49:59
317.7;317.7;317.7;317.7;2821176;8880;2025-03-11 06:50:00;2025-03-11 06:59:59
317.78;318.2;318.7;317.6;87586947.2;275220;2025-03-11 07:00:00;2025-03-11 07:09:59
318.23;318.05;318.29;318.04;23422902.1;73620;2025-03-11 07:10:00;2025-03-11 07:19:59
318.1;318.41;318.5;318;36120401.400000006;113470;2025-03-11 07:20:00;2025-03-11 07:29:59
318.42;318.29;318.5;318.2;13874050.399999999;43580;2025-03-11 07:30:00;2025-03-11 07:39:59
318.28;318.29;318.29;318.28;6238445.500000001;19600;2025-03-11 07:40:00;2025-03-11 07:49:59
318.28;318.11;318.29;318.1;16128308.4;50690;2025-03-11 07:50:00;2025-03-11 07:59:59
318.11;317.87;318.11;317.82;17662961.599999998;55550;2025-03-11 08:00:00;2025-03-11 08:09:59
317.93;318.16;318.19;317.93;8344390.7;26230;2025-03-11 08:10:00;2025-03-11 08:19:59
318.15;317.91;318.26;317.9;8340461.699999999;26220;2025-03-11 08:20:00;2025-03-11 08:29:59
317.96;317.8;317.97;317.6;26977807.199999988;84900;2025-03-11 08:30:00;2025-03-11 08:39:59
317.8;317.62;317.97;317.61;17680679.1;55620;2025-03-11 08:40:00;2025-03-11 08:49:59
317.74;317.32;317.81;317.32;67167200.39999999;211510;2025-03-11 08:50:00;2025-03-11 08:59:59
317.33;317.49;317.92;317.31;70360926.60000001;221550;2025-03-11 09:00:00;2025-03-11 09:09:59
317.49;317.29;317.5;317.21;52695987;166070;2025-03-11 09:10:00;2025-03-11 09:19:59
317.29;317.39;317.48;316.72;96404497.90000004;304100;2025-03-11 09:20:00;2025-03-11 09:29:59
317.38;317.58;317.86;317.3;50274399.79999996;158320;2025-03-11 09:30:00;2025-03-11 09:39:59
317.58;317.32;317.78;317;39921641.9;125780;2025-03-11 09:40:00;2025-03-11 09:49:59
317.36;317.06;317.4;316.07;315354329.2;996070;2025-03-11 09:50:00;2025-03-11 09:59:59
317.01;315.91;317.07;315.66;513685099.0000001;1625210;2025-03-11 10:00:00;2025-03-11 10:09:59
315.88;316.64;316.64;315.57;355175621.99999994;1123830;2025-03-11 10:10:00;2025-03-11 10:19:59
316.62;316.57;317.28;316.34;224793168.19999996;709750;2025-03-11 10:20:00;2025-03-11 10:29:59
316.57;316.65;316.76;316.03;216093107.90000004;682980;2025-03-11 10:30:00;2025-03-11 10:39:59
316.65;318.38;318.68;316.6;717415758.6;2257710;2025-03-11 10:40:00;2025-03-11 10:49:59
318.46;318.42;318.53;318.01;241769644.3;759470;2025-03-11 10:50:00;2025-03-11 10:59:59
318.42;319.99;320.49;318.14;1070825372.4;3350700;2025-03-11 11:00:00;2025-03-11 11:09:59
319.99;319.6;320.34;319.25;390892391.20000005;1222580;2025-03-11 11:10:00;2025-03-11 11:19:59
319.58;319.96;320;319.48;227905559.60000005;712670;2025-03-11 11:20:00;2025-03-11 11:29:59
319.96;319.99;320.1;319.95;152333402.00000006;476040;2025-03-11 11:30:00;2025-03-11 11:39:59
319.98;319.65;319.99;319;254934993.9;798230;2025-03-11 11:40:00;2025-03-11 11:49:59
319.62;319;319.66;318.65;170697046.00000003;535010;2025-03-11 11:50:00;2025-03-11 11:59:59
319;319.1;319.6;318.82;133154876.7999998;417050;2025-03-11 12:00:00;2025-03-11 12:09:59
319.1;318.78;319.4;318.6;348113064.8999999;1091620;2025-03-11 12:10:00;2025-03-11 12:19:59
318.78;318.01;318.8;318;378198086.6000001;1188160;2025-03-11 12:20:00;2025-03-11 12:29:59
318;318.86;318.96;318;156668099.10000002;491850;2025-03-11 12:30:00;2025-03-11 12:39:59
318.83;318.91;318.97;318.7;76522840.39999999;239980;2025-03-11 12:40:00;2025-03-11 12:49:59
318.96;318.98;318.99;318.7;88897780.9;278780;2025-03-11 12:50:00;2025-03-11 12:59:59
318.99;319.45;319.63;318.93;216690560.3;678460;2025-03-11 13:00:00;2025-03-11 13:09:59
319.41;319.47;319.65;319.26;112337813.89999999;351600;2025-03-11 13:10:00;2025-03-11 13:19:59
319.43;319.37;319.5;318.83;121616323.40000004;381050;2025-03-11 13:20:00;2025-03-11 13:29:59
319.34;319.82;319.89;319.1;170356178.79999986;533050;2025-03-11 13:30:00;2025-03-11 13:39:59
319.86;319.86;320.05;319.63;360185284.1;1125870;2025-03-11 13:40:00;2025-03-11 13:49:59
319.82;319.7;320.02;319.53;126334275.3;394940;2025-03-11 13:50:00;2025-03-11 13:59:59
319.71;319.4;319.71;319.18;64190452.599999994;200990;2025-03-11 14:00:00;2025-03-11 14:09:59
319.4;318.65;319.4;318.2;274579169.1;861710;2025-03-11 14:10:00;2025-03-11 14:19:59
318.65;319.56;320.06;318.55;357971726.90000004;1120010;2025-03-11 14:20:00;2025-03-11 14:29:59
319.57;319.39;319.6;319.03;116185744.19999999;363830;2025-03-11 14:30:00;2025-03-11 14:39:59
319.39;319.3;319.49;319.18;91109377.09999998;285280;2025-03-11 14:40:00;2025-03-11 14:49:59
319.22;318.5;319.5;318.44;239955025.19999996;752310;2025-03-11 14:50:00;2025-03-11 14:59:59
318.49;318.7;319.08;318.2;328263597.79999995;1030520;2025-03-11 15:00:00;2025-03-11 15:09:59
318.71;318.66;318.82;318.43;113859591.89999999;357410;2025-03-11 15:10:00;2025-03-11 15:19:59
318.66;318.9;319.1;318.53;77947730.50000001;244570;2025-03-11 15:20:00;2025-03-11 15:29:59
318.82;319;319.14;318.7;42302012.3;132630;2025-03-11 15:30:00;2025-03-11 15:39:59
319;319.24;319.5;318.8;125415824.9;392850;2025-03-11 15:40:00;2025-03-11 15:49:59
319.23;319.24;319.4;318.72;103262974.7;323560;2025-03-11 15:50:00;2025-03-11 15:59:59
319.24;319.53;319.74;319.18;195054758.1;610560;2025-03-11 16:00:00;2025-03-11 16:09:59
319.52;319.75;319.95;319.49;211115199.8;660210;2025-03-11 16:10:00;2025-03-11 16:19:59
319.75;320.09;320.25;319.63;341314600.7999999;1066620;2025-03-11 16:20:00;2025-03-11 16:29:59
320.07;319.78;320.09;319.73;129603205.10000001;405100;2025-03-11 16:30:00;2025-03-11 16:39:59
319.78;319.97;320;319.78;72642700.89999999;227040;2025-03-11 16:40:00;2025-03-11 16:49:59
319.96;320.03;320.18;319.96;105175298.60000001;328610;2025-03-11 16:50:00;2025-03-11 16:59:59
320.03;321.09;321.2;320.03;744500105.5000001;2321110;2025-03-11 17:00:00;2025-03-11 17:09:59
321.09;321.01;321.98;320.96;1269680795;3949580;2025-03-11 17:10:00;2025-03-11 17:19:59
321.01;320.8;321.3;320.79;254568182.40000007;792940;2025-03-11 17:20:00;2025-03-11 17:29:59
320.8;320.92;321.12;320.76;159533393.89999998;497040;2025-03-11 17:30:00;2025-03-11 17:39:59
320.98;320.46;321.04;320.25;199581991.60000002;622630;2025-03-11 17:40:00;2025-03-11 17:49:59
320.46;320.43;320.74;320.35;113832584.79999998;355120;2025-03-11 17:50:00;2025-03-11 17:59:59
320.42;320.1;320.5;319.51;242440416.5;757710;2025-03-11 18:00:00;2025-03-11 18:09:59
320.07;319.65;320.23;319.31;162779543.59999993;509110;2025-03-11 18:10:00;2025-03-11 18:19:59
319.65;320.05;320.05;319.5;105775473.7;330770;2025-03-11 18:20:00;2025-03-11 18:29:59
320.06;319.86;320.19;319.81;33642858.9;105130;2025-03-11 18:30:00;2025-03-11 18:39:59
320.23;320.23;320.23;320.23;63632903.299999975;198710;2025-03-11 18:40:00;2025-03-11 18:49:59
320.23;320.12;320.24;319.87;58630601.49999999;183210;2025-03-11 19:00:00;2025-03-11 19:09:59
320.13;319.88;320.17;319.87;77382776.19999999;241870;2025-03-11 19:10:00;2025-03-11 19:19:59
319.9;319.88;320.14;319.87;16706214.7;52210;2025-03-11 19:20:00;2025-03-11 19:29:59
319.88;320;320.1;319.88;16224184.199999997;50700;2025-03-11 19:30:00;2025-03-11 19:39:59
320;320.94;321.46;319.97;481574724.60000014;1500410;2025-03-11 19:40:00;2025-03-11 19:49:59
320.95;321.73;321.73;320.55;237047973.30000004;737720;2025-03-11 19:50:00;2025-03-11 19:59:59
321.73;320.81;321.82;320.66;396882068.6;1234690;2025-03-11 20:00:00;2025-03-11 20:09:59
320.85;321.09;321.43;320.84;133254530.4;415010;2025-03-11 20:10:00;2025-03-11 20:19:59
321.09;320.67;321.28;320.4;89851708.00000001;280040;2025-03-11 20:20:00;2025-03-11 20:29:59
320.63;320.6;320.91;320.51;97731504.49999999;304770;2025-03-11 20:30:00;2025-03-11 20:39:59
320.6;320.98;321;320.56;45949417.8;143250;2025-03-11 20:40:00;2025-03-11 20:49:59
320.98;320.82;321.82;320.78;342943078.3;1067340;2025-03-11 20:50:00;2025-03-11 20:59:59
320.82;319.48;321.34;319.2;754016925.4999996;2355380;2025-03-11 21:00:00;2025-03-11 21:09:59
319.47;319.91;320.33;318.53;830634081.9;2601560;2025-03-11 21:10:00;2025-03-11 21:19:59
319.9;320.06;320.98;319.8;296826357.5;926740;2025-03-11 21:20:00;2025-03-11 21:29:59
320.06;320.33;320.6;319.46;237834156.7;743160;2025-03-11 21:30:00;2025-03-11 21:39:59
320.38;318.72;320.53;318.72;487314780.2;1525770;2025-03-11 21:40:00;2025-03-11 21:49:59
318.72;319.56;320.4;318.68;460987075.2000001;1443950;2025-03-11 21:50:00;2025-03-11 21:59:59
319.52;319.05;319.7;319.01;186025632.10000002;582550;2025-03-11 22:00:00;2025-03-11 22:09:59
319.01;318.77;319.18;318.71;188625885.2;591590;2025-03-11 22:10:00;2025-03-11 22:19:59
318.78;319.19;319.54;318.77;149306283.4;467770;2025-03-11 22:20:00;2025-03-11 22:29:59
319.17;319.04;319.45;318.82;96810475.60000001;303500;2025-03-11 22:30:00;2025-03-11 22:39:59
319.04;318.92;319.1;318.82;110522481.00000001;346530;2025-03-11 22:40:00;2025-03-11 22:49:59
318.93;319.52;319.57;318.91;161189119.99999994;504990;2025-03-11 22:50:00;2025-03-11 22:59:59
319.52;320;320.23;319.51;297995934.2;931380;2025-03-11 23:00:00;2025-03-11 23:09:59
319.99;319.46;320.09;319.4;65165758.49999999;203790;2025-03-11 23:10:00;2025-03-11 23:19:59
319.5;319.96;320.03;319.34;61997007.699999996;193920;2025-03-11 23:20:00;2025-03-11 23:29:59
319.96;319.75;320.1;319.64;81898160.2;255980;2025-03-11 23:30:00;2025-03-11 23:39:59
319.77;319.69;319.87;318.81;159117429.7;498140;2025-03-11 23:40:00;2025-03-11 23:49:59
319.99;319.99;319.99;319.99;14092359.6;44040;2025-03-12 06:50:00;2025-03-12 06:59:59
319.8;319.86;320.9;319.7;189258639.9;590800;2025-03-12 07:00:00;2025-03-12 07:09:59
319.86;319.43;320.1;319.31;94263994.5;294750;2025-03-12 07:10:00;2025-03-12 07:19:59
319.43;319.49;319.65;319.13;49855972.099999994;156120;2025-03-12 07:20:00;2025-03-12 07:29:59
319.49;319.91;320;319.48;42978431.79999999;134360;2025-03-12 07:30:00;2025-03-12 07:39:59
319.8;319.86;319.98;319.55;17257491.3;53970;2025-03-12 07:40:00;2025-03-12 07:49:59
319.88;319.74;319.98;319.72;21772345.699999996;68060;2025-03-12 07:50:00;2025-03-12 07:59:59
319.74;319.46;320;319.05;142743038.8;446780;2025-03-12 08:00:00;2025-03-12 08:09:59
319.47;319.17;319.62;319.17;38793959.89999999;121490;2025-03-12 08:10:00;2025-03-12 08:19:59
319.17;319.08;319.18;318.82;114862033;360060;2025-03-12 08:20:00;2025-03-12 08:29:59
319.08;318.85;319.18;318.82;37435063.900000006;117360;2025-03-12 08:30:00;2025-03-12 08:39:59
318.86;318.94;318.94;318.84;11445194.9;35890;2025-03-12 08:40:00;2025-03-12 08:49:59
318.94;318.83;319.18;318.82;56561700.60000001;177280;2025-03-12 08:50:00;2025-03-12 08:59:59
318.83;318.95;319.18;318.83;66854225;209570;2025-03-12 09:00:00;2025-03-12 09:09:59
318.95;319.09;319.14;318.9;30375353.7;95220;2025-03-12 09:10:00;2025-03-12 09:19:59
319.07;319.2;319.2;318.83;59604721.599999994;186840;2025-03-12 09:20:00;2025-03-12 09:29:59
319.2;318.7;319.2;318.5;195157913.00000003;612360;2025-03-12 09:30:00;2025-03-12 09:39:59
318.68;318.75;318.77;318.5;80934915.30000001;254080;2025-03-12 09:40:00;2025-03-12 09:49:59
318.76;318.79;318.87;318.53;48744407.39999999;152930;2025-03-12 09:50:00;2025-03-12 09:59:59
318.78;319.39;319.89;318.38;522223041.3;1637460;2025-03-12 10:00:00;2025-03-12 10:09:59
319.39;318.96;319.5;318.68;118466513.10000002;371270;2025-03-12 10:10:00;2025-03-12 10:19:59
318.89;318.55;318.9;318.48;125755399.90000002;394670;2025-03-12 10:20:00;2025-03-12 10:29:59
318.56;318.59;318.79;318.21;266935099.59999996;838140;2025-03-12 10:30:00;2025-03-12 10:39:59
318.6;318.52;319.3;318.41;385909659.7000001;1210580;2025-03-12 10:40:00;2025-03-12 10:49:59
318.52;317.12;318.57;316.7;1024629631.6000003;3226890;2025-03-12 10:50:00;2025-03-12 10:59:59
317.12;317.55;317.87;316.74;545012790.7000002;1717870;2025-03-12 11:00:00;2025-03-12 11:09:59
317.45;316.69;317.9;316.33;626337185.9000003;1976620;2025-03-12 11:10:00;2025-03-12 11:19:59
316.74;316.6;316.74;315.8;728624311.3999999;2304620;2025-03-12 11:20:00;2025-03-12 11:29:59
316.58;317.32;317.72;316.23;305146801.5;962830;2025-03-12 11:30:00;2025-03-12 11:39:59
317.31;317.49;317.57;317.05;221604317.50000003;698190;2025-03-12 11:40:00;2025-03-12 11:49:59
317.47;317.08;317.75;316.93;180294600.6;567940;2025-03-12 11:50:00;2025-03-12 11:59:59
317.11;317.72;318.02;316.83;236743304.2;745430;2025-03-12 12:00:00;2025-03-12 12:09:59
317.74;317.62;318.32;317.6;255763005.4999999;804240;2025-03-12 12:10:00;2025-03-12 12:19:59
317.62;317.8;318.31;317.5;82693004.3;260220;2025-03-12 12:20:00;2025-03-12 12:29:59
317.78;317.78;317.9;317.18;145754533.39999998;459210;2025-03-12 12:30:00;2025-03-12 12:39:59
317.72;317.81;318;317.48;170713888;536990;2025-03-12 12:40:00;2025-03-12 12:49:59
317.8;318.15;318.18;317.76;96604710.20000002;303800;2025-03-12 12:50:00;2025-03-12 12:59:59
318.17;317.95;318.19;317.75;129962114.39999999;408650;2025-03-12 13:00:00;2025-03-12 13:09:59
318.01;318.11;318.15;317.78;82261181.50000003;258730;2025-03-12 13:10:00;2025-03-12 13:19:59
318.11;318.67;318.67;317.95;139746660.39999986;438930;2025-03-12 13:20:00;2025-03-12 13:29:59
Версия 11.4.0.54. Что не так?
 
Сбер перешел на версию 11.4.0.54.
По их предложению установил.
И сразу появились временами задержки при передвижении позиции мышкой.
Т е двигаешь, ничего не меняется, но через секунд 20-60 позиция перемещается.
Эффект проявляется не всегда, возможно при активном движении рынка.
До этого работал на версии 8 как самой устойчивой и надежной.
Возможно придется обратно откатиться.
Что скажут разработчики. Что не так?
Имена параметров ТТП и других данных торгового сервера MOEX
 
http://ftp.moex.ru/pub/ClientsAPI/ASTS/Bridge_Interfaces/MarketData/
http://ftp.moex.ru/pub/ClientsAPI/ASTS/Bridge_Interfaces/MarketData/Equities­31_Info_Russian.htm
Вопрос разработчикам. Как указать "Время окончания срока действия заявки "?
 
Нигде не нашел конкретное описание и установку данного параметра
------------------------
В документации по QUIK
параметр указан на русском языке :  Время истечения=124141
------------------------
В документации по QLua
аналогичный параметр  есть лишь в описании таблицы заявок :
expiry_timeNUMBERВремя окончания срока действия заявки в формате <ЧЧММСС  DESIGNTIMESP=19552>. Для GTT-заявок, используется вместе со сроком истечения  заявки (Expiry)
----------------------
Просьба объяснить каким образом установить данный параметр на Lua и при ручном вводе заявки.
Если это есть в документации, то дайте ссылку.
проблема с параметром "expiry_time "
 
Добрый день,
В формате таблицы "Заявки"   есть параметр
expiry_timeNUMBERВремя окончания срока действия заявки в формате <ЧЧММСС  DESIGNTIMESP=19552>.
Нигде не смог найти как этот параметр установить.
На демо сервере его установка никак не проявляется.
При ручном вводе заявки не увидел данного параметра.
Кто может пояснить, возможность его применения.  
Проблема с нажатием клавиш в таблице пользователя
 
Добрый день,
В своей таблице использую обработку нажатия правой и левой кнопки мыши.
С левой все нормально, а справой такая проблема
После обработки нажатия правой кнопки мыши в моем колбеке,терминал выдает предложение сортировки:



Как сделать так, чтобы это предложение не появлялось.
как найти единый счет
 
Вопрос к разработчикам.
Тестирую на демо поиск счата таким образом:
-------------------------
str="trade_accounts";
for i=0,getNumberOf(str)-1 do x=getItem(str,i) if string.find(x.class_codes,c) then account=x.trdaccid; break; end end
--------------------
Все находит замечательно.
Но на реальном едином счете, счет не находится.
Что не так?
Установка точного времени
 
Добрый день,
Иногда можно замечать, как время сервера брокера куда-то убегает относительно времени компьютера и времени сделок.
-----------------------
В моей практике были случаи, когда сервер брокера отставал.
Получалось прикольно, время сделок было в будущем.
----------------------  
Особенно важным становится знание точного времени в момент открытия торгов,
если Вы совершаете сделки на открытие.
-------------------------
Как известно, все биржи сверяют свои часы по серверам точного времени.
--------------------
Сделал это на своем компьютере.
Проверить насколько точно синхронизирован ваш компьютер можно здесь:
https://www.ntp-servers.net/
у меня так:


Про синхронизацию ПК можно прочитать здесь:

https://learn.microsoft.com/ru-ru/windows-server/networking/windows-time-service/windows-time-servic...

https://support.hanwhavision.com/hc/en-us/articles/26570683589529-How-to-Setup-an-NTP-Server-on-Wind...

Сервер лучше брать российский из этого пула:


Как исправить QUK без переустановки?
 
Вопрос к разработчикам.
Тестирую скрипт на версии 13. и 10. Ошибка одна и та же.
При вылете скрипта возникает ошибка системы с сообщением.


Удаление файлов с расширением dat не исправляет ошибку.
Исправить можно лишь переустановкой QUIK.
-------------------  
Переустанавливать каждый раз при такой ошибке очень муторно.
----------------------  
Предполагаю, что QUIK записывает какую-то информацию в служебный файл  и после этого выдает всегда эту ошибку.
===============
Какой файл удалить чтобы QUIK  нормально загрузился при возникновении данной ошибки.
===============
Для особо непонятливых поясняю. Сообщение о нехватке памяти -является фейком,
так как при переустановке с тем же или даже меньшим объемом свободной памяти  QUIK нормально работает до очередного затыка в скрипте.
сообщение в Telegram - это просто
 
Код
token="......"  --робот в telegram
chat_id="....." --ваш в telegram
curl="C:/Windows/System32/curl.exe --silent --output null "..'"'.."https://api.telegram.org/bot"..token.."/sendMessage?chat_id="..chat_id.."&text="
------------------------------
mes="привет!!"   --сообщение
os.execute(curl..mes..'"');  --отправляем
Циклические массивы - это просто
 
https://habr.com/ru/articles/828602/
Проблема версии 11.2.0.16
 
Обнаружил такой эффект.
делаем так:

1) Вызываем QUIK Junior, но не подключаемся к серверу.
2) Открываем  любой индикатор в отдельном окне Например ADX

3) Удаляем второе окно
В результате QUIK зависает, окно не удаляется.
4) Принудительно убиваем QUIK
Страницы: 1 2 3 4 След.
Наверх