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

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

Страницы: Пред. 1 ... 6 7 8 9 10 11 12 13 14 15 16 ... 23 След.
Сортировка и фильтры в lua таблицах, Можно ли использовать сортировку с учётом типа данных в стобце ?
 
Напишите свою функции сортировки строк. В чем проблема.
Склейка фьючерсных контрактов, Архив фьючерсных контрактов
 
Я понимаю, что штатно терминал эти данные уже потерял, но хотелось бы услышать, что за все эти годы была написана некая утилита, осуществляющая это. HEX редактор как-то неохота привлекать.
Склейка фьючерсных контрактов, Архив фьючерсных контрактов
 
Подниму тему.
Есть папка archive, в ней есть данные минутного ТФ по контракту RIZ1, т.е. 2021 год. На графике этих данных нет.
Как склеить данные и вывести их на график?
Получение BestBID с помощью скрипта LUA., Проблема с кодом
 
Администрация, а это нормально когда движок форума дает авторизироваться по тому же логину, что уже есть (даже если использовали символы другой раскладки)?

Автору: дело в том, что bid_count - это строка. И поэтому ее необходимо привести к числу.

https://luaq.ru/getQuoteLevel2.html

Ну и для справки - лучший спрос и предложение можно получить одной строкой через функцию getParamEx.
7 часов, кто больше?
 
Зачем так усердно бороться с колбеками, когда проще и, главное, надежней самому обрабатывать записи в таблице trades. Хотя, возможно, каждый должен пройти этот путь сам. Мне хватило одного раза, в самом начале, получив все колбеки за день, после восстановления соединения с брокером.

Технология Event-Driven, Asynchronous Callbacks хороша, когда поведение предсказуемо. А когда нет, то я уже как-нибудь сам, по старинке, найду новую запись в таблице.
Таблицы в функции
 
Так и передавайте несколько параметров, кто мешает. Это не Питон, именованных параметров нет.
Таблицы в функции
 
Можно, конечно. Только важно помнить, что она передается по ссылке.

Только сигнатура функции должна быть

Код
Algo(S, Pos, MIDDLE_PRICE)

А еще лучше, раз таблица передается, только ее и передать.
Код
local function Algo(S)

local pos = S.POS
local mp = S.MIDDLE_PRICE

end
Таблицы в функции
 
Ну так и таблицы не видно
Код
S  = 0

Но если она все же есть, то проверяйте, что нигде она не переопределяется. Работая с глобальными переменными, легко выстрелить себе с ногу.

Код
S = {}............S = 'lalalla'

Все, нет таблицы.
Таблицы в функции
 
А где здесь вызов функции с передачей параметров?
робот в индикаторе
 
Плохая затея. Вызов методов только в момент получения данных. Нет вызова - ничего сделать не можем.
А как проверить, что все корректно после отправки транзакции вообще загадка, т.к. будет вызов OnCalculate или нет - неизвестно.
Т.е. мы закладываем что все всегда хорошо, быстро и исполняется. Но это, как показывает практика, почти всегда не так.
Получить строки таблицы Текущие торги.
 
Чем не устраивает файл с списком кодов инструментов и списком параметров для считывания. Читаете файл при старте, а дальше читаете данные по ним.
И не надо заполнять ненужные мелькающие таблицы в терминале.
Подписка на стакан OnQuote в quik 9.7.1
 
OnQuote - это и есть доступный колбек. Объявленная глобально такая функция будет вызываться на каждый чих в стакане.
Т.к. таких изменение очень, очень много, и на каждое изменение вызывается getQuoteLevel2, то память и забивается, т.к.
getQuoteLevel2 возвращает две таблицы, две строки. А это не так и мало. И делается это так часто, что сборщик мусора просто не успевает.

