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

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

Страницы: Пред. 1 ... 8 9 10 11 12 13 14 15 16 17 18 ... 21 След.
Расширить список функций обратного вызова
 
Ну если уж просить, почему бы не попросить еще один поток для своих колбеков. Т.е. реализовать методы регистрации своих функций обратного вызова и отдельный поток для них, чтобы не лезть в основной поток вовсе.
Подскажите как отправлять инфу из QUIK в телеграм?
 
Цитата
Alex написал:
Николай можно поподробнее про "замыкание"
Спасибо
Если Вы не знакомы с замыканиями, то советую ознакомиться с теорией https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0­%B5_(%D0%BF%D1%80%D...

Если простыми словами - то это функция объект с своей областью видимости. Что дает возможность создавать разные экземпляры функции с своими переменными.

Таймер на любую функцию можно сделать так (пример на чистом lua):
Код
local timer_processor = function(delay)

    delay = delay or 0
    local last_time = 0

    return function(func, ...)
        local cur_time = os.time()
        if cur_time - last_time >= delay then
            last_time = cur_time
            return func(...)
        end
        return ...
    end
end

local some_func = function(x)
    x = x + 1
    print(x)
    return x
end

local timer = timer_processor(2)

local a = 1

while a < 5 do
    a = timer(some_func, a)
end

Функция some_func вызывается постоянно, но исполняется только каждые 2 секунды - параметр delay. При этом можно создавать несколько таймеров на разные задержки, используя один и тот же конструктор.


Можно также просто сделать некую функцию, в Вашем случае читающую файл, внутри замыкания, а не передавать ее как аргумент.
Подскажите как отправлять инфу из QUIK в телеграм?
 
В принципе да. Но проще всего это сделать через замыкание, тогда проще вызывать. Можно даже сделать таймер, чтобы не читать слишком часто.
изменить стоп-заявку
 
Снять старую, поставить новую.
OnTransReply возвращает order_num = nil
 
Колбеки хороши, но их не гарантированность - убивает идею.

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

Далее, что важно в таком сценарии, вы легко запоминаете индекс в  таблице, а значит всегда можете обновить информацию по ордеру, без  всякого колбека.
Подскажите как отправлять инфу из QUIK в телеграм?
 
Цитата
А как сделать обмен в обратном направлении? Из Питона в Квик
Квик -> Питон все просто. watсhdog python отслеживает изменение файла. В qlua нет функции отслеживания изменения файла.
Спс
Ничего сложного. Открываете файл в режиме чтения и читаете его.

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

Для примера, можно просто читать последнюю строку файла через:
Код
file:seek("end")
last_line   = file:read('*l')
Если появится новая строка, то и при чтении она считается, т.к. директива *l - Reads the line from the current file position, and moves file position to next line.
Получать объемы сделок
 
Выводите метку в виде текста.

Скажем |||||||||||||||||||||||||||||||| мелким шрифтом будет выглядеть как линия. Но вот длину придется подбирать опытным путем, т.к. у метки есть только одна координата - начало.
Подскажите как отправлять инфу из QUIK в телеграм?
 
Цитата
Anton написал:
 
Код
   io.open ( "\\\\.\\PIPE\\MySuperPuperServer" ,  "wb" )
  
Тока flush не забывать после записи.
В принципе да, т.к. это как бы "файл в памяти".

Квик воспринимает только win1251, поэтому файл должен быть в этой кодировке. Либо используйте перекодировку в UTF.
Подскажите как отправлять инфу из QUIK в телеграм?
 
либо socket - можно использовать библиотеку luasocket (собственно ссылка на qlua-rpc примерно про это)

либо named pipes - надо написать(найти) dll обмена на стороне lua
Подскажите как отправлять инфу из QUIK в телеграм?
 
Чаще всего в таком режиме общения либо дописывают строки в файл.


Скрипт на lua открывает файл на запись, скрипт на Питоне на чтение. Скрипт на питоне помнит последний номер строки и считывает новую, если появилась.

Либо создавать новый файл обмена. После обработки скрипт на Питоне удалит его, давая тем самым ответ, что обработка закончена.
Подскажите как отправлять инфу из QUIK в телеграм?
 
Цитата
Qlua я знаю.
Не могу разобраться как отправить инфу из Quik на внешний скрипт на Питоне.
Все уже придумано до вас

https://github.com/Enfernuz/quik-lua-rpc
Индикатор Lua
 
Индикатор должен вернуть значения, не таблицу, число которых равно числу линий.

Поэтому с тем же успехом можете просто перечислить возвращаемые значения

return a, b, c, d ,e ,f и т.д.

Когда число линий действительно больше, то тогда уже лучше хранить значения в таблице, а возвращать через unpack(table).
Перевод робота с lua 5.1 на lua 5.3
 
Много раз уже обсуждалось.
Для примера https://forum.quik.ru/messages/forum10/message49125/topic5841
lua 5.3 при использовании tostring к типу float добаляет ".0 в представление.
tostring(5) ~ "5.0"

Если число 5 выглядит как целое, но его тип math.type может быть float. Поэтому tostring добавит в представление точку и ноль. Квик такое не принимает в качестве параметра транзакций, где предполагается целое.
Как получить значение из файла txt
 
Если классическая задача разбиения строки с разделителем на отдельные элементы, то регулярные выражения помогут.
В частности итератор string.gmatch или написать свой итератор. Или, если формат постоянный (число параметров постоянно), то string.match.

Для примера string.match для чтения трех числовых параметров, разделенных запятой:

var1,var2,var3 = string.match(str,"(%d*),(%d*),(%d*)")


Проще всего воспользоваться поиском с ключевыми словами  "lua split string".
Отменить цикличность появления сообщения
 
Сделайте замыкание функцию с встроенным таймером, выводящую сообщения.
Сможете создавать разные экземпляры на разный интервал. Не будет лишних локальных, а тем более глобальных переменных.

sleep - это заморозить поток, чаще всего это не так и надо выполнять остальные действия.
Подскажите как отправлять инфу из QUIK в телеграм?
 
Поиск по форуму дает ответ.

Вот одно из решений
https://nick-nh.github.io/2021-03-14/teleMessage
Перемещение заявки 2 транзакциями
 
Время ответа на транзакции - это не детерминированная величина. В ядро биржи уходят лимитные заявки. В ядре биржи всегда будут транзакции атомарны: снять, поставить.
При существенной нагрузке на сервера биржи и брокера ответ на команды может приходить совсем не быстро. Мой наблюдаемый рекорд - 12 минут.

Также надо учитывать, что исполнение команд происходит в порядке очереди. Вы не можете гарантировать, что ваша транзакция по установке нового ордера после снятия, будет первой в вашей же очереди команд.
Для примера, от Вас идет поток команд, одна из которых сдвинуть ордер. Ядро биржи может обработать команду (и не одну) между снятием-постановкой, если таковые есть.
Гарантий достаточности средств, при постановке нового ордера после снятия, нет, т.к. они могли быть заблокированы другими ордерами.

Поэтому контроль перед подачей транзакции будет всегда.
История заявок
 
Но для решения данной задачи карман - не самый удобный инструмент. Это надо руками выгружать заявки из таблиц заявок, при этом фильтруя исполненные. А в карман загружать из этого файла.
При этом как-то очищая дубли, если заявка уже есть в кармане.
История заявок
 
Создать окно -> Все типы окно -> Прочее -> Карман транзакций
Как получить "шаг цены" и "Стоимость шага цены"
 
Цитата
spy написал:
Подниму старую тему, т.к. вопрос по ней: при выставлении заявки нужно ли вручную приводить цену к шагу цены? Допустим, шаг цены инструмента 0,01 - выставится ли лимитная заявка с некратной ценой вроде 75,1234? И если да, то в какую сторону будет округлена фактическая цена?
Необходимо привести цену к шагу. Если это не делать при подаче транзакции будет получена ошибка.
Добавление столбцов в пользовательской таблице
 
Цитата
Владимир написал:
Nikolay, Нафига дамп? Нафига хранить всю информацию в самой таблице? Хранить сколько-нибудь важные данные в таблицах Квика могут разве что камикадзе - нужно хранить в таблицах Lua. А таблицы Квика только для визуализации данных для юзера и обработки событий от него же.
Люди разные. У Вас привычка навязывать мнение, но это не значит, что нельзя делать по-другому. Впрочем, я отметил, что хранить в самой таблице - это не лучший вариант.
Добавление столбцов в пользовательской таблице
 
Цитата
Можно ли переформировать без потери данных в таблице? Или нужно перезаполнять и соответствующую таблицу тоже?
Сделайте дамп таблицы в структуру и перезаполните ее.
Такой механизм обычно нужен всегда, чтобы реализовать перезапуск скрипта без потери информации.
Можете хранить всю информацию в самой таблице и тогда становится важным делать своевременный дамп или можете хранить всё в некой структуре в памяти, позволяющей восстанавливать состояние, что более предпочтительно.
Добавление столбцов в пользовательской таблице
 
Столбцы добавляются до формирования окна. Это его структура, типы данных, ширина.
После формирования окна столбец уже не добавить, необходимо переформировать окно.
Вывод пользовательских таблиц
 
Нет, нельзя. Это понятно из документации

NUMBER InsertRow(NUMBER t_id, NUMBER key)                        

ключ строки - это число
Запуск скриптов lua
 
Цитата
Владимир написал:
Самый надёжный способ - не запускать ничего автоматом. Более того, когда я перезапускаю Квик (после какой-то страшной ошибки, когда он отвисает), мой скрипт стартует автоматом (поскольку не был остановлен перед выходом), и я его немедленно останавливаю, чтобы ничего не натворил. А потом спокойно запускаю, когда Квик обновит свои таблицы (на мой взгляд, он неприлично долго это делает), и в ТТТ что-то там начнёт мельтешить - торговля пошла.. Я бы вообще запретил автомат. Вы сами ищете приключений на свою задницу, господа. Это У ВАС "ку-ку система получается". Впрочем, деньги ваши - развлекайтесь...
Если у Вас задача быть постоянно "привязанным" к терминалу, то можете действовать и так. Но многие запускают скрипт на VPS и смотрят, что происходит раз в день, а то и реже, когда скрипт пришлет какое-то оповещение.
Поэтому скрипт должен успешно стартовать вместе с терминалом, а также корректно работать если терминал не выключается вовсе.
Отладка QUIK 9.1
 
Цитата
У меня несколько другая ситуация. Есть lua-скрипт, который стартует вместе запуском программы quik и создает окно-таблицу.
Если, после авторизации, quik показывает диалог с запросом замены истекающего фьючерса на новый и ответ на него утвердительный, то происходит "как-бы переоткрытие" видимых в этот момент таблиц.
Их окна закрываются и тут же открываются вновь. А окно-таблица созданная lua-скриптом тоже закрывается, но вновь уже не отрывается.
Из менеджера окон пропадает, хотя сам lua-скрипт работает. Приходится его останавливать и запускать по новой.
Ведь так быть не должно?
Вам надо создать метод контролирующий наличие окна. Если его нет, и это не команда пользователя по его закрытию, то переоткрыть и перезаполнить его.
Должно ли быть так или нет - сложный вопрос. Окна терминала переоткрываются, т.к. они в его оконной модели и он их контролирует. А окно скрипта нет. Терминал не знает о его составе и наполнении.
Прочесть таблицу новости через LUA
 
Цитата
Владимир написал:
   Nikolay, ЧАВО?! Во-первых, В МОИХ базах данных, как правило, ОДНА таблица (неоднородных кортежей).  :: Во-вторых, какое отношение имеет открытие таблицы к визуализации? ТТТ - это ХРАНЕНИЕ данных в терминале, а никакая не "визуализация". И доступ к ней как раз "ракообразный", через getParamEx, а не getItem, скажем. Разумного объяснения сему факту лично я найти не могу. Привязка же доступа к графикам - это КРЕТИНИЗМ! АДНАЗНАЧНА!

... ТТТ - это ХРАНЕНИЕ данных в терминале ... оставлю без комментариев

"Во-вторых, какое отношение имеет открытие таблицы к визуализации?"
Вы таблицу зачем открываете? Смотреть глазами? Не надо смотреть, то зачем открывать. А если смотреть, то какие претензии к термину "визуализация".

Доступ к данным параметров корректный. Обычный запрос на получение данных key-value по ключу параметра.
Прочесть таблицу новости через LUA
 
Пример: База данных. в ней много таблиц. Пока не откроешь таблицу, т.е. визуализируешь данные, прочитать из таблицы ничего нельзя.
Очевидно, что так это не работает.

ТТТ - это визуализация данных в терминале. Но ее можно и не открывать, т.к. key-value, связанный с этой "таблицей", находится в памяти и доступен для чтения через публичные методы. Поэтому есть необходимость реализации методов для всех, так называемых "таблиц" Квика.

Привязка же к графикам - это просто один из методов, считывания информации с этого графика, со всеми вытекающими проблемами. И зачастую, используется не для получения данных баров (свечек).
Каталог luac-скрипта, выполняемого через dofile
 
Не будет работать если при компиляции убрана отладочная информация флагом -s. Что, обычно, всегда и делается.
Тиковый график QuikJunior и рабочего Quik
 
Если я правильно помню, демо данные срочного рынка транслирует биржа.
Вопрос по индикатору.
 
Необходимо еще учитывать то, что при старте терминала индикаторы не могут инициализироваться одновременно. Текущий запустился первый, а два других, с которых данные считываются - еще нет. Или в другой последовательности.
Отладка QUIK 9.1
 
Еще бы ссылку на изменения и исправления в версии.Я что-то не могу найти на сайте.
Debug function name
 
Я по ошибкам вывожу строку текста через debug.getinfo(2), а в assert есть имя функции, аргумента, чтобы в тексте ошибки было имя. Часто этого достаточно для понимания что и где.
Правда если скомпилировать без отладочной информации, что всегда и делается, то информация теряется. Для этого, как раз в assert имя функции и прописывается.
Если же это для каких-то логических целей, то лучше не через debug.getinfo решать вопрос, конечно.
Самый лучший Telegram bot на lua
 
Добрый день.

Нет, были реализованы только отправка и получение.
Написание автономного бота
 
Постоянный спор. Вот это "Грубо, узнать когда количество загруженных строк в таблице будет равно  количеству на сервере в том состоянии которое есть в данный момент." было бы полезно.
Получать событие когда количество строк в таблицах futures_client_limits, money_limits, depo_limits на сервере и клиенте стали разные и обратно одинаковые.
Правда само число строк мало о чем говорит, если только это не очистка и заполнение.
Соответствие Кодов клиента и Торговых счетов, Определение соответствия Кодов клиента и Торговых счетов
 
Если считать, что Фирма - это некий код брокера, от имени которого выполняются поручения, то маловероятно. Но это, конечно, больше вопрос к брокеру.
Получение признака "Субординированный инструмент" в lua
 
Кажется, гораздо проще было бы добавить в руководство описание полей и поддерживать его актуальность. Что вполне естественно. Впрочем, такие пожелания были неоднократно.
простейший робот на Луа, Где взять простейший работающий робот на Луа в качестве заготовки?
 
Раньше, лет 5 назад, было трудно найти примеры. Хотя уже тогда были варианты:

Вариант 1

Вариант 2

Вариант 3

Также можно просто найти в Яндекск набрав "робот lua Квик"

Найдутся варианты демонстраторы, если отфильтровать рекламные предложения. Также поищите на GitHub там много примеров кода.
Вопрос: Как получить номер лимитной заявки при исполнении стопа
 
По полю filled_qty

https://forum.quik.ru/forum10/topic4138/
Вопрос: Как получить номер лимитной заявки при исполнении стопа
 
Лимитный ордер по активированному стоп-ордеру у брокера отправляется в ядро биржи, если он прошел проверку.
Номер зарегистрированного лимитного ордера, хранится в поле linkedorder таблицы stop-orders:                                                              
linkedorderNUMBERНомер заявки в торговой системе, зарегистрированной по наступлению условия стоп-цены
При этом признак активации (исполнен) стоп-ордера - это всего лишь признак того, что наступило одно из условий, заданное при постановке стоп-ордера. При этом, если лимитный ордер не проходит проверку, то он не будет зарегистрирован, при это стоп-ордер "исполнен". Для контроля этого есть дополнительные флаги стоп-ордера.
Также может возникнуть ситуация, когда лимитный ордер установлен, но не исполнен. Т.е. заданы слишком мягкие отступы, при постановке стоп-ордера. При этом стоп-ордер опять "исполнен".

Поэтому при смене статуса стоп-ордера, необходимо убедиться, что лимитный ордер был отправлен и он исполнен. Иначе необходимо предпринять защитные действия: закрыть руками, снять "зависший" лимитный ордер и т.д.
Самый лучший Telegram bot на lua
 
Странно, что Вы задает вопрос здесь, а не на форуме размещения или ГитХабе, где этот проект тоже есть. А сто касается уведомлений, то решения есть похожие по смыслу https://nick-nh.github.io/2021-03-14/teleMessage
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
Если Вы хотите решить проблему, то Вам надо предоставить информацию. Проблема же у Вас.
Можете напрямую обратиться в техподдержку. У Вас запросят информацию для воспроизведения, т.к. того что Вы предоставил явно недостаточно.
Вы обратились на форум, где по доброй воле разработчики могут ответить, в могут и не ответить.

Код, что Вы предоставили, дает мало информации, поэтому вывод дополнительной информации дал бы больше возможностей понять в чем проблема.
Я сталкивался с особенностями работы функций get... поэтому стараюсь при анализе понимать, что сохранено в таблице к которой эта функция обращается.
Собственно unit_test этой функции так и надо написать, сравнить возвращаемое значение с эталонным в таблице.

Вы же просто пишите - функция не работает. Разработчики ответят: проверили - работает.
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
Потому что на демо сервере лимит = 0.
А в реале у меня годами работаю свои скрипты. Где как используются функции getDepoEx, getFuturesHolding, так и без них. Чаще без них, но это не важно.
И в сообщение https://forum.quik.ru/messages/forum10/message47344/topic5697/#message47344 я тоже указывал на  похожее поведение.
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
В Ваших сообщениях №28, 32, 35, 45 первое выводимое значение mLots не 0, впрочем, это не важно.

Я Вас ни в чем не обвиняю, даже не пытаюсь. Просто взял Ваш код и запустил на тестовом сервере. Не надо искать скрытых смыслов в сообщениях.Вот что я запустил:
Код
SEC_CODE          = 'SBER'
CLASS_CODE        = 'QJSIM'
ACCOUNT           = 'NL0011100043'
CLIENT_CODE       = '11609'
FIRM_ID           = 'NC0011100000'
LIMIT_KIND        = 0

mLots = 0
L=0

function main()
 while true do

    local tblMinLot =       getParamEx(CLASS_CODE,  SEC_CODE, "LOTSIZE")
    local tblTotalLot =     getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND)

    if tblMinLot==nil       then MinLot=0       else MinLot=tonumber(tblMinLot.param_value)             end
    if tblTotalLot==nil     then TotalLots=0    else TotalLots=tonumber(tblTotalLot.currentbal)         end

    x=  TotalLots


    L = TotalLots / MinLot
       -- впвапвп
    if( mLots~=TotalLots ) then
        message(SEC_CODE.."   TotalLots  "..tostring(TotalLots).."   mLots   "..tostring(mLots).."   x   "..tostring(x),3 )
        mLots=TotalLots
    end


  sleep(1000)
  end
