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

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

Страницы: 1 2 3 След.
Надо кое-что исправить в документации
 
достаточно запросить стакан на инструмент, на который не подписаны
Квик для тикера LQDT не показывает историю от 6 мая 2024
 
у брокера могут быть разные серверы квика для раздачи данных на приложение и на терминал
в таких случаях проблема почти всегда у брокера (может быть не на всех серверах)
Как определить Код класса (CLASSCODE) по коду инструмента (SECCODE)?
 
Через Winapi можно по идее скопировать все данные из окна, которое появляется по Alt+I.
Как определить Код класса (CLASSCODE) по коду инструмента (SECCODE)?
 
SearchItems по таблице securities даст инфу. В остальных таблицах и функциях типа getDepoEx (возвращающей инфу по таблице "4.15 Позиции по инструментам") будет sec_code только. Ну и из индикатора ещё можно получить...
Quik ОЧЕНЬ долго загружается на виртуальной машине.
 
Больше всего времени загрузки я экономлю, когда сокращаю архивные свечки в папке archive (удаляю вообще, или перезаказываю, или редактирую dat файлы так, чтобы остались только нужные свечи). 5 минут на ноуте это долго, если ноут современный. 5950х у меня загружает квик за 23 секунды при 30+ графиках (120-ти datasource, 60 индикаторов) и только что почищенном архиве, в котором остаётся не более 3000 свечек на график. Если не чистить неделю, загружает уже 33 секунды.
Я бы предложил посмотреть, не тупит ли чтение архивных свечей.
Индикатор уровней High, Low определенной свечи определенного таймфрейма
 
mbak, поясните,  пожалуйста, что на самом деле Вы хотите? "помочь в написании" одного  скрипта, или написать его за Вас,  или написать его за Вас и объяснить, почему именно так, а не иначе, или обучить части базовых основ  математики и программирования, необходимых для написания конкретно этого  скрипта? Могу предложить платную помощь  :smile:  
Индикатор уровней High, Low определенной свечи определенного таймфрейма
 
Конечно не работает, и даже ошибку пишет, что исправить. Перед началом каждого интересующего периода x должен быть инициализирован числом, не помешающим максимуму. Например, так.

Код
 if (t.hour < 16) or ((t.hour == 16) and (t.min < 30)) then x = nil end if (t.hour == 16) and (t.min >= 30) and (t.sec == 00) then x = math.max(x or 0, H(index)) end
Индикатор уровней High, Low определенной свечи определенного таймфрейма
 
Код
if (t.hour == 16) and (t.min >= 30) and (t.sec == 00) then x = math.max(x, H(index)) end

Если на тиковом тоже надо постоянно обновлять, уберите проверку t.sec
Что будет, если внешняя dll изменит содержимое строки Lua?
 
Цитата
Serge123 написал:
Получается, что нельзя самому что-то для своего удобства изменить в исходниках и получить настроенную под себя dll для Квика...
Вы же хакер, можете заменить часть бинарника, заодно проверите, защищён ли он от этого как-нибудь.
Ускоряем скрипт и выкидываем sleep
 
Для моих целей сообщения тоже оказались заметно быстрее, чем sleep. На скрине для каждой пары неродных для квика стаканов левый отрисован с ожиданием через сообщения, правый - через sleep. Внизу стаканов статистика потерь, они на правых стаканах больше. Kernel time и cpu time тоже меньше на потоке, который ждёт событий.
Поскольку рисование стаканов идёт в main скрипта, нельзя использовать WaitForMultipleObjects для событий из OnQuote и OnStop, нужно MsgWaitForMultipleObjectsEx, чтобы main включался на событиях GUI для стаканов. Её нет в w32, пришлось подключать через cffi-lua. Инструкция по сборке написана тут. Если сравнивать время исполнения между w32 и cffi-lua, то конечно же w32 быстрее (SetEvent на 12%, CreateEvent на 23%).
Важные части кода:

Код
local w32 = require "w32-ext"
local ffi = require "cffi"
local SetEvent = w32.SetEvent
local MsgWaitForMultipleObjectsEx = w32.MsgWaitForMultipleObjectsEx
local cb_t = {'EDM4','SiM4','CRM4','CNYRUB_TOM'}
local e_quote, e_stop
local is_run = true

function OnQuote(class_code, sec_code)
  local sent = cb_t[sec_code]
  if sent then
    cb_t[sec_code] = sent + 1
    SetEvent(e_quote)
  end
end
function OnStop()
    is_run = false
    SetEvent(e_stop)
end
function main()
  e_stop = w32.CreateEvent(nil, 0, 0, nil)
  e_quote = w32.CreateEvent(nil, 0, 0, nil)
  local events = ffi.new("HANDLE[2]", {e_quote, e_stop})
  local WAIT_TIMEOUT = w32.WAIT_TIMEOUT
  while is_run do
    local res = MsgWaitForMultipleObjectsEx(2, events, 500, 7423, 0) -- QS_ALLINPUT == 7423
    if res == 1 then break end
      if res == WAIT_TIMEOUT then
         -- по таймауту обработать сообщения, например, о смене foreground окна
      else
         -- обновить стаканы
      end
    end
  end
end

w32-ext.lua:
Код
local w32 = require("w32")
local ffi = require "cffi"
ffi.cdef [[
    typedef unsigned int UINT;
    typedef unsigned long DWORD;
    typedef long long LRESULT;
    typedef long long LPARAM;
    typedef unsigned long long WPARAM;
    //typedef void* HWND; // in windows
    typedef intptr_t HWND; // uintptr_t not ok as it appends 'ULL', LPARAM also ok
    typedef intptr_t HANDLE;

    void SetLastError(DWORD);
    //LRESULT SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    HWND GetForegroundWindow();
    DWORD MsgWaitForMultipleObjectsEx(DWORD nCount, const HANDLE *pHandles, DWORD dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags);
]]

w32.SetLastError = ffi.C.SetLastError
w32.GetForegroundWindow = ffi.C.GetForegroundWindow
w32.MsgWaitForMultipleObjectsEx = ffi.C.MsgWaitForMultipleObjectsEx
-- those calls trigger 127 error on first invocation
w32.SetLastError(0)

return w32
До каких пор живёт таблица, передаваемая функции?
 
Цитата
nikolz написал:
так как вызов функции getQuoteLevel2 существенно меньше рисования стаканов.
А у Вас обработка сравнима по времени с getQuoteLevel2 и другими необходимыми Вам вызовами qlua? Я тестирую на том, чем сам потом пользоваться буду, для меня пока нет разницы. В очереди для стаканов не вижу смысла, кстати, я просто хэш-таблицу заюзаю с ключами по sec и содержимым sent,updates,received,стакан.
До каких пор живёт таблица, передаваемая функции?
 
Цитата
nikolz написал:
Есть варианты алгоритма теста?
Я провёл тест, который не выявил разницы. Может быть, getQuoteLevel2 не нужна синхронизация? Запустил два почти одинаковых скрипта, рисующих стакан каждый в своём потоке (настроено так, чтобы гуи рисовался в main скрипта, а не в главном потоке квика). Ниже часть кода одного из скриптов с комментами про замены, чтобы получить второй скрипт. Единственная стабильная разница, что вызов в main даёт на 1 секунду больше CPU time, хотя этот скрипт был запущен на 4 секунды позже (запускал в дневной клиринг, как видно на скрине, чтобы не было обновлений стакана на срочке)

Код
local cols, qt
local sent, received, updates = 0, 0, 0
function OnQuote(class_code, sec_code)
  -- отслеживаем котировки только по указанному инструменту
  if (class_code ~= CLASS) or (sec_code ~= SEC) then
    return
  end
  qt = getQuoteLevel2(class_code, sec_code) -- во втором скрипте убрать эту строку
  sent = sent + 1
end