Если Вам не нужны данные стакана в каждом срезе без пропусков, то в колбеке надо просто установить флаг, что есть новый стакан по инструменту, а в потоке main его прочитать.
Luasocket сервер - останавливает выполнение кода, Возможен ли асинхронный запуск нескольких функций в Quik lua ?
 
   
Чистый Lua синхронный, максимум что есть - это корутины. Можно попробовать использовать внешние библиотеки, обеспечивающие асинхронность.

Можете попробовать корутины, вот классчический пример для HTTP, который сразу находится по запросу "Lua socket asynchronous calls":
Хотя, наверно, уже пробовали.
Код
function download (host, file, port)
    port = port or 80
    print (host, file, port)
    local connectStatus, myConnection = pcall (socket.connect,host,port)
    if (connectStatus) then
        myConnection:settimeout(0.01) -- do not block you can play with this value
        local count = 0 -- counts number of bytes read
        -- May be easier to do this LuaSocket's HTTP functions
        myConnection:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
        local lastStatus = nil
        while true do
            local buffer, status, overflow = receive(myConnection, lastStatus)
            -- If buffer is not null the call was a success (changed in LuaSocket 2.0)
            if (buffer ~= nil) then
                 io.write("+")
                 io.flush()
                 count = count + string.len(buffer)
            else
                print ("\n\"" .. status .. "\" with " .. string.len(overflow) .. " bytes of " .. file)
                io.flush()
                count = count + string.len(overflow)
            end
            if status == "closed" then break end
                lastStatus=status
            end
        myConnection:close()
        print(file, count)
    else
        print("Connection failed with error : " .. myConnection)
        io.flush()
    end
end

threads = {} -- list of all live threads

function get (host, file, port)
    -- create coroutine
    local co = coroutine.create(
        function ()
            download(host, file, port)
        end)
    -- insert it in the
    table.insert(threads, co)
end

function receive (myConnection, status)
    if status == "timeout" then
        print (myConnection, "Yielding to dispatcher")
        io.flush()
        coroutine.yield(myConnection)
    end
    return myConnection:receive(1024)
end

function dispatcher ()
    while true do
        local n = table.getn(threads)
        if n == 0 then break end -- no more threads to run
        local connections = {}
        for i=1,n do
            print (threads[i], "Resuming")
            io.flush()
            local status, res = coroutine.resume(threads[i])
            if not res then -- thread finished its task?
                table.remove(threads, i)
                break
            else -- timeout
                table.insert(connections, res)
            end
        end
        if table.getn(connections) == n then
            socket.select(connections)
        end
    end
end

host = "www.w3.org"
get(host, "/TR/html401/html40.txt")
get(host,"/TR/2002/REC-xhtml1-20020801/xhtml1.pdf")
get(host,"/TR/REC-html32.html")
get(host,"/TR/2000/REC-DOM-Level-2-Core-20001113/DOM2-Core.txt")
dispatcher()
Стопы
 
Подниму. Сам часто забываю зажимать Ctrl. Кажется, что лучше добавить тип установки цены исполнения: абсолютный и относительный. При выборе относительного задается отступ в указанной величине (шаги, пункты, проценты).
Тогда при сдвиге отступ будет рассчитываться при активации.

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

Так что да, умолчание должно быть другим.
getBuySellInfo (……….).balance, QUIK LUA
 
Что мешает при подаче транзакции применить math.abs
Как получить 2 целых числа отдельно до и после точки
 
Не заметил, что целое. Если известен scale, то умножить на 10 в степени.

Или можно воспользоваться магией динамической

tonumber(tostring(3.12459):match("%.(%d+)")) or 0
Как получить 2 целых числа отдельно до и после точки
 
на самом деле math.modf

https://uopilot.uokit.com/wiki/index.php?title=Math.modf_(Lua)
Пустое значение trans_id в таблице сделок.
 
Цитата
Во-первых, по новым правилам (QUIK 9.7.1.10) на одну сделку приходится не три, а четыре колбека OnTrade.
Это сильно. Жаль что не пять.

