Nikolay (Все сообщения пользователя)

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

Страницы: Пред. 1 ... 11 12 13 14 15 16 17 18 19 20 21 След.
Получение значения индикатора не открывая данных графика
 
Функция CreateDataSource заказывает данные баров, не данные индикатора по ним. Его же надо рассчитать. А кто его рассчитает, если график с индикатором не открыт.
Если не хотите считать индикатор, то только считывать его с графика, который должен быть открыт.
С другой стороны, MACD - это просто две скользящих. Что его считать...
Более быстрый способ, all_trades
 
Используйте функцию SearchItems, чтобы не получать данные по каждой строке. Это даст уже фильтрованный массив индексов строк по нужному инструменту.

Далее, не надо использовать table.insert. Если необходимо просто увеличивать массив, то быстрее будет сделать как t[#t+1] = value.

Так Вы просто добавляете в конец массива новый элемент.
Кто как решил вопрос уведомления о сделках?
 
Передача данных быстрая, да. А вот подключение...

Вот чистый lua, библиотека socket, никакого ssl, никакого Квика.

clock 0.007   Attempting connection to host 'localhost' and port 8005...
clock 2.06    Connected!
clock 2.06    strin = test
clock 2.06    End

Не было желания постоянно держать открытое соединение.
Предложение к разработчикам
 
Те, кто совершают такие сделки, да и большинство других "денег" не пользуются терминалом Квик. Да и зачем, если можно встать в стойку у ядра биржи.

Для всех есть регламент подачи заявок. Там и ограничения прописаны. Хочешь много - плати. И платят.


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

Правила устанавливает частная коммерческая организация ПАО Мосбиржа или NASDAQ, или другая, под контролем соответствующих контролирующих органов, например SEC.


Возможно Вы только недавно для себя открыли этот новый мир, но он уже давно существует в таком виде.
Возможно ли запустить в индикаторе функцию из dll которая подключается в другом lua-скрипте?
 
Вот пример такого решения, библиотека lua_share.

https://github.com/untoxa/lua_share
Кто как решил вопрос уведомления о сделках?
 
Сделал небольшое решение для отправки сообщений в чат бота телеграма (Telrgram Bot Api).
https://github.com/nick-nh/qlua/tree/master/telegramQuik

Основа - это некое C# консольное приложение (многопоточный сервер), принимающее данные от lua скрипта и отправляющее уже сообщения в чат телеграм. Я предпочитаю делать так, дабы не связываться с проблемами совместимости библиотек lua.

Сначала сделал передачу данных на внутренний сервер через сокеты, но медленно оказалось.
Переделал на Named Pipes, быстрее намного. Пришлось написать библиотеку Named Pipe клиента для lua.

Пока сделал только отправку сообщений, т.к. это самая частая просьба.
неужели OnParam самый быстрый?
 
Вот я и не знаю. Лога получения нет, пытаюсь смоделировать. Надо ждать сильных движений а рынке, чтобы брокеры нагрузились.
Может и у меня проблема, но эта часть кода уже столько времени работает...

Написал тестовый скрипт, чтобы отловить это. Раз было сказано, что TIME соответствует LAST, то, по идее, время не может стать меньше. Если поймается ошибка, то будет очевидно где проблема.
неужели OnParam самый быстрый?
 
Да, конечно, OnParam это просто сигнал. Котировка получается через параметр LAST внутри колбека.
Я не добавлял логирование в этом месте, по понятным причинам. Но реакция на значение была отмечена в другом месте.
Долгое исполнение сделки, Сделка на демо счете отработала более чем за 30 сек.
 
Цитата
Олег написал:
Идея хорошая, а можно показать краткий пример?
Это сложный вопрос. В самом lua нет многопоточности, поэтому надо организовать некие сущности, хранящие состояния и ждущие ответа.
Проще всего это сделать на хеш-таблицах, т.е. на обычных таблицах.

Вы можете при подаче транзакции записать данные в некую таблицу по ключу, допустим код инструмента + номер транзакции.
А далее организовать ожидание когда в этой таблице появится ответная информация. Ответ может туда записаться, в частности колбеком, или сами, опрашивая сделки, ордера, запишете.

Как только ответ получен, делаете что-то дальше. Нет ответа - пропускаете этот инструмент, ждете дальше.
Тогда вы не будете зависеть от того как приходят ответы. В какие-то дни быстро, в какие-то очень медленно. Бывало до 10 минут доходило. Вы не можете предсказать когда он придет, поэтому и не можете поставить некое значение переменной ожидания в простом цикле.
Как организовать ожидание, и саму подачу транзакции, здесь уже как удобнее. Можно через corutine, запуская их и проверяя в них состояние транзакции. Если нет ответа приостанавливаете ее и переходите к следующей.

Можно самому сделать некую сущность "Задача" и периодически опрашивая пул текущих задач, закрывать завершенные.
А можно просто сделать таблицу транзакций, опрашивать ее и проверять состояние самой транзакции (допустим, записанное колбеком onTransReply), ордера, записанное другим колбеком и т.д.
Как прочитать таблицу Текущие торги?
 
Имелось в виду, наверно, что функция loadstring вернет функцию, которую надо выполнить, т.е. вызвать через ().
Долгое исполнение сделки, Сделка на демо счете отработала более чем за 30 сек.
 
Как правильно заметил Anton, сначала надо определиться что за заявку отправляете. Если цена "рыночная", то да, можно ожидать исполнения.

Что касается ожиданий, здесь вопрос организации этих циклов. Корректно не делать их в колбеках. Т.е. отправил транзакцию из main, там же циклы. А колбеки - это просто семафоры, что есть что-то.
Также советую не делать циклы ожидания на транзакции. Если, допустим, скрипт работает с несколькими инструментами, то пока Вы ждете по одному, другие не смогут свои сигналы отработать.
Лучше сделать так, чтобы ответный сигнал вызывал реакцию, но не простой всего алгоритма. Т.е. пока идет сигнал можно было бы выполнять что-то другое.
Долгое исполнение сделки, Сделка на демо счете отработала более чем за 30 сек.
 
Зависит от схемы написания Вашего скрипта. Можете использовать колбек, как сигнал, что сделка прошла.
Можете, наоборот, сами читать таблицу сделок, запоминая, допустим, последний индекс, для уменьшения последующих выборок.

Что касается времени срабатывания, то здесь нет понятия "нормально". Можно было бы сказать среднеожидаемое, и оно, действительно, будет небольшим, до 1 сек.
Но сервер брокера может быть загружен, канал связи может плохим и т.д. Так что время может вырастать до минут.

Впрочем, еще есть один вариант, что некорректно производится ожидание сигнала, допустим, цикл ожидания в колбеке.
Как прочитать таблицу Текущие торги?
 
И да, loadstring помимо того, что медленная, еще depricated.
Как прочитать таблицу Текущие торги?
 
Странно...
Ну да ладно. assert в С появился так давно, что даже не помню. В 90-х уже был.

А что касается документации, то:
http://lua-users.org/
https://lua.org.ru/contents_ru.html
https://www.litres.ru/robertu-ieruzalimski/programmirovanie-na-yazyke-lua-9998731/
Роботы всякие и прочие глупости
 
Зачем спорить, тем более что аргументы как в детском саду. Это был просто пример. Пишите дальше. Для себя.
Единственно что, хотелось бы на данном форуме не видеть комментариев не по теме.
Роботы всякие и прочие глупости
 
Наговорили...

Владимир, года при выполнении такой простой команды getSecurityInfo('TQBR', 'SBER') получите nil, хотя у Вас будет подписка на поток данных по этому инструменту, то, возможно, вернетесь к этому вопросу.
неужели OnParam самый быстрый?
 
То что обезличенные сделки будут самыми надежными это понятно.


Но все же, параметры TIME и LAST синхронизированы? Т.е. если мне брокер прислал в колбеке цену по времени пол часа назад, то параметр TIME укажет это?
неужели OnParam самый быстрый?
 
Я не очень понимаю, что Вы так зацепились к этому времени, что в каждой теме призываете его синхронизировать.
Мне не надо измерять реакцию колбека. Мне просто надо узнать диапазон колебания цены за квант времени. Т.е. начал измерять в реальном времени и закончил. Что там было в прошлом не интересует.
Проще всего это сделать с OnParam и колбеком DataSource. Запоминаешь цены, сбрасываешь, когда данные не нужны.

Но если OnParam выдает неактуальные данные, то их надо либо фильтровать, либо не использовать этот колбек. Вот и возникает вопрос фильтрации по времени, если пришли данные из прошлого, то пропустить их.

А AllTrades - самый затратный вариант, хоть и более надежный т.к. у него время есть в потоке данных. Но не у всех включен поток обезличенных сделок. Если заказываем через Тиковые данные, приходят долго. После каждого разрыва связи и при новом заказе надо ждать пока придет последняя сделка, а это тоже долго. Плюс некоторые брокеры вообще не дают этот поток пока не позвонишь в поддержку.

Колбек DataSource самый медленный, возможны пропуски данных.
неужели OnParam самый быстрый?
 
Подниму старое.
Сегодня брокер выдал в OnParam по фьючерсу RIZ0 цену последней сделки из прошлого.
В 17.37 цена была одна, а колбек выдал цену где-то на пол часа назад, очень далекую от текущей.


Вопрос: поможет ли как-то время последней сделки в этот же момент в колбеке. Т.е. будет ли время сделки TIME соответствовать тому, что получается из параметра LAST?

Уж очень не хочется переходить на обезличенные, тем более, что там порядок сделок тоже не соблюдается иногда.
Ошибка при считывании таблицы текущих торгов
 
Если не включена трансляция параметра, то метод вернет nil вместо таблицы.
Надо проверить, что трансляция включена, либо проверить что вернулась таблица.
Уже обсуждалось https://forum.quik.ru/messages/forum10/message45773/topic5506/#message45773
Преобразование целого числа в строку в QUIK 8.8+
 
Не зачем, наверно. Но если использовать единый подход для форматирования, то он должен быть единым.

С другой стороны, не очень понятно зачем вообще применять форматирование для чисел типа integer. tostring итак их выводит корректно.
Если только вы не гарантируете тип integer для номера заявки. Но тогда это будет уже другой разговор.
Преобразование целого числа в строку в QUIK 8.8+
 
Цитата
Sergey Gorokhov написал:
https://forum.quik.ru/forum10/topic5119/
10й вопрос.
Касательно предложения в 10 вопросе tostring(math.tointeger(x) or x), попробуйте данное решение на числе tostring(math.tointeger(1.16*100) or 1.16*100)
Увидите, что не работает.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
 
Интересно, а как же тогда демо счет брокера Финам получает 19 знаков. Хотелось бы иметь полноценный тестовый контур.
Грядущие изменения на срочном рынке МБ: поддержка работы с 19-значными номерами заявок и сделок
 
Добрый день.
В одном из сообщений было сказано, что ваш тестовый контур срочной секции транслируется биржей.
Когда на нем появятся 19 знаков? А то как-то странно получается.
Перестали скачиваться тиковые данные
 
Не замечал такой проблемы на этой версии.
Единственное что, я не останавливаю поток через sleep.
После заказа идет возврат в main и периодически проверяется все ли данные загружены. Приходят долго, но приходят.
Quik 8.6 Critical error ACCESS_VIOLATION
 
Нет, не в колбеках.

Вот схематичный скрипт, падающий с этой ошибкой.

Код
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.

И еще особенность: скрипт, упавший с этой ошибкой повторно не запустить, кнопка "Запустить" не активна. Приходится удалять и заново добавлять.
Quik 8.6 Critical error ACCESS_VIOLATION
 
Отмена тревоги.
В одном месте была ошибка вызова. Вместо ds:C() вызвано ds:Close().
Quik 8.6 Critical error ACCESS_VIOLATION
 
Сегодня тоже первый раз (за все время использования версий > 8.5) словил такую ошибку на 8.8.4.3.

При этом это не тики, а M5, и произошла она на уже загруженных данных. Т.е. это была новая порция, скорее всего. Индекс бара фиксируется в переменной перед чтением.

Скрипт упал, хотя часть кода работы с свечками обернута pcall.

С другой стороны, никакой доп. информации нет, поэтому пока могу предположить, что это именно доступ к барам, как и в примере выше. Но кто знает, что это было на самом деле.
Хотелось бы, конечно, чтобы секции pcall давали больше информации.
Использование памяти скриптами Lua
 
Это безумно много. Если только Вы не храните в таблицах обезличенные сделки или некие расчеты на огромное число ключей.
Но даже с этим больше 50-100 мб. это явно где-то утечка.
Возможно часто получаются данные произвольных таблиц.

Я на > 8.5 версиях больше 70 мб. не получал. При 20 мб. я уже начинаю отлаживать и исправлять утечки памяти или оптимизировать код.
Зависание QUIK
 
А почему она там должна выскочить? Если колбек выполняется, то там 1, а если висит основной поток, то, по идее, колбек не выполнится.
Либо, можно предположить, что после "отвисания" он просто вызовет все колбеки в очереди. Последовательно.
Преобразование целого числа в строку в QUIK 8.8+
 
Только сейчас увидел, что Вы пытаетесь сделать.
lua не может преобразовать double с таким числом цифр как 9152336732254970146.0

4-ое издание Programming in Lua, глава 4 (https://www.moys.gov.iq/upload/common/Programming_in_Lua%2C_4th_ed._%282017%29_.pdf)

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, то его не будет.
Преобразование целого числа в строку в QUIK 8.8+
 
Попробуйте использовать паттерн "%.0f".
Отладка QUIK 8.8
 
Цитата
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.
Использование памяти скриптами Lua
 
Еще больший расход памяти будет если объявить локальную переменную и в нее записывать полученный результат. Память тратится как раз на хранение текущих и промежуточных данных.
Каждый раз получая данные с сервера, их надо хранить. В вашем примере переменная глобальная, но ее бы стоило инициализировать ранее, чтобы под нее была выделена память.

А сбрасывается память при автоматическом запуске garbage collector. При этом очищается "мусор", т.е. выделенная память под локальные переменные (неиспользуемые ключи таблиц и т.д.), которые уже не нужны.
Вы также можете вручную запустить collectgarbage, но разработчики не советуют это делать.
Не пойму, где ошибка.
 
Без полного кода сложно будет получить ответ. Где часть кода создания таблицы и ее колонок?
Проблема с кодировкой
 
21 век, как никак...
Проблема с кодировкой
 
Писать в кодировке Win 1251. Квик другой не понимает.
Статус сессии.
 
Цитата
nikolz написал:
Есть очень простое решения проблемы статуса сессии.
Делаем раз - синхронизируем компьютер по серверу времени.  Это позволяет нам синхронизироваться с временем биржи с погрешностью не более 0.01 сек
Делаем два - пишем константы начала и конца сессий
Делаем три - где надо и не надо просто сравниваем текущее время с константами и решаем какое сейчас состояние сессии без каких либо кодов с биржи
------------------------
Самое смешное в том,  что биржа(брокер)  свои коды формируют точно так же.
Так и делаем как дублирующий слой. Зачастую так надежней. Но времена меняются иногда, в этом проблема.
Статус сессии.
 
Цитата
Как нет когда есть?
https://arqatech.com/upload/iblock/9c0/Doc880.zip
Файл "8 Язык QPILE.pdf", глава "8.12.3 Значения параметров функций" на стр 65

Цитата
Nikolay написал:
А теперь скажите где это описано в справке? Скажем, чтобы новичок разобрался. Я уже не говорю про англоговорящего пользователя.
Что именно написано? то что везде параметры называются одинаково? кажется это и так очевидно.
Какой такой QPILE? Мы говорим про реализацию qLua. Вы же предлагает читать документацию по QPILE как дополнение к qLua. При этом это не сказано в руководстве по языку qLua.
Поставьте себя на место новичка, впервые открывшего терминал в 2020 г., желающего написать скрипт на qLua. Ваша справка такова, что вам приходится постоянно отвечать на простейшие вопросы, вместо того, чтобы пользователь просто прочитал.
Статус сессии.
 
Цитата
Sergey Gorokhov написал:
Цитата
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 справками.
Статус сессии.
 
Т.е. это параметр, которого нет в описании (в этом и был вопрос), который брокер может не транслировать...
Как-то странно, при взгляде со стороны.

Кстати по описанию, почему в документе "Интерпретатор языка Lua" нет описания доступных параметров
функции getParam(Ex)?


В справке qlua.chm есть раздел Значения параметров функций. Добавьте такой же раздел и в документ "Интерпретатор языка Lua".
Статус сессии.
 
Цитата
Sergey Gorokhov написал:
tradingphase
Это что за параметр такой. Его нет в описании доступных параметров.
Статус сессии.
 
Я уже просил сделать заполнение параметров отвечающих за время открытых сессий (как это сделано для срочной секции). Но для фондовой сессии заполняется только времена аукциона.
Если я правильно помню ответ: все вопросы к бирже.

А по статусам, да, поддерживаю.
OnTransReply - что я делаю не так?
 
Если есть поток транзакций, то надо сохранить "ключи транзакций" и по приходу ответа уже что-то делать.
Можете организовать некую таблицу с ключами равными номерам транзакций, а в колбеке проверять, что такой ключ есть и выполнять какие-то действия.

Правда Вам стоит сразу задуматься и о некой уникальности ключа транзакции. Сейчас Вы просто смотрите на номер транзакции. Но если Вы запустите два скрипта одновременно, то гарантий уникальности уже не будет. Стоит проверять не только номер, но и инструмент. Плюс при отправке транзакции можно добавить некий комментарий, а в колбеке фильтровать по нему же, чтобы получить свой колбек, а не соседнего скрипта.
OnTransReply - что я делаю не так?
 
В момент когда приходит колбек, номер транзакции уже другой. Вы не знаете когда придет ответ от транзакции, может минут 5 и более приходить.
Получение данных из таблиц при автостарте
 
Есть ли ожидание (либо проверка) чтобы все пакеты были получены с сервера на момент запроса, прежде чем запрашивать данные?
Отладка QUIK 8.8
 
Цитата
Юрий написал:


Ему волю дай так он всю возможную память сожрет... Не разобрались еще в проблеме? Хотя бы выяснили в чем причина?
Проверьте на предмет "поврежденных" открытых графиков. Т.е. повреждены данные. У меня были такие после обновления. Выявил путем последовательного закрытия и перезапуска.
У меня отжирал всю виртуальныю память.

Еще на версии 8.х самопроизвольно в таблицу текущих торгов и в настройки закзанных потоков данных добавляются инструменты. Обычно это фьючерсные контракты. Каждый раз убираешь и снова сами добавляются. Скажете, что брокер, но у меня вопрос - почему у брокера есть возможность добавлять мне в поток и в таблицы данные.
getFuturesHolding
 
Ваш тестовый контур тоже транслируется биржей?
Хоть это и технологические изменения, но не очень понятно почему меняется позиция. Вар. маржа, суммовая позиция - это понятно, но количественный баланс не очень.
Страницы: Пред. 1 ... 11 12 13 14 15 16 17 18 19 20 21 След.
Наверх