end

Убраны переменные, не влияющие на вывод сообщений. На демо-сервере, на данный момент торгуется только несколько инструментов.

Впрочем, ждите ответов от разарботчиков.
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
Ок. Смотрим на Ваш код.

Я даже специально перенес его в редактор и привел к нормальному виду. Даже запустил на тестовом сервере ARQA

Нет такого поведения - это раз. Не при подключении к серверу, ни при отсутствии оного.

Второе, даже просто глядя на код, возникает вопрос: почему у Вас первое сообщение содержит mLots не 0?

При инициализации значение переменной  = 0. После первого сообщения произойдет присвоение некому значению, отличному от 0.
У меня так и выводится одно единственное сообщение, и более ничего.

SBER   TotalLots  10.0   mLots   0   x   10.0

Как и должно быть mLots = 0.

Либо Вы приводите не все сообщения, либо не полный код. Но даже если у Вас это происходит, то на тестовом сервере нет.
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
Я уже все предложил. У меня достаточно запущенных скриптов содержащих близкие по смыслу строки.
Когда возникала такого рода проблема, она исследовалась всесторонне: получалось содержание колбеков, содержание таблиц и т.д. И, в конечном итоге, проблема решалась с брокером, транслирующим данные.

А глядя на эти сообщения, где не ясно что это за бумага, какой брокер, версия терминала, разработчик, "конечно", сможет сразу определить проблему.
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
Да, чаще всего это проблема трансляции данных или их интерпретации.
А если Вы увидите, что есть проблема в данных, то далее ее можно будет классифицировать: технологические изменения данных при трансляции, проблема в данных, поступающих от брокера и т.д.

Далее можно уже предполагать кто виноват (или не виноват): брокер, серверная часть терминала у брокера, сам терминал.

А просто сказать - вот есть проблема. Как ее воспроизвести? Ваш код будет работать корректно на тестовом контуре разработчика терминала. И что в итоге?
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
Смысл в том, что в таблице есть много полей. Когда у Вас меняется позиция, зачастую это связано с изменением других полей. Вы и увидите или не увидите эти изменения.
Как минимум больше информации для анализа.

В конечном итоге, разработчик терминала не отвечает за транслируемую информацию.
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
Я все же советую сделать цикл по строкам таблицы depo_limits и вывести все ее поля в такие моменты, чтобы было понятно что в ней меняется.

Данные транслирует биржа, терминал просто получает и предоставляет информацию.
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
Ну по поводу значений возвращаемых именно функциями, а не простым перебором таблицы была тема https://forum.quik.ru/messages/forum10/message47344/topic5697
Вы вывели бы все значения из таблицы и было бы видно для каких сочетаний параметров происходят изменения.
Страницы: Пред. 1 ... 8 9 10 11 12 13 14 15 16 17 18 ... 21 След.
Наверх