Но, кажется, формулировка разработчиков была - есть изменения во внутренних полях, недоступных для чтения, все равно получите callback.
lua-mysql не компилируется под x64
 
Если Вы не указали rocks какой интерпретатор использовать при установке, то по умолчанию он использует то что найдет. Если не прописаны пути к lua, то возьмет встроенный. Он, кажется 32 бита.

В справке по установке rocks это прописано
https://github.com/luarocks/luarocks/wiki/Installation-instructions-for-Windows
Пустое значение trans_id в таблице сделок.
 
Если сам скрипт и отправляет транзакции, то Вы можете дополнить транзакцию комментарием, который будет записан в поле brokerref. Соответственно сделки с контролируемым комментарием - это сделки, требующие учета.
Далее уже в этих сделках ждете появления trans_id и разбираете по идентификатору транзакции (если это вообще необходимо).

Т.к. записи в таблице формируются не за один раз, т.о. первичное появление записи о сделке, возможно, было просто как фиксация факта. Потом уже было дополнено идентификатором транзакции.
Если обратите внимание на колбек OnTrade, то он приходит три раза на сделку. Каждый раз - это какое-то изменение в записи таблицы.
Беспрерывная робота робота, Как сделать так, чтобы робот был постоянно в работе и обрабатывал каждый тик?
 
Владимир, Вы правы только в том, что обрабатывать тиковые данные через proxy терминал Квик - это не лучшая затея.
Хотя обрабатывать обезличенные сделки, т.е. каждый тик, вполне можно. Все зависит от задачи и скорости принятия решений. Для примера, задача: определить был ли реализован видимый объем в стакане сделками или снят - решается довольно просто, с достаточной точностью.

В остальном же, как обычно - не надо мне, не надо никому. Но мир не вращается вокруг Вас.
неужели OnParam самый быстрый?
 
Цитата
Старатель написал:
Nikolay, видимо, у вас не проверяется класс инструмента.
Это сделка из класса неполных лотов:
Да, в этом месте было без проверки. Спасибо.
неужели OnParam самый быстрый?
 
Опять поднимаю тему.

Сегодня брокер Сбербанк вернул по инструменту GAZP в параметрах
LAST =  287.79
TIME = 122304

Такой цены не было 19 сессий.

Возвращаюсь опять к вопросу: как контролировать корректность|актуальность значений, получаемых через getParamEx?
Чтение данных метки, Зависание терминала
 
Версия 9.5


Скрипт простой: ставим метку и потом читаем данные.  После установки метки берем и перетаскиваем ее на графике, желательно  быстро. Терминал зависает. На таком простом скрипте это происходит не  сразу, поэтому можно просто двигать метку до выявления эффекта. Частично помогает избежать проблемы увеличение sleep до 500.

На версиях 8.* - сколько не двигал не получается эффект зависания, даже на sleep 55.


На самом деле - серьезная проблема, т.к. считывание данных с меток - это единственный способ взаимодействия пользователя  с скриптом через график.

Ссылка на запись эффекта: https://disk.yandex.ru/d/OaffyXPOxRlG_Q


Тестовый скрипт:
Код
local sleep = _G.sleep
local isRun = true

local AddLabel          = _G.AddLabel
local GetLabelParams    = _G.GetLabelParams

function _G.OnStop()
    isRun = false
end

function _G.main()

    local tag       = 'virt_test'

    local label_params = {}
    label_params.YVALUE = 119.5
    label_params.TEXT = 'TEST    |||||||||||||||||||||||||||||||||||||||||||||'
    label_params.HINT = 'Еще текст'
    label_params.DATE = 20220611
    label_params.TIME = 152000
    label_params.FONT_FACE_NAME = 'Arial'
    label_params.ALIGNMENT = 'RIGHT'
    label_params.FONT_HEIGHT    = 10
    label_params.TRANSPARENT_BACKGROUND    = 1

    local l_id = AddLabel(tag, label_params)
    sleep(1000)

    while isRun do
        label_params = GetLabelParams(tag, l_id)
        if label_params then
            _G.message(tostring(label_params.yvalue))
        end
        sleep(100)
    end