local fmt = string.format
local function updateGrid()
  local s = sent
  if received < s then
    received = s
    fillCols(qt) -- во втором скрипте заменить на fillCols(getQuoteLevel2(CLASS, SEC))
    updates = updates + 1
    grid:BeginUpdate()
    colors = cols.colors -- cols заполняется внутри fillCols, colors используется при рисовании стакана внутри grid.OnPrepareCanvas (не показано тут)
    grid:SetCells(0,1,s) -- число вызовов OnQuote
    grid:SetCells(0,2,updates) -- число отрисовок стакана
    grid:SetCells(0,3,fmt('%.1f%%',(1-updates/s)*100)) -- процент потерь обновлений OnQuote
    local m,ti,mti = VCL.IsMultiThread()
    grid:SetCells(0,4,tostring(m)) -- System.isMultiThread
    grid:SetCells(0,5,tostring(ti)) -- ThreadId
    grid:SetCells(0,6,tostring(mti)) -- MainThreadId
    for c = 0,2 do
      for r,str in pairs(cols[c]) do
        grid:SetCells(c,r,str)
      end
    end
    grid:EndUpdate()
  end
end

is_run = true
function main()
    CreateAndShow()
    while is_run do
        sleep(1)
        updateGrid()
        app:ProcessMessages()
    end
end
Алго-заявки в веб терминале Квик, и в приложении.
 
Это от брокера зависит. Например у БКС алго заявки сначала были только в квике, потом в веб версии и приложении появились (в разное время).
До каких пор живёт таблица, передаваемая функции?
 
Цитата
nikolz написал:
что не так?
не хватает только теста под реальной нагрузкой для учёта эффекта синхронизаций
До каких пор живёт таблица, передаваемая функции?
 
nikolz, ну вот да, поэтому у меня и вопрос, что больше тормозит главный поток квика -- вызов qlua функций из колбэков или из main с синхронизацией. Если число таких вызовов одинаково (что бывает, если main обрабатывает данные быстрее, чем они поступают), должно получиться, что тормозить больше будут вызовы из main, потому что число синхронизаций вырастет. Если же main не успевает за колбэками, и можно не все данные колбэков обрабатывать, то вызов qlua в main может быть быстрее, чем в колбэках, просто потому, что вызовов будет меньше, но накладные расходы на синхронизацию могут всё равно свести преимущество на нет. Поэтому и вопрос был, есть ли у Вас тест на это.
До каких пор живёт таблица, передаваемая функции?
 
Цитата
nikolz написал:
getQuoteLevel2 лучше вызывать в main, чтобы не тормозить основной поток.
У Вас есть какой-нибудь скрипт, подтверждающий это?

Я когда дампил квик через procdump, постоянно видел, что вызовы qlua (типа SetEmptyCallback) из main стояли на входе в критическую секцию, а вот вызовы из главного потока - никогда.
До каких пор живёт таблица, передаваемая функции?
 
Объекты живут, пока на них есть ссылки. Покуда слот в очереди указывает на эту таблицу, она жива.
Покупки через IPO в таблице сделок отсутствуют
 
Andrey Golik, почему "ожидаемо"? Если я подаю заявку через веб-терминал брокера или через мобильное приложение брокера, заявки и сделки видны в квике. Просто у сделок комментарий появляется.
Покупки через IPO в таблице сделок отсутствуют
 
Andrey Golik, когда проходило IPO Европлана, ЮГК и т.д., брокер (БКС) предлагает в нём участвовать. Для этого надо подать заявку через форму на сайте или по телефону. В день торгов до начала торгов происходит зачисление акций на счёт, это видно в квике, но не как сделка, просто изменение позиции по акциям. В брокерском отчёте появляется информация о сделке T+0, есть номер сделки с той же сквозной нумерацией, что и сделки по акциям (класс TQBR). Также в брокерском отчёте есть "Возмещение за перевод ЦБ "адресные заявки" (Рубль)", то есть сделка была адресной. Я не знаю, как более понятно объяснить, что такое покупка акций через IPO.
Альтернатива CanSell/CanBuy
 
