Проверьте, что запускаете в корректной версии. В последних версиях Квика две версии lua 5.3.5 и 5.4.1. Если не выбираете в версию при запуске, то выбирается по умолчанию из настроек.
Как все таки сделать http запрос из Lua?
Пользователь
Сообщений: Регистрация: 27.01.2017
17.12.2021 16:20:29
Что значит зачем. Lua не имеет встроенной поддержки web soсket. Поэтому необходимы библиотеки (а не программы), чтобы сие действие стало доступно. Ссылки на сборки библиотек недавно обсуждались.
статус заявки: выставленной по стоп-лоссу, снята, а не активна
Пользователь
Сообщений: Регистрация: 27.01.2017
15.12.2021 18:22:47
Если речь про срочный рынок, то цену активации необходимо задавать конкретным значением. Например, рассчитать как сдвиг стоп-цены на 100-200 шагов цены, помня о зависимости ГО от цены. Но, как уже обсуждалось, не факт, что проскальзывание будет меньше. Поэтому контролировать связанный лимитный ордер необходимо.
Также ситуацию когда стоп ордер исполнен, а лимитный ордер не установлен, тоже необходимо контролировать. При этом учитывать, что просто может долго приходить ответ об его установке, а не кидаться и закрывать позицию самому. А то в итоге выйдет уже не закрытие позиции.
статус заявки: выставленной по стоп-лоссу, снята, а не активна
Пользователь
Сообщений: Регистрация: 27.01.2017
15.12.2021 18:02:24
Не на всех рынках есть понятие "По рынку". Если после активации ордера лимитный ордер не смог пройти контроль лимитов цен, достаточности средств, то он не будет зарегистрирован. Правда, статус стоп-ордера должен быть "исполнен" т.е. не активный и не снят. А вот биты 10 и 11 как раз могут говорить о причине проблемы.
Перестал работать SERVERTIME. не могу понять в чём проблема
Пользователь
Сообщений: Регистрация: 27.01.2017
11.12.2021 12:57:48
Проще можно, но когда сервер начнет возвращать данные не в ожидаемом формате, то придется уже разбирать формат.
Если же для себя пишешь, то конечно, можно упрощать. Правда надо помнить, что 9 утра сегодня - это больше чем 22:00 вчера. Если же просто время сравнивать, то будет ошибка.
Вопрос по написанию скрипта
Пользователь
Сообщений: Регистрация: 27.01.2017
08.12.2021 09:09:03
Пишите скрипт с интерфейсом. Он будет показывать сигналы (для примера ). Пишите скрипт, отправляющий сигналы на почту, телеграм.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 27.01.2017
07.12.2021 12:11:00
Ну появился он в 5.2
Баги QUIK 8.13
Пользователь
Сообщений: Регистрация: 27.01.2017
06.12.2021 12:21:50
Да, так можно проверять. Собственно уже сколько лет так и проверяется.
Но необходимо учитывать еще, что есть настройка "Получать данные раз в секунд".
Если там установлено не 0, то необходимо это учитывать. Впрочем, параметр у Вас есть для этого.
Также еще необходимо учитывать, что SERVERTIME не всегда возвращается в виде 8-и символов.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 27.01.2017
03.12.2021 09:58:41
Для уточнения: о каких функциях речь? Любых пользовательских, или только о подписанных колбеках и функциях qlua?
Не скажу, что у меня тысячи функций, но я предпочитаю разбивать код. Поэтому у меня их достаточно много. Какой-то существенной нагрузки не наблюдаю.
Не всегда исполняется require в начале скрипта
Пользователь
Сообщений: Регистрация: 27.01.2017
03.12.2021 09:53:59
Пару раз словил странное явление: Есть скрипт использующий библиотеки. Был запущен один, который использовал библиотеку, расположенную в одной из папок отладки. Потом был запущен другой скрипт, использующий ту же библиотеку (то же имя), но уже из рабочей папки.
Второй скрипт при этом не использовал корректную библиотеку, а тоже использовал отладочную от прошлого запуска другого скрипта. Не показалось (как можно было бы подумать), т.к. у меня все модули выводят в лог свою версию.
Перезапуск терминала решил проблему.
Так что про кэш мысли возникали.
комппиляция под 9 квик
Пользователь
Сообщений: Регистрация: 27.01.2017
01.12.2021 16:46:50
А, речь про компиляцию скрипта. Да, синтаксис такой же.
luac.exe -s - o luac_file_name file_name
Точно запускаете в той же версии? Я иногда забываю нажать список выбора версии lua.
комппиляция под 9 квик
Пользователь
Сообщений: Регистрация: 27.01.2017
01.12.2021 16:38:43
Не очень понятна проблема. Если речь про lua 5.4, то все как обычно - использовать lua54.lib и include h файлы.
Тейк профит и стоп-МАРКЕТ заявка для луа, стоп-заявка проскальзывает, так как стоит стоп-лимит
Пользователь
Сообщений: Регистрация: 27.01.2017
01.12.2021 09:35:09
Скорее всего просто нарушено форматирование при сохранении или уже при чтении проблема алгоритма.
Лучше пойти путем хранения самого контекста скрипта. Для примера, есть некое состояние, скажем State - это таблица с необходимыми данными. Мы ее сохраняем в файл в виде сериализованой таблицы. Тогда чтение будет через одну единственную команду loadfile.
Для сериализации таблицы состояния можно воспользоваться любым итерационным (рекурсивным) методом:
Лишь бы он позволял хранить восстанавливаемые данные через loadfile.
Файл должен выглядеть примерно так:
return { filed = 1, field2 = 'some_string', inner_t = { b = 2, c = 3 }
}
т.е. как простой код lua
Quik - чтение почты
Пользователь
Сообщений: Регистрация: 27.01.2017
30.11.2021 18:52:01
Цитата
Иван написал: Спасибо за развернутый ответ. Можно пример с вашей консольной программы.
Она написана на C#. Я её ещё не выкладывал в открытый доступ.
Но, все можно найти в примерах MailKit:
Quik - чтение почты
Пользователь
Сообщений: Регистрация: 27.01.2017
30.11.2021 18:19:32
Речь не про консольную команду, а про консольную программу - читай сервис постоянно работающий и читающий почту.
В примере, что был приведен, видны зависимости:
Код
local imap4 = require 'imap4'
local ssl = require("ssl")
т.е. необходимо иметь библиотеку imap4, ссылка на которую была приведена. Также, если используется ssl, то необходима ssl.
Если посмотреть на код библиотеки imap, то видно, что для ее работы необходима socket
Код
local socket = require 'socket'
Поэтому необходимый минимум - это библиотеки imap и socket, что и было написано выше.
Тейк профит и стоп-МАРКЕТ заявка для луа, стоп-заявка проскальзывает, так как стоит стоп-лимит
Пользователь
Сообщений: Регистрация: 27.01.2017
29.11.2021 13:53:26
Цитата
Предпочитаю именно этот подход
Да, но важно отметить, что в таком случае важно обеспечить постоянную работоспособность алгоритма, вне зависимости от отключения связи и электропитания.
Тейк профит и стоп-МАРКЕТ заявка для луа, стоп-заявка проскальзывает, так как стоит стоп-лимит
Пользователь
Сообщений: Регистрация: 27.01.2017
29.11.2021 13:41:11
Есть варианты: - увеличивать отступ исполнения стоп-ордера, чтобы была больше вероятность исполнения отправленной лимитной заявки (но, возможно, больше будет ГО) - не ставить стоп физически, а отслеживать цену алгоритмом и закрывать "по рынку" исходя из текущей ситуации, если алгоритм решил, что стоп сработал. - более сложный вариант отслеживания активации стопа. После того как получен признак что стоп исполнен, проверять установку связанного с ним лимитного ордера и его исполнение. Если он не исполнен, снимать его алгоритмом и ставить новый исходя из текущей цены. Т.е. реализовать алгоритм "гонки за ценой". Т.к. мы никогда не знаем какая в будущем будет ситуация в момент активации стопа (т.е. угадать отступ), то, по хорошему, какой-то вариант "гонки" все равно необходимо реализовать.
Также не стоит забывать про битовые флаги 10 и 11 стоп ордера:
бит 10 (0x400) - Стоп-заявка сработала, но была отвергнута торговой системой бит 11 (0x800) - Стоп-заявка сработала, но не прошла контроль лимитов
Ордер может исполнится, а лимитный ордер вообще не прошел. Позиция останется, если это не контролировать.
Основные библиотеки для QLua 5.4.1
Пользователь
Сообщений: Регистрация: 27.01.2017
26.11.2021 11:59:52
С одно стороны да, иметь как вариант неплохо было бы. Но стабильность всего этого дела (одна сборка работает, другая нет - это про ssl), уже давно заставила пойти другим путем. А именно - написание программ реализующих отправку, прием запросов. А терминал(ы) уже с ней общается. В таком варианте все уходит в NET (я выбрал C#). А там уже все "их коробки".
Из-за специфики Lua библиотеки мало кто поддерживает. Они старые. Если бы разработчики терминала реализовали бы методы HTTP requset, доступные в qlua, многие бы вопросы ушли.
Как часто у вас вызывается DataSource:Callback?
Пользователь
Сообщений: Регистрация: 27.01.2017
25.11.2021 16:57:12
Более информативным был бы скрипт где есть три потока: Получение данных LAST для цены последней сделки Данные таблицы обезличенных сделок Данные от CreateDataSource
Последний самый медленный. Между его обновлениями десятки сделок могут пройти. Исключение Тиковый график, он равносилен обезличенным сделкам.
QUIK QLua подстановка с описанием для редакторов Lua
Пользователь
Сообщений: Регистрация: 27.01.2017
24.11.2021 20:02:50
Я так понимаю это просто файл макет, чтобы он был проиндексирован LS с поддержкой аннотаций как (сам им пользуюсь).
ищу программиста создать программу на платной основе, выгружать данные OHLC и индикаторы в файлик
Пользователь
Сообщений: Регистрация: 27.01.2017
24.11.2021 12:35:27
Нашел у себя старый скрипт, причесал немного. Вроде делает, что хотите.
Quik - чтение почты
Пользователь
Сообщений: Регистрация: 27.01.2017
23.11.2021 09:55:44
Если не использовать SSL, то достаточно socket - найдете здесь imap -
Если же использовать SSL, то необходимо иметь luasec. Я стабильно работающую с 5.4 и 5.3 не нашел.
Поэтому, чтобы не зависеть от библиотек lua, уже давно написал себе консольную программку, читающую почту и записывающую в файлы, которые уже скрипт читает и обрабатывает.
ищу программиста создать программу на платной основе, выгружать данные OHLC и индикаторы в файлик
Пользователь
Сообщений: Регистрация: 27.01.2017
22.11.2021 16:40:45
Речь про то, что если с графика, то график необходимо открыть, установить идентификаторы, индикаторы и т.д.
А если данные заказать, то ничего открывать не надо. Единственное когда это имеет смысл - это если есть какой-то экзотический индикатор без известного алгоритма.
Основные библиотеки для QLua 5.4.1
Пользователь
Сообщений: Регистрация: 27.01.2017
22.11.2021 15:22:36
Просто сборкой там не обойтись, надо код править.
Основные библиотеки для QLua 5.4.1
Пользователь
Сообщений: Регистрация: 27.01.2017
22.11.2021 14:37:51
Это я собирал для lua 5.1. Для 5.3 и 5.4 не собирал luaseс. Для 5.4 надо заняться.
ищу программиста создать программу на платной основе, выгружать данные OHLC и индикаторы в файлик
Пользователь
Сообщений: Регистрация: 27.01.2017
22.11.2021 11:10:08
А Вы точно хотите с графика данные брать? Если алгоритмы простые, то можно сделать через заказ данных. Тогда можно в списке задать настройки построения и пусть себе выгружает без открытия графика. Кажется я такое делал, надо поискать.
ищу программиста создать программу на платной основе, выгружать данные OHLC и индикаторы в файлик
Пользователь
Сообщений: Регистрация: 27.01.2017
21.11.2021 13:15:53
Работы на час-два, а столько слов сказано. Опять ударились в обсуждение зачем это надо. Просто задача малоинтересная, на самом деле.
Основные библиотеки для QLua 5.4.1
Пользователь
Сообщений: Регистрация: 27.01.2017
21.11.2021 13:09:58
Что касается базы данных, то хотелось бы, конечно, видеть стабильно работающий luasql odbc. Я пока для 5.4 не собирал. 5.3 падал постоянно. А драйверы для конкретных баз - это хорошо, но очень уж узко-применимо.
Определение экземпляра терминала в скрипте в офлаине
Пользователь
Сообщений: Регистрация: 27.01.2017
20.11.2021 15:29:19
Какова цель? Если разделить контекст запуска, что лучше через путь к рабочему каталогу терминала. Они разные будут.
По каким критериям определять, что сервер QUIK сдох
Пользователь
Сообщений: Регистрация: 27.01.2017
18.11.2021 16:31:34
Не очень понятна терминология, но т.к. сервер передает данные, то, видимо, решением вопроса будет контроль параметров, позволяющих оценить, что данные идут.
В частности, можно проверять время сервера и время последнего пришедшего пакета, и разницу между ними.
Основные библиотеки для QLua 5.4.1
Пользователь
Сообщений: Регистрация: 27.01.2017
18.11.2021 14:22:05
luasocket сборка есть здесь
Как узнать лимит доступных средств для единого счета открытие
Пользователь
Сообщений: Регистрация: 27.01.2017
17.11.2021 09:30:37
Разве getPortfolioInfoEx не поможет с этим вопросом.
Дубликаты уведомлений onOrder v9.2.2.11
Пользователь
Сообщений: Регистрация: 27.01.2017
06.11.2021 09:31:26
Это не пример, а факт, наблюдаемый каждый день. Первый вызов - появление записи, второй - присвоение номера транзакции, третий - флаг.
Дубликаты уведомлений onOrder v9.2.2.11
Пользователь
Сообщений: Регистрация: 27.01.2017
05.11.2021 18:30:01
Может и три раза, и больше.
Если вы выведите в лог все значения из входящего аргумента order, то будет видно, что при каждом вызове изменяется одно или несколько значений.
Для примера, первый вызов - появилась запись в таблице orders. Второй - присвоился номе транзакции. Третий - ордер сменил флаг состояния на "исполненный".
Демо счет.
Пользователь
Сообщений: Регистрация: 27.01.2017
03.11.2021 10:55:48
Забыл написать код клиента: 11267
Демо счет.
Пользователь
Сообщений: Регистрация: 27.01.2017
03.11.2021 10:46:57
Добрый день.
Не удается второй день подключится к демо серверу SERVER: Информационно-торговая система ARQA, IPCOMMENT: JUNIOR 1
Ни в 8-ой, ни в 9-ой версии терминала. Пароль принимает нормально. Пишет, что до истечения пароля осталось столько-то, далее: Соединение установить не удалось.
ошибка работы скрипта, ошибка появилась при смене 7 версии на 8
Пользователь
Сообщений: Регистрация: 27.01.2017
02.11.2021 10:36:09
lua предоставляет два варианта итеративной функции
Код
for line in io.lines("my.txt") do print(line) end
for line in file:lines() do print(line) end
Во втором случае - это просто "синтаксический сахар". Передавать FileRead:lines(FileRead) аргумент не надо, он уже передается при использовании нотации вызова FileRead:lines
Вы не можете заменить заявку XXX. Повторите попытку позже.
Пользователь
Сообщений: Регистрация: 27.01.2017
29.10.2021 11:49:15
Обычно такого рода задачи необходимо решать асинхронно, т.к. время ожидания недетерминировано. Заявка может появится в системе и через 200 мс и через 10 минут. Поэтому либо надо делать бесконечный цикл, что плохо, т.к. блокирует исполнение всего кода, либо ждать выполнения, периодически опрашивая: есть ответ, ордер - нет, ждем дальше.
Т.к. язык нам не предоставляет возможность сделать это асинхронно, т.е. не блокируя поток выполнения, то это можно сделать через очередь заданий.
Подаете транзакцию, создаете некий объект задача, зафиксировав все необходимое для дальнейшей проверки ее статуса и помещаете в очередь эту задачу.
Дальше выполняете какой-то другой код, не ожидая ответа, например отправить еще одну транзакцию. Для примера, надо отправить 200 транзакций по разным инструментам. Если ждать на каждой, то такая задача будет выполнятся очень долго. А так мы отправили эти 200 транзакций и поместили в очередь задачи для каждой.
Пришли колбеки, нашли задачу для этой транзакции, поставили признаки в зависимости от результата. Если не используете колбеки, то уже при опросе задачи сами проверяете, есть ли ордер как результат транзакции. Нет - ждем дальше.
Опрос задач в очереди - это вызов с нужной периодичностью метода, перебирающего активные задачи и проверяющий их. Выполнена, ошибка - отработали действия при выполнении, ошибке и убрали из очереди задачу.
Т.о. у вас очередь задач очистится по мере выполнения. Какие-то быстро, какие-то медленнее. Решать можно и через корутины и просто через цикл перебора очереди.
В вашем примере у Вас счетчик 100 при задержке 1 мс. Т.е. Вы ожидаете, что ответ придет через 100 мс. Но он ведь может прийти через 500, а может и через 50. Код менять же не будете каждый раз.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
25.10.2021 09:29:08
Цитата
От себя добавлю, если интересно: Согласен с Антоном, сам всегда использую dofile для загрузки кусков кода или модулей на луа. require также использует loadfile, но сложнее. Зачем вам все эти пути и искатели в простой задаче, когда вы знаете где и что у вас лежит?
Когда пишешь для себя, то - возможно. Когда ты не знаешь кто и как будет использовать модули, то уже не все так очевидно.
Также, что важно, require вернет уже загруженный модуль, если он уже был загружен ранее. Если скрипт - это десятки файлов, а не одна портянка, то это уже важно. С dofile это сделать можно, но тогда придется самому сделать хранилище. Т.к. я часто пишу модули в общепринятом в lua смысле, то поэтому require.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
24.10.2021 14:53:34
Раз уж эта тема стала такой абстрактной, могу сказать, что в российском сегменте общаться конструктивно сложно - практически всегда происходит переход на личности. Впрочем, это часто происходит и в реальности. Но на всяких интернет ресурсах - это просто данность. Лично мне это малопонятная данность. Поэтому проще общение строить только по конкретным вопросам, игнорируя остальное, что очень сильно мешает, либо еще проще - общаться не с русскоговорящими. Как-то в той среде разработчиков все спокойно и конструктивно происходит.
Также замечу, что вместо ответа на вопрос часто предлагают не ссылку на документацию, в чем я не вижу проблем вовсе, а высказывания - это тебе не надо, и далее уже переход в область, что ты ... такое спрашивать.
Просто взгляд со стороны, не более. Интернет у нас на кафедре подключили где-то в 94-95, так что было достаточно времени составить сравнительное наблюдение. Впрочем, это, конечно, мое сугубо личное мнение.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Для меня как раз наоборот. dofile живет в глобальном контексте, что неудобно. По сути это предкомпилированная блок кода. При этом вместо require можно использовать конструкцию типа:
Код
local lib = load(file_path)()
что, по сути, равносильно dofile, но имеет преимущества. Как минимум, можно получить код ошибки при загрузке модуля, если таковая есть. Например, переопределив dofile так
Код
function dofile (filename) local f = assert(loadfile(filename)) return f()end
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
24.10.2021 10:30:56
А почему бы Вам просто не перенести обсуждение в другое место. И вопросов не будет. Кто захочет, присоединится к общению.
Это относится и ко всем, кто хочет создать здесь тему для обсуждения. Напоминаю, что раздел форума "". Т.е. ожидаются вопросы по написанию кода, выявленных ошибках qlua. А найти специалиста - это не об этом. Итак в последнее время все больше стало абстрактного обсуждения, вместо конкретики.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
23.10.2021 13:18:09
Ну да, здесь никто не делится наработками на чистом LUA. Владимир, Вы бы для начала завели свой открытый репозитарий, скажем на GitHub, и показали хоть что-то. Не знаю как другие, но мне не составляет проблем выкладывать код. В нем ничего нет такого, что стоило бы скрывать. Где-то кривой, писалось давно. Но работает - и ладно. Да, текущие библиотеки, которые активно использую, не выкладываю, но основная причина - у меня не так много времени, чтобы отвечать на вопросы. Тысячи строк кода и десяток библиотек - одно описание всего этого займет уйму времени. Даже по тому достаточно простому коду, что выложен очень давно, часто спрашивают.
Если уже решили писать opensource проект для всех, показать всем как это надо делать, то как раз необходимо завести репозитарий, пригласить участников для разработки. Организовать где-то управление проектом, можно в том же GitHub через ZenHub или любом средстве совместной разработки.
Иначе все это пшик.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
23.10.2021 11:44:03
Дело не в критике, а в целеполагании.
Если задача написать для себя решение, то, пожалуйста, делайте. Никто не мешает.
Но когда Вы говорите, что уже хотите написать эдакий универсальный идеально рабочий скрипт, то это уже вызывает вопросы. Как минимум, что это значит и какие задачи он будет решать. А то может оказаться, что у Вас тоже точка зрения как у Владимира - мне не надо, то и другим не надо.
В конечном итоге это все равно будет решение для Вас, потому что оно будет решать что Вам необходимо.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
23.10.2021 09:16:55
Кажется, что Владимир думает за себя. раз я это ни разу не использовал, то и другим не надо. А сколько могут просить реализовать: опционы и все что с ними связно, календарные спреды, роллирование контрактов, корзина продуктов как единая позиция и балансировка, многоступенчатые входы, профиты и т.д. и т.д.
Что же касается каркаса, то это не так и сложно сделать. По сути это, наверняка, есть у каждого, кто этим занимается. Естественно модульная структура. В каркас включается "изкоуровневые" методы, типа: контроль соединения, получение заказ данных их контроль, инициализация данных по инструменту, подача транзакций, отслеживание состояния ордеров, позиции по инструментам и т.д. Т.е. то, что позволит работать с объектами, а не с сырыми методами. Также интерфейс, чтобы он строился автоматически по переданным настройкам.
Но, как правильно написали выше, это все написано под себя, под свои предпочтения. Если вы хотите работать с колбеками, то начать вам надо не с ТЗ, а с понимания как они работаю и построения временной диаграммы событий. Чтобы потом не было удивления, то колбек OnOrder может прийти раньше, чем OnTransaction.
Далее надо понять, что работа ведется в клиент-серверном окружении и все что с эти связано. Иначе будут вопросы: "почему-это ордер не появляется 10 минут. Я жму купить, а его нет. 10 раз уже нажал. А потом этот ваш ... терминал купил мне аж 1000 контрактов. Я же давал команду всего на 10."
А опционы и связанная с ними математика. Скальперы и их нюансы работы. И т.д.
Т.е. напишите вы proxy, позволяющий реализовать работу с терминалом на более высоком уровне, что, конечно, хорошо. Но это не будет конечный результат ни в коем разе.
Запись в один файл из разных скриптов.
Пользователь
Сообщений: Регистрация: 27.01.2017
23.10.2021 08:54:52
Чтобы обмениваться данными между скриптами есть достаточно средств, помимо файлов есть и решения через память:
раз: два:
И это не считая методик через socket.
Категорично говорить, что это не надо не стоит. Простой пример - передать данные из скрипта в индикатор.