end
Динамическое количество линий индикатора
 
Это значит что при попытке вывода линий они выводятся не на своих местах.
Для примера, в Settings.line три линии. В Init добавили еще две линии - их стало пять. Вернули из функции Init 5.
При отрисовке линий 4, 5 они выводятся поверх линий 1-3.
Ошибка: attempt to call a nil value (global 'foo'), непонятная ошибка в вызове пользовательской функции
 
В момент вызова foo она еще не определена.
Код в теле скрипта выполняется построчно вниз, определяя контекст.
Транзакции на снятие Лимит. заявки
 
Код, снимающий заявки у Вас написан, какой бы он ни был.

А далее есть вопросы организации последовательности вызовов методов. Необходимо учитывать, что скрипт работает на клиенте, а ответы приходят с сервера. Т.е. время ответа неизвестно.
Далее, если используете колбеки, то необходимо учитывать, что последовательность их прихода не гарантирована. Также, раз у нас клиент-сервер, то изменение состояния ордера после отправки транзакции на снятие, не придет мгновенно. Т.е. если транзакция на снятие ушла без ошибок, то пока не придет ответ или не прочитаете новое состояние ордера, отправлять новую транзакцию нельзя. Иначе возникнет ситуация когда отправили транзакцию на снятие, не дождались ответа и отправили новую.

Поэтому просто кусок кода ничего не даст.
Обмен сообщениями приложений , скриптов на Lua, Python ,С
 
Вопрос только один: как обеспечивается гарантированность доставки?
Как вручную активировать стоп-заявку через qlua?
 
Цитата
s_mike@rambler.ru написал:
Возможность принудительной активации стоп-заявки из луа, конечно же есть.

Поле транзакции и типом заявки выглядит так:

action="АКТИВИРОВАТЬ СТОП-ЗАЯВКУ"
Да, каждый раз забываю об это слабо-документированной возможности выгрузки кармана транзакций, с целью посмотреть формат транзакции.
Подскажите как передать информацию из QUIK в скрипт PYTHON через память компа?
 
Вот, вспомнил про это решение. Не пробовал сам, но в основе там socket

https://github.com/cia76/QuikPy.git
Как вручную активировать стоп-заявку через qlua?
 
Такой возможности нет. Но Вы всегда можете снять стоп ордер, дождаться статуса снятия и просто закрыть по рынку. Это будет аналогичное действие.
Как получить цену приобритеня акции?
 
Цитата
Владимир написал:
Nikolay, Не совсем так: торгую как раз ТОЛЬКО я - это я "купил 5 штук по цене X, потом еще 3 по цене Y, потом продал 2 по цене Z". Я их купил, это моя собственность, и только я могу знать, какие именно из них я продаю (хочу ли я это знать - это другой вопрос). Но ни брокер, ни кто-либо ещё этого знать в принципе не могут, и потому вынуждены считать по FIFO.
Так поэтому в Квике так и транслируется. Не нравится - считай сам.
Как получить цену приобритеня акции?
 
Возникает встречный вопрос - Вы пробовали посмотреть что хранится в указанных таблицах?

Что же касается стоимости, то вот купили Вы 5 штук по цене X, потом еще 3 по цене Y, потом продали 2 по цене Z. Какая стоимость приобретения?
Т.к. торгуете не только Вы, то приняты соглашения о методике расчета.
Как получить цену приобритеня акции?
 
В таблицах и хранится уже рассчитанное значение.
Как получить цену приобритеня акции?
 
Вы может узнать цену, рассчитанную брокером методом ФИФО. Будут ли она близка к той, что Вы хотите получить - это вопрос.

Но получить можете, сделав запрос к таблицам

futures_client_holding для FORTS
depo_limits для фондовой секции.