Cyber, вип сервер предназначен там в лучшем случае для получения более глубокого стакана (что даже может оказаться медленнее, если стаканов открыто много и ядро проца слабое), меньшая задержка до сервера (если повезёт) и потенциально более быстрое выставление заявки (не замечал в итоге). Даже свечки по индикативным курсам там менее полные, чем на "новом соединении". Я в итоге вип сервер использую только как запасной, если вдруг проблемы с "новым соединением". Неужели и OnDepoLimit тормозит именно на вип сервере, но не на остальных серверах БКС? ТП изредка там что-то исправляет, попробуйте написать.
Альтернатива CanSell/CanBuy
 
У БКС всегда так было. Но если всё-таки выставить тестовую заявку на 1 лот при отсутствующей позиции, то она не пройдёт. Я раньше на сайте БКС две пдфки смотрел, по которым они разрешали шортить (одну по америке и одну по РФ). Они нечасто обновлялись, по идее можно распарсить один раз и использовать.
Ставка переноса (фандинг), Как можно получить доступ к фандингу в Квике?
 
getParamEx SWAP_RATE и PREV_SWAP_RATE
Утечка памяти в обработчике SetTableNotificationCallback, Функция обратного вызова обработчика событий пользовательской таблицы не освобождает память между вызовами
 
Роман, если Вы вручную не зовёте сборщик мусора, он в своей манере вызывается. Может быть, ещё не пришло время по его настройкам. Попробуйте вручную вызвать. Если рост останется, тогда надо будет кумекать.
Покупки через IPO в таблице сделок отсутствуют
 
ТП БКС говорит, что QUIK не предоставляет такую возможность, как показ сделок IPO в таблице сделок. Так ли это? Есть ли в планах добавлять такую функциональность?
Графики и стаканы через системные файлы QUIK
 
info.wnd - бинарный файл, без знания формата Вы ничего там не поизменяете.

Если Вы откроете всё, что Вы описали, квик будет тормозить, так как это всё будет в одном потоке вычисляться и рисоваться. Плюс есть в некоторых версиях квика ограничения на количество то ли стаканов, то ли графиков. Но если у Вас получится открыть, эти вкладки будут открываться при открытии квика, и Вы сможете даже сохранить эти вкладки в файл. Фьючи меняются обычно раз в квартал, иногда раз в месяц. Тут уж или придётся вручную переоткрывать, или включить в настройках автозамену инструментов.
Сортировка в таблице quik
 
Цитата
Lelikov написал:
Спасибо. Данное описание из справочника QLUA. Я хотел бы разобраться именно с последним входящим параметром NUMBER value. Какие должны быть данные параметры для различных ситуаций. Что неправильно в предыдущем коде для адекватной правильной сортировки?
Вы же его везде в 0 поставили. Хотите нули сортировать?) В справке сказано "Параметр text задает строковое представление значение параметра value.", что очевидно значит, что эти два параметра должны соответствовать друг другу (например, быть равными после приведения типов). А у Вас text меняется, а value всегда 0.
Проверка на nil
 
Цитата
Евгений написал:
Еще ньанс: Данная ошибка выскочила всего 1 раз за год бесперебойной работы скрипта. Хотелось бы узнать причину или как побороть данную ошибку, чтобы срипт не вылетал с ошибкой.
Мысль посетила, совсем не уверен: вроде бы эта функция задействует библиотеку расчёта лимитов брокера, которая по идее обновляется даже если вы квик не обновляете, т.к. правила расчёта на бирже меняются. А она может в теории или сглючить, вдруг даже полезть в сеть за данными и не получить их (например двойной запрос воспринят как ддос). По какой-то же причине юзеры жалуются на тормоза при выставлении заявок на срочном рынке...
Синхронизация объектов рисования в окнах.
 
Я для таких целей всё в одном окне рисую, потом просто дублирую окно по Ctrl+N.
Вопрос по стеку Lua, стеку Lua и нюансы его чтения
 
