Nikolay написал: И сравнивать изделия для созерцания наскальных графиков, читай TW, с средством быстрой доставки команд и данных - очень некорректно. Одно для масс, уткнувшихся в мизерный экранчик через "всёпожирающий" браузер, другой для организации потока данных и обработки команд. У Квика нет задачи стать WEB, удобным для графиков, красивых интерфейсов и прочая. Назвать удобным Quik сложно, но задачу он свою решает. Я бы наоборот выкинул лишнее и сделал более открытым внутренний API. А кому надо рисовать картинки, красивые кнопочки, AI, настройка цветов - да, стоит выбирать брокеров с web терминалами.
Присоединяюсь за открытый API и формат данных в архиве.
Для случая нормальной работы можно использовать время начала и завершения торгового дня из предыдущей сессии. Если это выходные, то из предыдущих выходных.
Nikolay написал: Предложите способ корректного выключения терминала по времени. Возникла задача останавливать все в определенное время. Но способы через скрипты Power-Shell, CMD использующие Stop-Process, taskkill - приводит к некорректному завершению терминала, без записи состояния. Нужен способ, чтобы терминал выполнил все действия при завершении.
nikolz написал: Так как скрипт исполняется при каждом изменении ТТП и при этом останавливает основной поток QUIK, то он тормозит работу терминала.
При каждом изменении ТТП исполняется только первая строка. Проверка по времени - не лучший вариант. Частенько бывают задержки возобновления торгов после клиринга. К тому же, торги могут быть приостановлены по конкретному инструменту; на срочном такое не редкость. Проверку состояния сессии можно проводить непосредственно перед отправкой заявки, и, если инструмент не торгуется, устанавливать соответствующий флаг. А потом, в цикле контролировать возобновление торгов.
Если торги остановлены, то поэтому инструменту не будут вызываться колбеки. Что в таком случае надо еще ?
Nikolay написал: Это календарные спреды. Да торгую. Также, после известных событий, для обычных фьючерсов тоже диапазон цен может быть расширен в отрицательную область.
Если правильно понимаю, то это торговля опционами. Верно?
Nikolay написал: Проверять на 0 цены - это плохая затея, т.к. во-первых, есть инструменты с допустимой ценой = 0, а во-вторых, для срочного рынка во время клиринга, для фондовой между сессиями цена может "бегать" от 0 до последней. Собственно в период, когда торги не идут, данные с сервера могут приходить какие угодно. Так что уже лучше время проверять, обеспечив точность своих часов. У меня сделано через несколько проверок, время, статус, сделки. И если один из них не проходит, то данные не считываются, т.к. получить цену 0 как рабочую - это проблема для алгоритмов.
Относительно времени согласен, неоднократно писал на форуме. Синхронизация компа с сервером точного времени позволяет иметь погрешность не более 20 мс. Относительно нулевой цены у инструментов. Вы такими торгуете? Можно список?
Ziveleos написал: param_image = "открыта" или, что то же самое, param_value = 1
На срочном у меня так:
Код
function OnParam (class, sec)
if class = = "SPBFUT" and (sec = = Tr[ 1 ].sec or sec = = Tr[ 2 ].sec) then
local sessn = ( getParamEx ( "SPBFUT" ,sec,"TRADINGSTATUS").param_image = = "открыта" )
if sessn and (cond & 0x0080 = = 0x0080 ) then
cond = cond & 0xFF7F -- Сброс "Сессия стоп".
SetColor (tw_id, 5 , - 1 , - 1 , - 1 , - 1 , - 1 )
elseif not sessn and cond & 0x0080 = = 0 then
cond = cond | 0x0080 -- "Сессия стоп".
SetColor (tw_id, 5 , - 1 , yellow, - 1 , - 1 , - 1 )
end
end
end
Так как скрипт исполняется при каждом изменении ТПП и при этом останавливает основной поток QUIK, то он тормозит работу терминала. Чтобы это устранить, можно сделать отключение скрипта, если сессия открыта для всех торгуемых инструментов, либо по времени.
Dmitry989 написал: Добрый день! Вопрос: При добавлении на график инструментов с припиской TOM данных общего спроса/предложения, отображается история только за текущую торговую сессию. Возможно ли что-то сделать, чтобы в терминале отображались данные по предыдущим торговым сессиям? Задавал вопрос брокеру, они предложили каждый день сохранять файл настроек квика, однако если закружать терминал на следующий день по этому файлу, данные спроса/предложения за сохраненную сессию не сохраняются. Спасибо!
У меня скрипт пишет в файл и отображает в дальнейшем историю из этого файла. Делаю так индикатор "отношение общего спроса/предложение".
Изменение наименований режимов торгов в системе валютного рынка
Сообщаем вам, что с 3 января 2018 года в "боевой" торгово-клиринговой системе валютного рынка будут изменены текстовые наименования некоторых режимов торгов:
BoardID
Старый BOARDNAME
Новый BOARDNAME
Старый LATNAME
Новый LATNAME
AETS
Дополнительная сессия ЕТС
Дополнительная сессия
Additional session UTS
Additional session
CASH
Расчетная сессия ЕТС
Расчетная сессия
Settlement session UTS
Settlement session
CETS
Торговая сессия ЕТС
Системные сделки
Trading session UTS
System deals
На тестовых серверах INETCUR и SPCUR режимы будут переименованы с 21 декабря 2017 года.
Тони написал: а можно пояснить, что такое АЛОР? звучит интересно)на сколько я знаю, биржевая комиссия = 0, если брать фьючерсы лимитками (типа мейкер), а на акции это не распространяется (так мне сказали в финаме) (п.с. за исключением опр. тарифов, где нет комиссии за урегулирование сделок).
АЛОР это брокер, один из старейших.
Да, на срочке если работаешь лимитками как мейкер то биржевая комиссия = 0 При торговле акциями на основной сессии так же если работаешь лимитками как мейкер биржевая комиссия так же = 0
По этой причине считать что комса на тиньке хорошая не совсем верно, 0,05% это много по сравнению с другими брокерами На Атон у меня 0,025% на финам 0,035%
Если не ошибаюсь, то АЛОР берет мзду, за перевод денег к ним по СБП.
nikolz написал: Немного неточное сравнение банки( они брокеры) и брокеры(у них есть свои банки) это не проф разработчики торовых систем. Это клиенты разработчиков. Клиенты банков - это простые смертные физ или юр лица. ----------------- QUIK - это разработчик систем для банков и брокеров. их клиенты - банки и брокеры. ----------------- Терминал QUIK изначально был задуман и реализован как способ подачи заявок брокеру. ----------------- Все, что в него добавлено с времен его создания- это библиотека QLUA и модернизация графики с различными плюшками. Но изначальное его назначение осталось прежним. -------------------- Велосипед не создан, чтобы летать. Так зачем пытаться прыгать на нем с крыши высотки?
с одной стороны верно, но с другой стороны, кто мешает "осовременить" дизайн? если вы создали офис только для того чтобы принимать товар от клиентов, то почему нельзя со временем модернизировать и улучшить внешний вид этого офиса? это как пример приведено.
или если quik интерфейс будет похож (определенными моментами) на Trading view вы будуете против и требовать вернуть прошлый дизайн?)
Полагаю потому, что брокеры и банки получают деньги от клиентов. А QUIK Получат деньги от брокеров и банков. Как говорят: "Кто деньги платит тот и девушку танцует" ----------------- Очевидно, терминал в таком виде брокеров устраивает. -------------------- Прикольно, но на этом форуме нет ни одной жалобы или предложений от банков или брокеров по терминалу. ----------------- А вот клиенты этих банков и брокеров жалуются не тем, кому платят, а почему-то на этом форуме. ----------------- "Требую продолжения банкета"
Немного неточное сравнение банки( они брокеры) и брокеры(у них есть свои банки) это не проф разработчики торовых систем. Это клиенты разработчиков. Клиенты банков - это простые смертные физ или юр лица. ----------------- QUIK - это разработчик систем для банков и брокеров. их клиенты - банки и брокеры. ----------------- Терминал QUIK изначально был задуман и реализован как способ подачи заявок брокеру. ----------------- Все, что в него добавлено с времен его создания- это библиотека QLUA и модернизация графики с различными плюшками. Но изначальное его назначение осталось прежним. -------------------- Велосипед не создан, чтобы летать. Так зачем пытаться прыгать на нем с крыши высотки?
системные CETS, TMS( режим для небольших лотов (до 999 единиц)) внесистемный CNGD ( Аукцион открытия, Аукцион обновления цен, сделки по курсу ЦБ WAP* и сделки фикс FIX) частичное исполнение OTCT
При использовании библиотеки Lua utf8 спецификация не требуется.
Однако, если вы хотите использовать спецификацию, сначала необходимо вызвать функцию utf8.bom().
Эта функция вернёт спецификацию для UTF-8.
Получив BOM, вы можете использовать функцию utf8.char() для создания символа в кодировке UTF-8.
Эта функция принимает два аргумента: первый — кодовая точка символа, второй — количество байтов для символа. Например, чтобы создать символ «a», используйте следующий код:
local a = utf8.char(0x61, 1)
Кодовая точка для буквы «a» — 0x61, а количество байт для буквы «a» — 1.
Вы также можете использовать функцию utf8.codes() для получения кодовых точек строки в кодировке UTF-8. Эта функция принимает строку в качестве единственного аргумента и возвращает таблицу кодовых точек. Например, чтобы получить кодовые точки для «abc», используйте следующий код:
local abc = "abc" local codePoints = utf8.codes(abc)
Кодовые точки для «abc» — {0x61, 0x62, 0x63}.
Если вам нужно узнать количество байтов для символа в кодировке UTF-8, вы можете использовать функцию utf8.len(). Эта функция принимает строку в качестве единственного аргумента и возвращает количество байтов в строке. Например, чтобы узнать количество байтов для строки «abc», используйте следующий код:
local abc = "abc" local numBytes = utf8.len(abc)
Количество байтов в слове «abc» равно 3.
Вы также можете использовать функцию utf8.offset(), чтобы получить смещение байта для конкретной кодовой точки в строке UTF-8. Эта функция принимает два аргумента: первый — строка, второй — кодовая точка. Она возвращает смещение байта для кодовой точки. Например, чтобы получить смещение байта для кодовой точки 0x61 в строке «abc», используйте следующий код:
local abc = "abc" local offset = utf8.offset(abc, 0x61)
Смещение байта для кодовой точки 0x61 в строке «abc» равно 1.
Одно из расширенных применений библиотеки utf8 — нормализация строк в кодировке UTF-8. Нормализация — это процесс, обеспечивающий одинаковое представление всех эквивалентных строк. Например, строка «é» может быть представлена как «é» или «\u00e9». Нормализация гарантирует, что обе строки будут представлены как «\u00e9».
Чтобы нормализовать строку в кодировке UTF-8, можно использовать функцию utf8.normalize() Эта функция принимает два аргумента: первый — строка для нормализации, второй — форма нормализации Форма нормализации может быть одной из следующих:
NFC: нормализованная форма канонической композиции. Это форма по умолчанию.
NFD: каноническая декомпозиция формы нормализации.
NFKC: нормализованная форма совместимости составов.
NFKD: разложение на составляющие совместимости форм нормализации.
Например, чтобы преобразовать строку «é» в форму NFC, нужно использовать следующий код:
local s = "é" local normalized = utf8.normalize(s, "NFC")
Нормализованная строка — «\u00e9».
У библиотеки utf8 есть множество других применений. Дополнительную информацию можно найти в справочном руководстве по Lua
Нормализация — это процесс, обеспечивающий единообразное представление всех эквивалентных строк. Это важно, поскольку некоторые системы могут не распознавать строки в разных формах как эквивалентные. Например, строка «é» может быть представлена как «é» или «\u00e9». Нормализация гарантирует, что обе строки будут представлены как «\u00e9».
Существует четыре формы нормализации: NFC, NFD, NFKC и NFKD. NFC — это форма по умолчанию.
NFC: форма нормализации канонической композиции. В этой форме все составные символы объединяются в один символ. Например, строка «a\u0300» (что эквивалентно «à») будет нормализована до «\u0061\u0300» (что эквивалентно «à»).
NFD: нормализованная форма канонического разложения. В этой форме все символы раскладываются на составляющие. Например, строка «\u0061\u0300» (что эквивалентно «à») будет нормализована до «a\u0300» (что эквивалентно «à»).
NFKC: композиция совместимости форм нормализации. В этой форме все символы объединяются в один символ, а все совместимые символы преобразуются в их канонические эквиваленты. Например, строка «\u0061\u0300» (эквивалентная «à») будет нормализована до «\u0061\u0300» (эквивалентной «à»), а строка «\uFB01» (эквивалентная «fi» с точки зрения совместимости) будет нормализована до «\uFB01» (эквивалентной «fi» с точки зрения канонического соответствия).
NFKD: разложение на составляющие для совместимости с формой нормализации. В этой форме все символы разлагаются на составляющие, а все символы совместимости преобразуются в их канонические эквиваленты. Например, строка «\u0061\u0300» (эквивалентная «à») будет нормализована до «a\u0300» (эквивалентной «à»), а строка «\uFB01» (эквивалентная «fi» с точки зрения совместимости) будет нормализована до «\uFB01» (эквивалентной «fi» с точки зрения канонического соответствия).
Существует несколько причин, по которым может потребоваться нормализация строки. Например, перед сохранением строк в базе данных может потребоваться убедиться, что все эквивалентные строки представлены одинаково. Это обеспечит корректное извлечение строк из базы данных.
Ещё одна причина нормализовать строку — сортировка. Если строки не нормализованы, они могут сортироваться неправильно. Например, строка «é» (эквивалентная «e») будет отсортирована раньше, чем строка «ê» (эквивалентная «e»), хотя они эквивалентны.
Ещё одна причина — обеспечение корректного сравнения двух строк. Если строки не нормализованы, они могут сравниваться некорректно. Например, строка «é» (эквивалентная «e») будет считаться отличной от строки «ê» (эквивалентной «e»), хотя они являются эквивалентными строками.
Эта библиотека обеспечивает базовую поддержку кодировки UTF-8. Все её функции представлены в таблице utf8. Эта библиотека не обеспечивает никакой поддержки Unicode, кроме работы с кодировкой. Любая операция, требующая понимания значения символа, например классификация символов, выходит за рамки её возможностей.
Если не указано иное, все функции, принимающие в качестве параметра позицию байта, предполагают, что указанная позиция является либо началом последовательности байтов, либо равна длине исходной строки плюс единица. Как и в библиотеке string, отрицательные индексы отсчитываются от конца строки.
Функции, создающие последовательности байтов, принимают все значения вплоть до 0x7FFFFFFF, как определено в исходной спецификации UTF-8. Это подразумевает последовательности байтов длиной до шести байтов.
Функции, которые интерпретируют последовательности байтов, принимают только допустимые последовательности (хорошо сформированные и не слишком длинные). По умолчанию они принимают только последовательности байтов, которые приводят к допустимым кодовым точкам Unicode, отвергая значения больше 10FFFF и заменяющие их. Логический аргумент lax, когда он доступен, снимает эти проверки, так что принимаются все значения до 0x7FFFFFFF. (Неправильно сформированные и слишком длинные последовательности по-прежнему отклоняются.)
utf8.char (···)
Принимает ноль или более целых чисел, преобразует каждое из них в соответствующую последовательность байтов UTF-8 и возвращает строку, представляющую собой объединение всех этих последовательностей.
utf8.символьный шаблон
Шаблон (строка, а не функция) «[\0-\x7F\xC2-\xFD][\x80-\xBF]*» , который соответствует ровно одной последовательности байтов UTF-8 при условии, что объект является допустимой строкой UTF-8.
utf8.codes (s [, lax])
Возвращает значения, необходимые для построения
for p, c in utf8.codes(s) do body end
выполнит итерацию по всем символам UTF-8 в строке s, где p — позиция (в байтах), а c — кодовая точка каждого символа. Если встретится недопустимая последовательность байтов, возникнет ошибка.
utf8.codepoint (s [, i [, j [, lax]]])
Возвращает кодовые точки (в виде целых чисел) всех символов в s, которые начинаются между байтовой позицией i и j (включительно). По умолчанию для i установлено значение 1, а для j — i. При обнаружении недопустимой последовательности байтов возникает ошибка.
utf8.len (s [, i [, j [, lax]]])
Возвращает количество символов UTF-8 в строке s, которые начинаются с позиций i и j (оба значения включительно). По умолчанию для i установлено значение 1, а для j — -1. Если обнаруживается недопустимая последовательность байтов, возвращается fail плюс позиция первого недопустимого байта.
utf8.offset (s, n [, i])
Возвращает позицию (в байтах), с которой начинается кодировка n-го символа s (отсчет ведется с позиции i). При отрицательном n возвращаются символы до позиции i. По умолчанию для i установлено значение 1, если n неотрицательно, и #s + 1 в противном случае, то есть utf8.offset(s, -n) возвращает смещение n-го символа от конца строки. Если указанный символ отсутствует в строке или находится сразу после ее конца, функция возвращает fail.
В особом случае, когда n равно 0, функция возвращает начало кодирования символа, содержащего i-й байт s.
Эта функция предполагает, что s является допустимой строкой UTF-8.
Эта библиотека обеспечивает базовую поддержку кодировки UTF-8. Все её функции представлены в таблице utf8. Эта библиотека не обеспечивает никакой поддержки Unicode, кроме работы с кодировкой. Любые операции, требующие понимания значения символа, например классификация символов, выходят за рамки её возможностей.
Если не указано иное, все функции, принимающие в качестве параметра позицию байта, предполагают, что указанная позиция является либо началом последовательности байтов, либо единицей плюс длина исходной строки. Как и в библиотеке строк, отрицательные индексы отсчитываются от конца строки.
utf8.char (···)Принимает ноль или более целых чисел, преобразует каждое из них в соответствующую последовательность байтов UTF-8 и возвращает строку, состоящую из объединения всех этих последовательностей.utf8.charpatternШаблон (строка, а не функция) «[\0-\x7F\xC2-\xF4][\x80-\xBF]*» (см. Шаблон), который соответствует ровно одной последовательности байтов UTF-8 при условии, что объект является допустимой строкой UTF-8.utf8.codes (s)
Возвращает значения, необходимые для построения
for p, c in utf8.codes(s) do body end
выполнит итерацию по всем символам в строке s, где p — позиция (в байтах), а c — кодовая точка каждого символа. При обнаружении недопустимой последовательности байтов возникает ошибка.
utf8.codepoint (s [, i [, j]])Возвращает кодовые точки (в виде целых чисел) всех символов в s, которые начинаются в диапазоне от i до j (включительно). По умолчанию для i установлено значение 1, а для j — i. При обнаружении недопустимой последовательности байтов возникает ошибка.utf8.len (s [, i [, j]])Возвращает количество символов UTF-8 в строке s, которые находятся между позициями i и j (включительно). По умолчанию для i установлено значение 1, а для j — -1. Если обнаруживается недопустимая последовательность байтов, возвращается ложное значение и позиция первого недопустимого байта.utf8.offset (s, n [, i])Возвращает позицию (в байтах), с которой начинается кодировка n-го символа s (отсчет ведется от позиции i). Отрицательное значение n соответствует символам перед позицией i. По умолчанию i равно 1, если n неотрицательно, и #s + 1 в противном случае, так что utf8.offset(s, -n) соответствует смещению n-го символа от конца строки. Если указанный символ отсутствует в строке или находится сразу после ее конца, функция возвращает nil.
В особом случае, когда n равно 0, функция возвращает начало кодирования символа, содержащего i-й байт s.
Эта функция предполагает, что s является допустимой строкой в кодировке UTF-8.
Последнее обновление: Вт, 26 июня, 13:27:21 -03 2018
Он использует данные, извлечённые из базы данных символов Unicode, и протестирован на Lua 5.2.3, Lua 5.3.0 и LuaJIT.
parseucd.lua — это скрипт на чистом Lua, который генерирует unidata.h для поддержки преобразования символов и проверки их категории.
Он совместим с собственным модулем строк Lua и проходит все тесты на сопоставление строк и шаблонов в наборе тестов Lua2.
Он также добавляет несколько полезных функций для работы с UTF-8, таких как:
удобный интерфейс для экранирования последовательностей Юникода в строках.
вставка/удаление строк, поскольку извлечение подстроки в кодировке UTF-8 может быть затратным.
вычисление ширины Юникода, полезное при реализации, например, эмулятора консоли.
полезный интерфейс для преобразования смещений в Юникоде и байтовых смещений.
проверка строк в кодировке UTF-8 на корректность и удаление недопустимых последовательностей байтов.
преобразование строк Unicode в обычный формат.
Обратите внимание, что во избежание конфликта со встроенной библиотекой utf8 в Lua5.3 эта библиотека создает файл с расширением lua-utf8.dll или lua-utf8.so. Поэтому используйте ее следующим образом:
KaylHin написал: По поводу производительности: да, getQuoteLevel2 тяжёлый, особенно при частых вызовах. У себя реализовал кеширование с интервалом по времени, если прошло менее 300 мс с предыдущего вызова, использую кеш. Это сильно снизило нагрузку и ускорило работу скрипта в моменты высокой активности на рынке.
Для этого существует колбек OnQuote - изменение стакана котировок --------------- тогда getQuoteLevel2 вызывается только для нового значения. При этом если стакан пустой, то и колбек не вызывается.
Поэтому никаких HFT роботов не построите. Тогда нет особого смысла обрабатывать тики.
А как ещё получить структуру объема если не по ТОС. Задачи построить HFT робота у меня нет, основная торговля на часовике.
Т е у Вас робот выставляет заявки на тайме 1 час, а Вы для этого строите гистограмму объема сделок по тикам? Верно понимаю? Интересный подход. Вы тестили такую стратегию на истории или прочитали где-то успешность такого подхода? Интересно увидеть результат. Сомневаюсь, что в этом есть какой-то смысл. -----------
Acaw написал: Мне нужно считать структуру объема, дельту соответственно, ловить крупные сделки. Может так и надо брать данные из таблицы, запоминая последний индекс и собирая данные от него и до конца таблицы. Searchitems не вариант, он фактически проходит по всей таблице, а это долго, т к. в ней несколько млн записей, а то и десятков млн, а данные нужны в постоянном режиме. Поэтому надеялся на параллельный поток, который постоянно будет накапливать нужные данные.
Таблица обезличенных сделок не закачивается сначала при каждом соединении. Закачка начнется с того места где остановились при разрыве соединения. Если долго не соединялись, то есть еще докачка пропущенных данных. Поэтому лучше при соединении, историю забрать из таблицы, а текущие данные получать из колбека. Это будет быстрее и меньше грузить процессор. --------------- Но не обольщайтесь, если инструментов много, то работать по тикам может тормозить. Причем, так как данные приходят блоками, то время сделок будет существенно запаздывать. Поэтому никаких HFT роботов не построите. Тогда нет особого смысла обрабатывать тики.
--предположим у Вас 4 числовых параметра X1<1024(10бит),X2<1024(10бит),X3<64(6 бит),X4<64(6 бит)
--Вам надо их упаковать в одно число transID, которое 32 бита.
function set_to_transID(x1,x2,x3,x4) return (((((x2<<10)+x1)<<10)+x3)<<6)+x4; end --упаковываем
function get_from_transID(Y) -- распаковываем
local m1=(1<<6)-1; local z=Y>>6; local z1=z>>10; return z1&((1<<10)-1), z1>>10, z&m1,Y&m1;
end
--тест:
local transID=set_to_transID(1023,1021,63,62);
print(transID)
x1,x2,x3,x4=get_from_transID(transID);
print(x1,x2,x3,x4)
настроил то, что нужно. Убрал, что не нужно. Для начала внимательно изучите на что подписаны и уберите все, что не нужно. Например, если включите опционы, то будут прилетать 10 000 инструментов. А оно Вам нужно?
У меня , при восстановлении соединения, все таблицы обрабатываются заново, как при первом соединении. Поэтому мне все равно в каком порядке будут записаны в нее ордера.
Nikolay написал: Что значит новые. С утра установлены заявки, они получили индексы в таблице ордеров. В 12:30 брокер разрывает связь, тут же восстанавливает, но при этом вызывает колбек OnCleanUp. Все таблицы очищаются. После происходит восстановление записей в таблицах (при этом приходят все колбеки заново). Далее смотрим на эти записи и видим, что ордер с индексом 15 стал 20. И так по всем записям - все вперемешку. Смотрим на таблицу ордеров в интерфейсе, там порядок записей такой же ка был изначально.
Проблема решена через блок поиска ордеров, который все равно в скриптах есть, но назвать это ожидаемым - вряд ли.
Что такое "таблица ордеров в интерфейсе" ? Заявки в таблице заявок записаны в других строках, чем были раньше? Верно?
"Если не знаете, то файловая система это тоже база данных." - это шедевр! А какой версии SQL там используется, СУБД тоже имеется? может, что то упустил за 25 лет в ИТ.
Ликбез: ------------------- Базы данных (БД) бывают разных типов, которые отличаются структурой и областью применения. Среди основных видов — реляционные, нереляционные, иерархические и сетевые, а также простейшие. ----------------------- Базы данных на основе файлов (flat-file databases) — это простой метод хранения данных в текстовом файле. В отличие от традиционных реляционных баз данных, в которых используются сложные структуры с таблицами, строками и столбцами, база данных с плоскими файлами организует данные линейным и последовательным образом. Особенности:
Каждая строка в файле представляет одну запись.
Отдельные поля внутри записи обычно разделяются разделителями, такими как запятые или табуляции.
Нет структур для индексирования или распознавания связей между записями.
Виды Базы данных с плоскими файлами подходят для небольших приложений и временного хранения данных. Некоторые случаи использования:
файлы конфигурации в программных приложениях;
обмен данными между различными системами;
файлы журналов, например, лог-файлы веб-сервера.
Форматы Для хранения данных в базах данных с плоскими файлами используются, например:
CSV (значения, разделённые запятыми) — каждое поле разделяется запятой.
TSV (значения, разделённые табуляцией) — в качестве разделителей используются табуляции, что полезно, когда запятые — часть самих данных.
Формат фиксированной ширины — каждое поле занимает заранее определённое количество символов, выравнивая данные по столбцам.
Инструменты Многие языки программирования и приложения имеют встроенную поддержку чтения и записи данных из баз данных с плоскими файлами. Например:
Программы для работы с электронными таблицами (Microsoft Excel, Google Sheets) — могут читать и работать с плоскими файлами.
Языки программирования (Python, Java) — могут анализировать и обрабатывать данные с помощью встроенных или сторонних библиотек.
Недостатки Базы данных с плоскими файлами имеют и ограничения. Некоторые из них:
Ограниченная масштабируемость — по мере роста объёма данных производительность базы данных может снижаться.
Отсутствие согласованности данных — если нужно обновить несколько записей, это становится утомительной задачей и увеличивает вероятность несоответствий.
Сложность извлечения данных — из-за отсутствия поддержки структурированного языка запросов (SQL) запросы часто требуют ручного сканирования и фильтрации через записи.
Ограниченный одновременный доступ — базы данных с плоскими файлами не предназначены для одновременного доступа нескольких пользователей или приложений.
------------------------------------------
SQL ( Structured Query Language — «язык структурированных запросов») — применяемый для создания, модификации и управления данными в реляционных базах данных. ----------------------- Нереляционные базы данных В нереляционных БД не используется табличная схема строк и столбцов. Применяется модель хранения, оптимизированная под конкретный тип данных. Некоторые типы нереляционных БД:
Документоориентированные. Данные хранятся в виде документов в форматах JSON, BSON или XML.
Колоночные. Информация хранится не в строках, а в столбцах.
Графовые. Данные представлены в виде графов, что упрощает их хранение и поиск.
- --------------------------- Для работы с нереляционными базами данных (NoSQL) используются специализированные языки запросов. Это связано с особенностями моделей данных в таких базах: данные могут храниться в виде документов, колонок, графов или на основе пар «ключ-значение». Ниже приведены примеры языков запросов для работы с базами данных MongoDB, Cassandra, BigTable и GraphDB.
MongoDB MongoDB Query Language (MQL) — язык запросов для документо-ориентированной базы данных MongoDB. Запросы формулируются как объекты JSON, что делает их интуитивно понятными. MQL поддерживает операции CRUD (создание, чтение, обновление и удаление), а также функции агрегирования для фильтрации, сортировки и группировки данных.
Cassandra Cassandra Query Language (CQL) — основной язык запросов для распределённой базы данных Apache Cassandra. Синтаксис похож на SQL, но оптимизирован для принципов NoSQL: горизонтальной масштабируемости, высокой доступности и партиционированного хранения данных. CQL не поддерживает традиционные SQL-соединения, а поощряет денормализацию — дублирование данных по таблицам для эффективного запроса.
BigTable Собственный язык запросов — BigTable не поддерживает язык запросов SQL. Запросы выполняются через API, который поддерживает ряд популярных языков программирования (Java, Python, C#, C++). Изначально нет схемы данных, но возможна поддержка пользовательской схемы.
GraphDB Cypher — язык запросов для графовых баз данных, например, Neo4j. Cypher — декларативный язык, позволяет создавать, обновлять и удалять вершины, рёбра, метки и свойства, а также управлять индексами и ограничениями. Другие языки запросов:
Gremlin — поддерживается базой данных Titan, позволяет выполнять базовые операции с элементами графа (создание, обновление и удаление вершин, рёбер, меток и свойств).
А Вы у брокера не спрашивали зачем он это делает? Может имеет смысл уйти от такого брокера?
У меня пять брокеров, а также есть логи работы скриптов, наверно, почти по всем более менее крупным брокерам. По опыту - у всех свои тараканы. Да и выйти в техподдержке на живого человека, который хоть как-то поймёт о чем речь - это тот ещё тот квест и уйма времени. Плюс, если такие события происходят, значит необходимо предусматривать такое поведение, мы же с деньгами работаем, а не картинки показываем на сайте.
В моей практики такого не было. --------------- Поясните подробнее, что означает появление новых заявок. Вы их не делали?
Nikolay написал: В последнее время один из брокеров стабильно стал разрывать соединение в середине торговой сессии и после восстановления соединения очищает таблицы, вызывает колбек OnCleanUp. Можно было бы сказать какого и зачем все чистить, но с этим уже бороться бессмысленно.
Более важно другое, после восстановления соединения в таблице ордеров наблюдаются совсем другие индексы записей. Был у записи индекс 15, а стал 20. Хотя визуально таблица (без фильтров и сортировок ) представлена именно как была ранее, и там запись до сих пор 15.
Ранее такого поведения не наблюдалось. Сейчас приходится вводить дополнительные методы для восстановления соответствия записей и запомненных данных.
А Вы у брокера не спрашивали зачем он это делает? Может имеет смысл уйти от такого брокера?
nikolz написал: Артем , Пишу алгоритм своего решения вашей задачи: Если понял ее не правильно, то уточните, что не так. --------------------- Алгоритм: 1) Создаем файл , в котором записываем в строку : Имя инструмента, A1,A2,....An где A1,A... - параметры наших индикаторов (уровней) Т е в файле столько строк, сколько всего инструментов наблюдаем Прим: Можно сделать для каждого инструмента свой файл. Имя файла ==имя инструмента. -------------------------- В опCalculate на кажом тике: 1) читаем имя инструмента 2)Читаем из файла строку параметров индикаторов данного инструмента 3) Выводим на график индикаторы
совершенно не понятное решение, в моем скрипте все уже реализовано через базу данных, зачем какие то текстовые файлы? я предельно четко сформулировал 2 вопроса. Вот они : 1) Как ПРОГРАММНО перевызвать Init или аналог его чтобы заполнить Settings ? (программный рестарт) 2) Почему нельзя прото добавить кнопку рестарт-реинит индикатора?(ручной рестарт, и избавить пользователей от опрации удали-добавь индикатор)
Если не знаете, то файловая система это тоже база данных. ----------------- Вы спросили как сделать так чтобы не руками без Init. Я Вам написал как это сделать. ----------------------- В моем решении нет надобности что-то делать руками и нет надобности вызывать init. В моем решении нет Ваших проблем. -------------------------- Про Ваш скрипт я лучше промолчу, чтобы вас не обижать.
Артем, Пишу алгоритм своего решения вашей задачи: Если понял ее не правильно, то уточните, что не так. --------------------- Алгоритм: 1) Создаем файл , в котором записываем в строку : Имя инструмента, A1,A2,....An где A1,A... - параметры наших индикаторов (уровней) Т е в файле столько строк, сколько всего инструментов наблюдаем Прим: Можно сделать для каждого инструмента свой файл. Имя файла ==имя инструмента. -------------------------- В опCalculate на кажом тике: 1) читаем имя инструмента 2)Читаем из файла строку параметров индикаторов данного инструмента 3) Выводим на график индикаторы
nikolz написал: Артем , Можете пояснить, почему надо именно в Init найти код инструмента.
Потому что только в Init есть возможность программно изменять параметры Settings, далее во время нахождения индикатора на графике мы можем менять параметры вручную и программно только считывать их. Все бы ничего если бы в индикаторе было до 10 параметров, но если их 50-100, это превращается в издевательство.
Правильно Вас понял, что Вы меняете параметры у встроенных в QUIK индикаторов. Поэтому так извращаетесь?. вставьте функции нужных индикаторов в скрипт и меняйте все что хотите у них
Встроенные индикаторы, меня не интересуютот слова совсем, у меня своих достаточно. Рассмотрим простой пример, есть индикатор в котором используется дневной ATR , как параметр. Покажите как программно изменить этот параметр в индикаторе при наступлении следующего дня. Можно зайти и руками поправить (супер), но становится грустно когда графиков штук 50, нужно найти этот ATR для каждого инструмента и забить ручками, при этом человеческий фактор никто не отменял. Здесь становится намного проще просто удалить-добавить индикатор, но тоже проделать данную операцию 20 -30 раз, такое себе.
Могу показать, если выложите скрипт И на примере подробно расскажите .
major написал: Вот два квика. В одном много вкладок в другом мало, в одном роботы в другом нет )))) Один память жрет другой проц ))))
в одном проц 3% а памяти 1,8 гигов в другом проц 12% а памяти 0,5 гига
У меня открыто 8 окон, на которых примерно 100 индикаторов. --------------- Легко нагрузить процессоры скриптами, так как функция Main без sleep или event грузить одно ядро до 100%..
При торговле у меня процессор грузится на 1-3%. Это тоже не напрягает. В это время либо пишу программы, либо смотрю фильм на втором мониторе, либо беседую с DeepSeek, либо гуляю по интернету. Если смотрю кино, то еще 12% нагрузка на CPU.
nikolz написал: Время начальной загрузки в большей степени связана с получением данных с сервера брокера.
Может быть у вас - да. Но остальные пользователи QUIK - не вы. У меня, например, QUIK гораздо дольше грузится до момента появления окна авторизации с сообщением "чтение файла данных".
у меня есть подтверждающее видео
1) с какой скоростью запускается мой торговый терминал 12 версии с 4 фьючерсами, очищенными логами 2) с какой скоростью запускается чистая 12 версия 3) с какой скоростью - чистая 8 версия (с такими же настройками, как у 12 версии)
с подтверждением конфигурации компьютера: i9-13980HX/64RAM/2TB SSD Можете пока погуглить характеристики этого процессора.
В этой части согласен. В этот момент строятся все графики и исполняются скрипты индикаторов аж по два раза. Но меня это как-то не напрягает. -------------------------- Я говорил от том моменте, когда связь с сервером установлена. Это тоже не влияет на торговлю. Но дело вкуса.
nikolz написал: Артем , Можете пояснить, почему надо именно в Init найти код инструмента.
Потому что только в Init есть возможность программно изменять параметры Settings, далее во время нахождения индикатора на графике мы можем менять параметры вручную и программно только считывать их. Все бы ничего если бы в индикаторе было до 10 параметров, но если их 50-100, это превращается в издевательство.
Правильно Вас понял, что Вы меняете параметры у встроенных в QUIK индикаторов. Поэтому так извращаетесь?. вставьте функции нужных индикаторов в скрипт и меняйте все что хотите у них.
VPM написал: nikolz, _ Ни о каком лучше или хуже речь не идет, речь о надежности, промышленной надежности. Мой пример реализован в модуле, то есть можно использовать в OnCalculate, так и в потоке main создавая псевдонимы функций.
Вот реализация для индикаторов
Код
Для меня, то, Ваш скрипт от 26.06.2025 15:35:14 выглядит излишне сложным. Я делал подобные конструкции лет 10 назад. ------------------ Ваше утверждение о "промышленной надежности" мне не понятно. ------------------- В общепринятом смысле, Промышленная надёжность — это свойство объекта сохранять работоспособность в течение заданного времени в определённых условиях эксплуатации. ---------------------- О каком объекте Вы говорите (Ваш скрипт ???), но это не промышленный объект. --------------------