Можно получить прямым доступом к таблице, найдя нужную строку или воспользовавшись вспомогательными функциями
getDepo
getFuturesLimit
Подскажите как передать информацию из QUIK в скрипт PYTHON через память компа?
 
Цитата
Alex написал:
Пытался запустить Ваш скрипт, выдает. ошибку.   attempt to index a nil value (local 'pipe')
Правильно. Lua умеет писать (читать) в существующий "именованый файл". Поэтому на другой стороне его надо создать. Т.е. нужен сервер (служба), обслуживающий каналы. Вот его и надо на стороне питона делать
Подскажите как передать информацию из QUIK в скрипт PYTHON через память компа?
 
named pipes Lua поддерживает "прямо из коробки"
Код
    local pipe = io.open("\\\\.\\PIPE\\"..pipe_name, "w+b")
    if not pipe then
        return
    end
    pipe:write('BlaBla') -- записываем команду в канал

--Читаем
    local rd = ''
    local ct = os.time()
    -- Для примера: Т.к. время ожидания ответа может быть не мгновенным, то ожидаем 2 секунды, читая из канала ответ.
    while os.time() - ct < 2 and rd == '' do
        rd = pipe:read('*a')
    end
    tele_pipe:close() -- закрываем канал

А python - это же такая "помойка". Неужели нет готовой библиотеки сервера named pipes? Поиск выдает тонны вариантов.
Подскажите как передать информацию из QUIK в скрипт PYTHON через память компа?
 
named pipes, socket
Отладка кода, Программа для отладки кода на языке lua для квик версии 9+
 
методика print debug вам в помощь.

Для тестирования кода, лучше его тестировать, а не отлаживать.
Последовательность функций обратного вызова
 
Цитата
срабатывания условий тэйка  сервером выставляется новая заявка с новым  номером  order_num который нужно как-то отфильтровать и получить

При срабатывании стоп ордера происходит отправка транзакции сервером брокера. В случае успеха отправки (может не пройти), в стоп ордере, точнее в таблице stop_orders для записи вашего ордера, будет заполнено поле linked_order. Это и есть тот номер лимитного ордера, который отправлен по факту активации стоп ордера. По нему и ищите, фильтруйте. Правда, как и всегда при клиент-серверном взаимодействии, событие смены статуса стоп ордера и событие заполнения linked_order, и появление его в таблице orders, не мгновенные. И необходимо организовать методы ожидания.
Динамическое количество линий индикатора
 
Цитата
Zoya Skvorcova написал:
Nikolay, Добрый день,
     
      Описанная в данном инциденте проблема была устранена в версии       7.23.0 терминала QUIK.
      Данная версия была разослана всем брокерам системы QUIK в рамках       стандартной процедуры обновления версии 23.11.2018.
      По поводу получения обновления рекомендуем вам обратиться к своему       брокеру.
     
      Приносим извинения за причиненные неудобства.
Подниму..

Вроде работало, не следил. Но теперь в 9-ой версии не работает.

Если при первичной инициализации индикатора было x линий (добавление на график). А уже при повторной (после изменения настроек) линий больше x, то отрисовка линий происходит некорректно.
# и table.getn, # и table.getn - косячно
 
Да, никто не мешает самому организовать счетчик при добавлении и удалении элемента.
# и table.getn, # и table.getn - косячно
 
В Lua массивы начинают свою нумерацию от 1. Если будет дырка, то оператор # не вернет корректно значение.

Победить - создать метатаблицу, с переопределенным метаметодом  __len
Поиск ошибок в индикаторе
 
Так она и так выводится если код индикатора открыт.
Впрочем, можно обернуть текст функции OnCalculate (или исполняемой функции) в pcall. И выводить в лог или сообщения текст ошибки. Только стоит сделать кеш ошибок, чтобы не выводить одну и ту же на каждом баре, а то терминал "умирает" на длинных графиках, выводя в три прохода все эти сообщения.
Количество активных заявок одной командой, Количество активных заявок одной командой
 