Виталий, "2. Вот зачем и почему? Т.е. я не понимаю почему в одном случае мы читаем  через 1, а в других через -1. От чего зависит? Ну т.е. есть какое-то  правило по которым таблицы сверху всегда или что, почему таблицы  обчитываются через отрицательные индексы сверху стека?"
Вы такой вопрос задаёте и тогда, когда в питоне видите отрицательные индексы в списках? Это известная идиома в интепретируемых языках и стек-машинах (виртуальных машинах), чисто для удобства программиста, чтобы ему не высчитывать номер индекса с начала контейнера (списка, строки, стека), если он знает номер с конца. В луа от этого проигрыш в скорости небольшой, но есть.
способ звукового сигнала в луа
 
Цитата
nikolz написал:
Если Вам хочется запустить звук и не ждать, когда закончится, то уберите в последней команде "wait"
Спасибо, выглядит как то, что я запрашивал.
способ звукового сигнала в луа
 
А знаете ли Вы способ, который не загружает с диска этот файл всякий раз при проигрывании? А делает это один раз в начале работы скрипта
Надо подумать о запоминании координат окон на экране
 
Я про хардварную проблему, при которой кнопка мыши срабатывает иногда два раза (и более) на одно нажатие. Количество кликов, которые можно услышать, при этом всё равно 1.
Надо подумать о запоминании координат окон на экране
 
Просто двойные клики на левой кнопке мыши, распространённая проблема у геймеров.
Запись открытого интереса в файл.
 
В QUIK в Lua инты 64 бита. Данные по тикам в документации к CreateDataSource:
Цитата
Время свечи возвращается с точностью до миллисекунд в виде таблицы с полями:
{year, month, day, week_day, hour, min, sec, ms, count}
Где:
• count – количество тиковых интервалов в секунду. Может принимать значения от «1»
до «10000» включительно.
Используя Lua функцию os.time из таблицы, полученной от T(номер свечи), можно получить секунды от эпохи (какой именно - поставьте эксперимент и напишите результат). А из полей ms и count - количество миллисекунд и десятых миллисекунд. Для перевода из виндовой эпохи в никсовую гуглите "SECS_BETWEEN_1601_AND_1970_EPOCHS"
dll на C: удивительная ошибка...
 
Ну я же говорил, глючная тёмная тема)
Создайте отдельный багрепорт без привычного Вам спама сообщениями внутри темы, в духе "поставил новейшую версию, включил тёмную тему, сделал то-то и то-то, получил странные иконки", ТП рано или поздно обратит внимание на тему (чем меньше спама, тем быстрее), запросит архив (м.б. с дампом), если не воспроизведёт самостоятельно. До запроса архива ничего в этой установке квика делать не надо, чтобы не влияло на анализ архива.
dll на C: удивительная ошибка...
 
Для исключения dll попробуйте посмотреть через ProcessMonitor (захват должен стартовать до старта квика и продолжаться до проявления бага). QUIK в теории может грузить dll сам, например, при поиске индикаторов (при старте программы или при открытии окна добавления индикатора) или вообще все dll из папки запуска на старте, или ещё из папки, соседней к квику (quik\. .\lib\lua\5.*\).
Но если нигде близко к папке квика Ваших лишних файлов dll нет, то проблема не в загрузке левых dll.
dll на C: удивительная ошибка...
 
Цитата
Serge123 написал:
Эти иконки появляются, когда работает мой скрипт чисто на Луа, без загрузки посторонних модулей.
Учитывая Ваши ошибки с cpath и удивлением про именование модулей, я бы не был так уверен, что никаких dll не загружено. Техподдержка в явном виде мне отвечала, что именно такие проблемы могут быть именно от dll, как я и писал выше. Совет заменить тему на менее бажную уже от меня, не от техподдержки. Чисто посмотреть, проявится ли баг.
dll на C: удивительная ошибка...
 
Serge123,
Вы же за скорость радеете, почему тогда используете тёмную тему? Известно, что она тормозит. Глядишь, без неё и баги с иконками уйдут.

