Функция CreateDataSource заказывает данные баров, не данные индикатора по ним. Его же надо рассчитать. А кто его рассчитает, если график с индикатором не открыт. Если не хотите считать индикатор, то только считывать его с графика, который должен быть открыт. С другой стороны, MACD - это просто две скользящих. Что его считать...
Те, кто совершают такие сделки, да и большинство других "денег" не пользуются терминалом Квик. Да и зачем, если можно встать в стойку у ядра биржи.
Для всех есть регламент подачи заявок. Там и ограничения прописаны. Хочешь много - плати. И платят.
Как раз физ. лица часто просят добавить задержки в скрипты, чтобы их алгоритм не пытался бороться с заведомо более быстрыми алгоритмами, иначе приходит счет за чрезмерную активность.
Владимир, Вас опять куда-то в сторону уводит. Причем здесь разработчики терминала. Биржа, как и ее электронная площадка - это место и для спекулянтов, и для инвесторов, и для физ. лиц., и для юр. лиц и т.д.
Правила устанавливает частная коммерческая организация ПАО Мосбиржа или NASDAQ, или другая, под контролем соответствующих контролирующих органов, например SEC.
Возможно Вы только недавно для себя открыли этот новый мир, но он уже давно существует в таком виде.
Основа - это некое C# консольное приложение (многопоточный сервер), принимающее данные от lua скрипта и отправляющее уже сообщения в чат телеграм. Я предпочитаю делать так, дабы не связываться с проблемами совместимости библиотек lua.
Сначала сделал передачу данных на внутренний сервер через сокеты, но медленно оказалось. Переделал на Named Pipes, быстрее намного. Пришлось написать библиотеку Named Pipe клиента для lua.
Пока сделал только отправку сообщений, т.к. это самая частая просьба.
Вот я и не знаю. Лога получения нет, пытаюсь смоделировать. Надо ждать сильных движений а рынке, чтобы брокеры нагрузились. Может и у меня проблема, но эта часть кода уже столько времени работает...
Написал тестовый скрипт, чтобы отловить это. Раз было сказано, что TIME соответствует LAST, то, по идее, время не может стать меньше. Если поймается ошибка, то будет очевидно где проблема.
Да, конечно, OnParam это просто сигнал. Котировка получается через параметр LAST внутри колбека. Я не добавлял логирование в этом месте, по понятным причинам. Но реакция на значение была отмечена в другом месте.
Олег написал: Идея хорошая, а можно показать краткий пример?
Это сложный вопрос. В самом lua нет многопоточности, поэтому надо организовать некие сущности, хранящие состояния и ждущие ответа. Проще всего это сделать на хеш-таблицах, т.е. на обычных таблицах.
Вы можете при подаче транзакции записать данные в некую таблицу по ключу, допустим код инструмента + номер транзакции. А далее организовать ожидание когда в этой таблице появится ответная информация. Ответ может туда записаться, в частности колбеком, или сами, опрашивая сделки, ордера, запишете.
Как только ответ получен, делаете что-то дальше. Нет ответа - пропускаете этот инструмент, ждете дальше. Тогда вы не будете зависеть от того как приходят ответы. В какие-то дни быстро, в какие-то очень медленно. Бывало до 10 минут доходило. Вы не можете предсказать когда он придет, поэтому и не можете поставить некое значение переменной ожидания в простом цикле. Как организовать ожидание, и саму подачу транзакции, здесь уже как удобнее. Можно через corutine, запуская их и проверяя в них состояние транзакции. Если нет ответа приостанавливаете ее и переходите к следующей.
Можно самому сделать некую сущность "Задача" и периодически опрашивая пул текущих задач, закрывать завершенные. А можно просто сделать таблицу транзакций, опрашивать ее и проверять состояние самой транзакции (допустим, записанное колбеком onTransReply), ордера, записанное другим колбеком и т.д.
Как правильно заметил Anton, сначала надо определиться что за заявку отправляете. Если цена "рыночная", то да, можно ожидать исполнения.
Что касается ожиданий, здесь вопрос организации этих циклов. Корректно не делать их в колбеках. Т.е. отправил транзакцию из main, там же циклы. А колбеки - это просто семафоры, что есть что-то. Также советую не делать циклы ожидания на транзакции. Если, допустим, скрипт работает с несколькими инструментами, то пока Вы ждете по одному, другие не смогут свои сигналы отработать. Лучше сделать так, чтобы ответный сигнал вызывал реакцию, но не простой всего алгоритма. Т.е. пока идет сигнал можно было бы выполнять что-то другое.
Зависит от схемы написания Вашего скрипта. Можете использовать колбек, как сигнал, что сделка прошла. Можете, наоборот, сами читать таблицу сделок, запоминая, допустим, последний индекс, для уменьшения последующих выборок.
Что касается времени срабатывания, то здесь нет понятия "нормально". Можно было бы сказать среднеожидаемое, и оно, действительно, будет небольшим, до 1 сек. Но сервер брокера может быть загружен, канал связи может плохим и т.д. Так что время может вырастать до минут.
Впрочем, еще есть один вариант, что некорректно производится ожидание сигнала, допустим, цикл ожидания в колбеке.
Зачем спорить, тем более что аргументы как в детском саду. Это был просто пример. Пишите дальше. Для себя. Единственно что, хотелось бы на данном форуме не видеть комментариев не по теме.
Владимир, года при выполнении такой простой команды getSecurityInfo('TQBR', 'SBER') получите nil, хотя у Вас будет подписка на поток данных по этому инструменту, то, возможно, вернетесь к этому вопросу.
Я не очень понимаю, что Вы так зацепились к этому времени, что в каждой теме призываете его синхронизировать. Мне не надо измерять реакцию колбека. Мне просто надо узнать диапазон колебания цены за квант времени. Т.е. начал измерять в реальном времени и закончил. Что там было в прошлом не интересует. Проще всего это сделать с OnParam и колбеком DataSource. Запоминаешь цены, сбрасываешь, когда данные не нужны.
Но если OnParam выдает неактуальные данные, то их надо либо фильтровать, либо не использовать этот колбек. Вот и возникает вопрос фильтрации по времени, если пришли данные из прошлого, то пропустить их.
А AllTrades - самый затратный вариант, хоть и более надежный т.к. у него время есть в потоке данных. Но не у всех включен поток обезличенных сделок. Если заказываем через Тиковые данные, приходят долго. После каждого разрыва связи и при новом заказе надо ждать пока придет последняя сделка, а это тоже долго. Плюс некоторые брокеры вообще не дают этот поток пока не позвонишь в поддержку.
Колбек DataSource самый медленный, возможны пропуски данных.
Подниму старое. Сегодня брокер выдал в OnParam по фьючерсу RIZ0 цену последней сделки из прошлого. В 17.37 цена была одна, а колбек выдал цену где-то на пол часа назад, очень далекую от текущей.
Вопрос: поможет ли как-то время последней сделки в этот же момент в колбеке. Т.е. будет ли время сделки TIME соответствовать тому, что получается из параметра LAST?
Уж очень не хочется переходить на обезличенные, тем более, что там порядок сделок тоже не соблюдается иногда.
Не зачем, наверно. Но если использовать единый подход для форматирования, то он должен быть единым.
С другой стороны, не очень понятно зачем вообще применять форматирование для чисел типа integer. tostring итак их выводит корректно. Если только вы не гарантируете тип integer для номера заявки. Но тогда это будет уже другой разговор.
Касательно предложения в 10 вопросе tostring(math.tointeger(x) or x), попробуйте данное решение на числе tostring(math.tointeger(1.16*100) or 1.16*100) Увидите, что не работает.
Добрый день. В одном из сообщений было сказано, что ваш тестовый контур срочной секции транслируется биржей. Когда на нем появятся 19 знаков? А то как-то странно получается.
Не замечал такой проблемы на этой версии. Единственное что, я не останавливаю поток через sleep. После заказа идет возврат в main и периодически проверяется все ли данные загружены. Приходят долго, но приходят.
local sleep = _G.sleep
local isRun = true
function _G.main()
local sec_code = 'SRZ0'
local class_code = 'SPBFUT'
local ds = _G.CreateDataSource(class_code, sec_code, _G.INTERVAL_M5)
if not ds then
isRun = false
end
local index = 0
if isRun then
while isRun do
local last = ds:Size()
if last ~= 0 then
while index < last-1 do
index = index + 1
ds:T(index)
end
ds:Close(last)
ds:T(last)
end
sleep(100)
end
end
end
Он с ошибкой, как у меня было (Close вместо C). Но хотелось бы внятного сообщения, типа - попытка индексировать значение nil.
И еще особенность: скрипт, упавший с этой ошибкой повторно не запустить, кнопка "Запустить" не активна. Приходится удалять и заново добавлять.
Сегодня тоже первый раз (за все время использования версий > 8.5) словил такую ошибку на 8.8.4.3.
При этом это не тики, а M5, и произошла она на уже загруженных данных. Т.е. это была новая порция, скорее всего. Индекс бара фиксируется в переменной перед чтением.
Скрипт упал, хотя часть кода работы с свечками обернута pcall.
С другой стороны, никакой доп. информации нет, поэтому пока могу предположить, что это именно доступ к барам, как и в примере выше. Но кто знает, что это было на самом деле. Хотелось бы, конечно, чтобы секции pcall давали больше информации.
Это безумно много. Если только Вы не храните в таблицах обезличенные сделки или некие расчеты на огромное число ключей. Но даже с этим больше 50-100 мб. это явно где-то утечка. Возможно часто получаются данные произвольных таблиц.
Я на > 8.5 версиях больше 70 мб. не получал. При 20 мб. я уже начинаю отлаживать и исправлять утечки памяти или оптимизировать код.
А почему она там должна выскочить? Если колбек выполняется, то там 1, а если висит основной поток, то, по идее, колбек не выполнится. Либо, можно предположить, что после "отвисания" он просто вызовет все колбеки в очереди. Последовательно.
For floating-point numbers, Standard Lua uses double precision. It represents each number with 64 bits, 11of which are used for the exponent. Double-precision floating-point numbers can represent numbers withroughly 16 significant decimal digits, in a range from -10308 to 10308. (Small Lua uses single-precisionfloats, with 32 bits. In this case, the range is from -1038 to 1038, with roughly seven significant decimaldigits.)
Any integer up to 2^53 (which is 9007199254740992) has an exact representation as a double-precisionfloating-point number. Integers with larger absolute values may lose precision when converted to a float.
Поэтому если число имеет тип math.type = integer, то до 2^53 (9007199254740992) нет проблем представления. А если это уже double, то его не будет.
TGB написал: https://cloud.mail.ru/public/5iZb/2NSAPmJem - ссылка на мою тестовую программу (с кодами и инструкцией по ее запуску). Старая ссылка удалена. При запуске этой программы дампы возникают быстро (у меня в течении 5 минут), но в произвольные моменты. Эта же программа (с dll оттранслированными для Lua 5.1) непрерывно (месяцами) без проблем работает во всех версиях QUIK < 8.5. Одна из функций данной программы, которая включена сейчас по умолчанию, это тестирование автоматического управления памятью в QLua. Особенностью теста является высокая нагрузка (1500 обращений в секунду) на управление автоматической памятью QLua в условиях многопоточности. Можете также посмотреть обсуждение по ссылке https://forum.quik.ru/forum10/topic5119/?PAGEN_1=3 , начиная с комментария № 145.
А Ваше решение только под qlua? Тесты на vanilla lua 5.3 не пробовали запускать? Тогда бы было понятно, что проблема именно в реализации qlua.
Еще больший расход памяти будет если объявить локальную переменную и в нее записывать полученный результат. Память тратится как раз на хранение текущих и промежуточных данных. Каждый раз получая данные с сервера, их надо хранить. В вашем примере переменная глобальная, но ее бы стоило инициализировать ранее, чтобы под нее была выделена память.
А сбрасывается память при автоматическом запуске garbage collector. При этом очищается "мусор", т.е. выделенная память под локальные переменные (неиспользуемые ключи таблиц и т.д.), которые уже не нужны. Вы также можете вручную запустить collectgarbage, но разработчики не советуют это делать.
nikolz написал: Есть очень простое решения проблемы статуса сессии. Делаем раз - синхронизируем компьютер по серверу времени. Это позволяет нам синхронизироваться с временем биржи с погрешностью не более 0.01 сек Делаем два - пишем константы начала и конца сессий Делаем три - где надо и не надо просто сравниваем текущее время с константами и решаем какое сейчас состояние сессии без каких либо кодов с биржи ------------------------ Самое смешное в том, что биржа(брокер) свои коды формируют точно так же.
Так и делаем как дублирующий слой. Зачастую так надежней. Но времена меняются иногда, в этом проблема.
Nikolay написал: А теперь скажите где это описано в справке? Скажем, чтобы новичок разобрался. Я уже не говорю про англоговорящего пользователя.
Что именно написано? то что везде параметры называются одинаково? кажется это и так очевидно.
Какой такой QPILE? Мы говорим про реализацию qLua. Вы же предлагает читать документацию по QPILE как дополнение к qLua. При этом это не сказано в руководстве по языку qLua. Поставьте себя на место новичка, впервые открывшего терминал в 2020 г., желающего написать скрипт на qLua. Ваша справка такова, что вам приходится постоянно отвечать на простейшие вопросы, вместо того, чтобы пользователь просто прочитал.
Nikolay написал: chm можно открыть только на Windows (без сторонних программ). Часто разработка ведется в других средах, где проще открыть pdf файл.
В чем проблема скачать инструкцию в pdf с нашего сайта?
Никаких, кроме того, что там нет описания параметров. Как я и сказал, пользуемся online справками.
Цитата
1) В терминале QUIK есть так называемые формальные заголовки (их видно при выводе по DDE) 2) В терминале QUIK есть язык QPILE, в котором есть функция GET_PARAM_EX, которая принимает значения из п.1 3) В терминале QUIK есть язык QLUA, в котором есть функция getParamEx, которая тоже принимает значения из п.1
А теперь скажите где это описано в справке? Скажем, чтобы новичок разобрался. Я уже не говорю про англоговорящего пользователя. Но это уже отдельная тема, итак не по теме автора.
видимо читать так "В справке info.chm есть раздел Значения параметров функций" зачем дублировать одну и ту же информацию дважды?
Тогда и весь документ "Интерпретатор языка Lua" стоит исключить - зачем дублировать. Правда он еще есть в English варианте, а справку english qlua.chm не видел.
chm можно открыть только на Windows (без сторонних программ). Часто разработка ведется в других средах, где проще открыть pdf файл.
У нас есть pdf документ по языку, справка chm по языку, справка chm по терминалу. Параметры функции (причем здесь терминал) описаны в справке к терминалу. Замечу при этом, что раздел "Значения параметров функций" расположен в части "Алгоритмический язык QPILE". Уверены что это дублирование информации? Формально, описания параметров для функции языка qlua getParam(Ex) нет.
Впрочем, будем продолжать пользоваться online справками.
Я уже просил сделать заполнение параметров отвечающих за время открытых сессий (как это сделано для срочной секции). Но для фондовой сессии заполняется только времена аукциона. Если я правильно помню ответ: все вопросы к бирже.
Если есть поток транзакций, то надо сохранить "ключи транзакций" и по приходу ответа уже что-то делать. Можете организовать некую таблицу с ключами равными номерам транзакций, а в колбеке проверять, что такой ключ есть и выполнять какие-то действия.
Правда Вам стоит сразу задуматься и о некой уникальности ключа транзакции. Сейчас Вы просто смотрите на номер транзакции. Но если Вы запустите два скрипта одновременно, то гарантий уникальности уже не будет. Стоит проверять не только номер, но и инструмент. Плюс при отправке транзакции можно добавить некий комментарий, а в колбеке фильтровать по нему же, чтобы получить свой колбек, а не соседнего скрипта.
Ему волю дай так он всю возможную память сожрет... Не разобрались еще в проблеме? Хотя бы выяснили в чем причина?
Проверьте на предмет "поврежденных" открытых графиков. Т.е. повреждены данные. У меня были такие после обновления. Выявил путем последовательного закрытия и перезапуска. У меня отжирал всю виртуальныю память.
Еще на версии 8.х самопроизвольно в таблицу текущих торгов и в настройки закзанных потоков данных добавляются инструменты. Обычно это фьючерсные контракты. Каждый раз убираешь и снова сами добавляются. Скажете, что брокер, но у меня вопрос - почему у брокера есть возможность добавлять мне в поток и в таблицы данные.
Ваш тестовый контур тоже транслируется биржей? Хоть это и технологические изменения, но не очень понятно почему меняется позиция. Вар. маржа, суммовая позиция - это понятно, но количественный баланс не очень.