Цитата
nikolz написал:
поправлю на запись о регистрации или снятии (исполнении) заявки уходит не более 10 мкс
---------------
на формирование и отсылки транзакции на снятие заявки уходит до  300 мкс
----------------------------
на формирование  и отсылку транзакции на новую заявку уходит 400 мкс
Это при летной погоде. Надеяться на такие времена всегда - плохая затея. Мой наблюдаемый рекорд от отправки транзакции до появления ордера - 10 минут.
Количество активных заявок одной командой, Количество активных заявок одной командой
 
Цитата
nikolz написал:
не все так просто.
Например,  уже есть активные заявки до включения скрипта.
либо произошел разрыв соединения и восстановление через несколько минут и часть активных заявок сработали.
Ну и т д
Конечно не просто. Собственно это и было написано, что необходимо свои заявки опрашивать. Также скрипт должен хранить свое состояние, чтобы при перезапуске, восстановлении соединения и т.д., проверить себя, что изменилось. Может быть так, что терминал упал вчера, а восстановился только сегодня. Поэтому все такие ситуации необходимо предусматривать. И закладывать архитектуру на колбеках - не самое надежное решение.
Количество активных заявок одной командой, Количество активных заявок одной командой
 
Вы, конечно, можете постоянно не сканировать активные заявки по таблице. При первичной постановке ордера необходимо один раз найти ордер в таблице ордеров и запомнить индекс таблицы. Тогда последующие обращения уже будут простые, без поиска.
Если же речь про то, чтобы вообще не искать ордера, то для лимитных ордеров - это не лучшая затея, т.к. в клиринг их снимут и необходимо предпринять какие-то действия. Да, можете по колбеку получить новое состояние ордера и отреагировать, но это если этот колбек не был пропущен.
Запуск скрипта из примера подвешивает терминал Quik
 
Цитата
Konstantin написал:
Убрал onAllTrade результат тот же. Может ещё что убрать...
Советую последовательно анализировать.

Для начала уберите обработку очереди и просто в каждом колбеке выводите сообщение, что пришел такой колбек. Функция main будет cодержать только sleep(10), например.


Код
 function   main ()
     while  is_run  do 
         --if   # MAIN_QUEUE  >   0   then 
         --   ProcessingCallbakc(MAIN_QUEUE[ 1 ])
         --    table.sremove (MAIN_QUEUE,  1 )
         --    message ( "Размер очереди "   ..  tostring( # MAIN_QUEUE))
         --end 
         sleep ( 10 )
     end 
 end

Потом уже последовательно возвращать в колбеках заполнение очереди. По одному, не во всех сразу.
Тогда, анализируя поведение скрипта, найдете причину.

И, главное, измените в функции ProcessingCallbakc sleep(3000) на sleep(10). А лучше вообще убрать. Я не представляю что необходимо выполнять три секунды на каждый колбек.
Сдвиг массива без цикла for или while, Возможно ли сдвинуть массив без цикла for или while, если количество строк массива может изменяться?
 
Цитата
Владимир написал:
Nikolay, Не помогут. ::  

Сдвинуть помогут. Вопрос был про сам сдвиг. Давить в конец, удалить в начале. Как я понимаю задача держать в массиве заданное число элементов.
Правда эту задачу можно решить кольцевым массивом, рассчитывая очередное место индекса массива через остаток от деления, например.
Сдвиг массива без цикла for или while, Возможно ли сдвинуть массив без цикла for или while, если количество строк массива может изменяться?
 
И очень странная работа с временем. Если необходимо получить разницу времени, то у Вас есть unix-time, простое арифметическое действие даст разницу в секундах.
Также время есть и в параметре alltrade - время прошедшей сделки. И да, в этом колбеке выполнять что-то сложное - очень плохо.
Страницы: Пред. 1 ... 6 7 8 9 10 11 12 13 14 15 16 ... 23 След.
Наверх