Я предполагаю, что проблема с иконками имеет ту же природу, что мой репорт про работу меню в английской версии. Однако у меня на русской версии и стандартной теме при многих загруженных dll никаких заметных проблем с иконками нет.
Расчет плавающей цены безубыточности на графике, Расчет плавающей цены безубыточности на графике
 
Пока не реализовано в приложении, можно пользоваться сторонним скриптом
attempt to index a nil value, При переборе циклом for выдвет ошибку attempt to index a nil value
 
Единственная строка, на которой интерпретатор может тут выдать такую ошибку, это та, что начинается с "if order_info.sec_code", и единственная причина может быть в том, что order_info было nil т.к. getItem("orders", f) вернул nil. А вернуть он nil мог потому, что в другом потоке таблица orders поменялась. Потокобезопасно таблицы можно обходить с помощью SearchItems.
Получение запросов через MOEX API, Вопросы получения запросов от Московской биржи средствами Lua и C-Lua под Lua
 
Кстати, техподдержка Мосбиржи иногда на такие вопросы, заданные через форму обратной связи на их сайте, отвечает.
Комиссии в системе
 
Цитата
Alexander написал:
После вечерней сессии сервер вернул уже другие комиссии. Поэтому почему только в течении сессии мне пока не понятно.
Конечно другие, ведь и комиссии за сделки тоже поменялись. Наверно, мосбиржа не хочет хранить или публично предоставлять историю комиссий.
Что за хрень версия 10...
 
Бесплатно в открытый доступ отдавать такое я не буду :)
Что за хрень версия 10...
 
Скорее всего формат котировок немного поменялся (их можно вручную перенести, формат хоть и секретный, но очевидный), иначе нет смысла его затирать. Конечно перед апдейтом надо было бэкап делать. 11 версия уже есть. Название файла локализации менялось от версии к версии, подчерк убирался. Долгая загрузка часто значит, что много ошибок пишется в окно сообщений (см. размер tmsg.dat), почему-то это долгая операция.
Пожелание по 1. OnQuote и 2. getQuoteLevel2
 
Я понятия не имею, в какой момент фильтрация происходит. Эта настройка может быть вообще только для стаканов (т.е. после получения getQuoteLevel2), никогда не использовал. Так что или разрабы ответят, или свои эксперименты. Я бы с двух счетов (и двух квиков, подключённых к одному и тому же серверу, с настройками, отличающимися только указанной опцией) запустил и смотрел.
Заголовок программы - добавить название брокера
 
Цитата
Andrey Golik написал:
СергейК, Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Рассматривали ли вы как компания вариант реализации отдельных запрашиваемых юзерами фич именно как публичных скриптов на Lua (пусть и с подключаемыми DLL), а не встраивания их в код?
Пожелание по 1. OnQuote и 2. getQuoteLevel2
 
Система-Настройки-Параметры инструментов-глубина стакана пробовали?
Где смотреть заблокированный размер ГО и как вызвать это окно?
 
Цитата
Юрий написал:
В том и дело, что надо посмотреть ГО только на фьючерсах ФОРТС.
У брокера Финам оно отображается в Тек.Чистых.
У брокера БКС квик иногда создает специальное окно с названием ГО , а иногда не создает. Как вызвать это окно или создать самому?

Юрий.
У БКС в папке с квиком прилагается файл go.lua, можете исправить как Вам угодно. Он же есть в списке скриптов, ЕМНИП. Окно показывается только если была активность на фортс, например, выставлялась заявка.
Замена инструмента, Автоматическая замена инструмента
 
Andrey Golik, если полнотекстовый поиск sec_code инструмента (например, BRG4) по info.wnd не даёт результатов, значит ли это, что инструмент был заменён корректно?
Комиссии в системе
 
Alexander, ответ nikolz исчерпывающий. Если недостаточно - дальнейшие консультации платные  :wink:  
Страницы: 1 2 3 След.
Наверх