Уважаемые разработчики! Я понимаю что клиент должен страдать, но совесть то у вас есть?
Любой другой софт имеет такую элементарную функцию как линковка уровней в разных окнах по разным ТФ на одном инструменте. У вас в Quik уже есть связка (линковка) окон, неужели так сложно сделать чтобы выставленная линия или луч в одном окне на условном часовом ТФ, автоматически появлялась в слинкованном окне на условном ТФ М5 и наоборот.
Владимир написал: Юрий, Так я же показал: в прерывании анализируется этот флаг, а в стек заносится либо "B" (покупка) либо "S" (продажа).
У меня на lua только подключается библиотека. Все остальное, получаю и обрабатываю данные, в dll и соответственно мне нужно распознать направление сделки средствами C++
Параметры в другой процесс я передал :) Не знаю на сколько правильно но работает :) Подскажите с определением направление сделки. В LUA работает такая конструкция
Код
if bit.band(order["flags"],4)>0
then
-- заявка на продажу
else
-- заявка на покупку
end
Однако С++ ничего о bit.band не знает. Как определить в C++ направление сделки по битовым флагам подскажите кто знает.
nikolz написал: замечу два момента.1) если речь идет о фильтрации обезличенных сделок, то ваш вариант неправильный. Так как при большом числе сделок вы будете долго искать.На основе своих исследований данной проблемы могу сказать, что задача решается проще. Повторная сделка приходит всегда следом за первой сделкой.Но особенность в том, что следующая сделка по данному инструменту это не следующая сделка в потоке сделок после первой.-----------------------2) Вы зря не хотите реализовать через файлы. Это просто и быстро. Более того, такие методы как Pipe и mailslot тоже используют запись чтение файлов. Поэтому когда набьете руку (голову) на файлах ,то легко решите задачу с Pipe или mailslot и им подобным.
1. Я уже говорил что мне надо получать сделки которые прилетают в функцию OnTrade то есть они не обезличенные, так что с количеством проблем нет. Но это не главное... 2. Я не против сделать через файлы для начала, а может и навсегда. Но даже я понимаю что через память быстрее :) Но мне нужен внятный пример в C++ коде. Потому что сам я прогер слабенький, мягко говоря.
А тут столько блин специалистов и никто не может пример написать. Все жадные до кода :)
Владимир написал: Юрий, Ишь, как уверенно: "с дублями я разберусь". :: Арка годами не может разобраться, хотя просьба сделать так, чтобы не приходило несколько прерываний на одно событие одна из самых популярных, а Вы... Я, впрочем, разобрался, но для этого мне пришлось завести аж три стека: заявок, сделок и прерываний. А механизм получения данных в стороннем приложении очевиден: либо через файл, либо через ОЗУ двойного доступа, третьего не дано. Оба способа, мягко говоря, неудобные. Поэтому лично я написал ОДИН скрипт на ВСЕ случаи жизни на ЧИСТОМ LUA. И ничего никуда не передаю. Мне ндравицца...
У меня уже все работает через библиотеку trans2quik но мне необходим альтернативный вариант получения данных через lua скрипт. Поэтому вот мучаюсь. С дублями все просто, получил сделку, сравнил по номеру есть ли такая уже в текущей временной табличке в памяти, если нет добавил, если есть пропустил. А после уже из этой таблички делаю с ними что надо. Но вот как получать данные синхронно из библиотеки, по сути другой программы не связанной с моей, тут я в тупике.. и разобраться без примеров не могу потому как кодер я такой себе.. Кодю по тому что удается нагуглить в примерах. К сожалению варианты из книги которую посоветовал nikolz я не осилил.. там все очень сложно. А внятных примеров найти не получается пока :( В принципе уже нашел (https://quikluacsharp.ru/qlua-c-cpp-csharp/vzaimodejstvie-lua-i-biblioteki-dll-napisannoj-na-c-c/com...) как помещать данные в именованную память, но как их оттуда потом доставать в другой программе да еще и синхронно, на С++ пока не нашел примеров :(
Владимир написал: Юрий, Мало того, что они могут прилетать в функцию OnTrade по несколько штук в секунду (точнее, функция может вызываться столько раз) - они ещё и прилетают по несколько штук на одно событие, а могут и минут через десять после события прилетать. И с неверными данными могут. Не занимайтесь фигнёй, пишите на чистом Lua - это самый надёжный, самый быстрый, да и самый простой способ. Язык - говно, но остальные варианты ещё хуже.
Ну с дублями я разберусь. Мне нужен механизм получения данных в стороннем приложении из LUA. Фигня не фигня, а надо...
nikolz написал: проще всего передать данные через файл.-------------------------Для начала можете передавать в текстовом формате. Для этого нет надобности делать функцию на С for Lua. т е пишите в скрипте луа данные в файл, а в своей программе читаете эти данные. при этом Вам надо синхронизировать работу с файлом из приложений,
Этот вариант плох тем что программа не будет знать в какой момент в файле появились новые данные. То есть надо будет постоянно опрашивать файл что не есть хорошо. Надо чтобы все было по событиям, появились данные - программа их получила. Ну и скорость опять же.. Вот мне надо получать данные о сделках, а они могут прилетать в функцию OnTrade по несколько штук в секунду. Работа через файл тут явно не лучший вариант.
paluke написал: Любой механизм ipc - сокеты, каналы, разделяемая память, сообщения, dde... И зачем вообще отдельная программа? Что мешает делать всё прямо в dll?
Нужно в отдельную программу. Там слишком много завязано на нее другого разного. А какой-нибудь наименее сложный механизм в виде примера в коде на C++ можно увидеть?
Что Вам мешает вызвать функцию из dll в своей программе на C++?
Не совсем понимаю как это реализовать, получается функция в DLL вызывается из LUA чтобы передать параметры, и функция в DLL вызывается из программы чтобы эти параметры получить, но как? У меня это не стыкуется в голове как это сделать :( И вообще допустимо ли одновременное подключение DLL и в сторонней программе и в LUA ? Я потому и прошу пример кода чтобы понять как это все реализовать. Пока что я только смог получить параметры в DLL из LUA.
paluke написал: Любой механизм ipc - сокеты, каналы, разделяемая память, сообщения, dde... И зачем вообще отдельная программа? Что мешает делать всё прямо в dll?
Нужно в отдельную программу. Там слишком много завязано на нее другого разного. А какой-нибудь наименее сложный механизм в виде примера в коде на C++ можно увидеть?
Я смотрел код lua скрипта, через который подключается и получает данные платформа TigerTrade. Там кроме подключения самой DLL больше ничего нет. Не подскажете как можно таким образом в DLL получать все необходимое?
Вы же вроде на С собираетесь писать? То есть как собрать dll знаете? Экспортировать из dll функцию luaopen_<libname> с прототипом lua_CFunction В этой функции зарегистрировать lua функции OnInit(), main(), и т.д. lua функции из С вызываются через lua_call
Я смотрел код lua скрипта, через который подключается и получает данные платформа TigerTrade. Там кроме подключения самой DLL больше ничего нет. Не подскажете как можно таким образом в DLL получать все необходимое?
Код
package.path = ""
--if string.sub(getInfoParam("VERSION"), 0, 1) == '8' then
package.cpath = getScriptPath() .. "\\TigerTrade.Quik8.dll"
if _VERSION == 'Lua 5.3' then
require("TigerTrade_Q8L53")
else
require("TigerTrade_Q8L51")
end
--else
--message("wrong Quik version: "..string.sub(getInfoParam("VERSION"), 0, 1), 1);
--end
Коллеги! А можно это все как-то в виде примера с кодом увидеть? Нужно получать в реалтайме данные о сделках и подробности по бумаге (шаг цены, стоимость, число знаков и т.д.) во внешней программе на C++ через некий lua скрипт и я никак этому не дам ума так как нет опыта :(
Ознакомиться с описанием функций Trans2QUIK Вы можете в Руководстве пользователя Рабочего места QUIK : Раздел 6. Совместная работа с другими приложениями / Импорт транзакций через API / Функции для работы с транзакциями через API .
В указанной инструкции не описаны новые функции которые появились в Trans2QUIK версии 1.5
DLL создавать умею. Но вы меня не совсем правильно поняли. Вопрос не в том как вернуть что-то из DLL в скрипт на lua, вопрос в том как передать дальше данные из DLL в сторонний софт. То есть мне нужна трансляция данных из QLUA в стороннюю программу через DLL в одну сторону. Вот я не совсем понимаю как это сделать в связке DLL и сторонний софт. Надо подгружать DLL в стороннюю программу и регистрировать колбеки чтобы при получении данных DLL передавала их дальше в мою программу или как ?? Вот мне такой пример нужен в виде кода.
Есть необходимость получить данные о сделке в момент ее совершения в своей программе написанной на C++.
Как из QLUA отправить данные в свою DLL вроде нагуглил и разобрался. А как передать эти данные из DLL в свою программу, я что-то ума не дам. Опыта в этом нет, прошу помощи.
Мне необходимо в своей программе получать данные о сделке и инструменте в момент совершения сделки в Quik. И нужна именно реализация через свою dll. Ну то есть QLUA -> DLL -> C++ и все это в реальном времени.
Помогите примером, кто разбирается в теме, пожалуйста.
Уважаемые господа разработчики. Сделайте возможность получения точности цены по инструменту через API. А то получается экспорт в системы тех.анализа реализован, а элементарно отобразить согласно спецификации инструмента нельзя без костылей. Доработайте trans2quik.dll
Юрий написал: Разработчики! Не знаю в курсе вы или нет, но при смене фьючерса если ответить утвердительно на вопрос замены и склейки, то выдается потом ошибка отсутствия справочника какого-то и ничего не появляется, никаких окон, таблиц, только черный экран.
Добрый день.
Проверили проблема не повторилась. Черный экран графика?
Окон и таблиц не должно появляться. Если открыта какая либо таблица с заменяемым инструментом, то он должен замениться на новый.
Черный экран программы.. окна с графиками и таблицами вообще не появляются.
Разработчики! Не знаю в курсе вы или нет, но при смене фьючерса если ответить утвердительно на вопрос замены и склейки, то выдается потом ошибка отсутствия справочника какого-то и ничего не появляется, никаких окон, таблиц, только черный экран.
Ну если только схематично )) в реальности немного не так.. Но не суть, я уже реализовал, все работает отлично. За саму идею динамического подключения либ спасибо, а то у меня она изначально жестко в pro файле прописывалась...
swerg написал: Я бы откопировал нужное количество Trans2QUIK.dll с разными именами или разными каталогами и подключал бы их динамически, указывая для каждого экземпляра свой путь до QUIK при вызове TRANS2QUIK_CONNECT
Как указать нужный Quik при коннекте это понятно, а вот как указать какую именно библиотеку коннектить? Можете пример на C++ сделать ?
Юрий написал: Требуется из приложения на QT C++ одновременное подключение через Trans2QUIK.dll к нескольким QUIK, для получения сделок в реальном времени и сведения их в единую базу. Вопрос как организовать одновременное подключение Trans2QUIK.dll к нескольким квикам?
Идеологически правильно для каждого действия сначала подключать trans2quik к нужному терминалу, при завершении действия отключаться
Идеологически правильно, да только вот мы не знаем когда прилетит сделка из квика и поэтому надо держать коннект постоянный с ним иначе это будет уже не реалтайм поступление сделок. Ну а опрашивать терминалы каждую секунду это безумие.
Требуется из приложения на QT C++ одновременное подключение через Trans2QUIK.dll к нескольким QUIK, для получения сделок в реальном времени и сведения их в единую базу. Вопрос как организовать одновременное подключение Trans2QUIK.dll к нескольким квикам?
новичок написал: а ты не думал, что хоста может быть два - без очевидной потери производительности? :)
Не вижу смысла переплачивать за аренду двух серверов.
Цитата
иначе так и пиши: квик мне нужен для игры, никакой нагрузки там нет и мне пофиг на пасхалки от ломакеров венды ...
Как я уже сказал, винда закрыта фаерволом и никакие пасхалки на ружу не ломанутся, а с наружи винда не доступна. Так что да, пофиг на них... А что до поиграться, так у меня работают в этой схеме боевые роботы и прекрасно себя чувствуют.
Цитата
крч, не смеши аудиторию ... тут и без тебя есть центральный клован с ОС РВ на QLua .... г...г :)
новичок написал: но линукс-то тебе зачем в такой схеме ? - 100% пустая трата ресурсов. космос обогреваешь? :)
А ты не думал что на хосте с линукс может быть что-то еще помимо квика, ну как вариант вебсайт, а стало быть для него надо php, nginx, mysql как минимум...
линукс + виртуалка + ломаная венда ... в что ? ... вполне себе рабочая нищебродская гопо-трейдинг схема
остальось вдуплить зачем тут линукс + виртуалка :)
Какая бы нищебродская не была, а работает как часы, в отличие от wine. Линукс и стало быть виртуалка в этой схеме за тем, что вопрос изначально стоит о работе quik на хосте с линукс.
Цитата
... гопо-хацкеров .. ты имел ввиду ? ... :)
Хоть гопо хоть не гопо... винда из вне недоступна от слова совсем.
Для запуска Quik под линукс лучше всего юзать виртуалку, Virtualbox например. Если надо просто запустить и руками поработать в квике можно и эмулятор заюзать, но если требуется использовать lua скрипты, то стабильнее всего будет работать в винде (это я вам конкретно говорю).
Ставите Virtualbox, на него ставите компактную винду 10-ку, рекомендую эту, и закрываете фаерволом (есть и твики разные) весь выход в сеть из винды кроме квика, чтобы винда не ломилась за обновлениями.
Итого имеем изолированную компактную винду жрущую в районе 1 гига памяти на холостых и полноценно работающий без геморроя квик. Или юзаем эмулятор Wine и регулярно испытываем бурный секас от связки linux + wine + quik. По моему, выбор очевиден ))
PS: Если руки растут из правильного места, то на сервере линукс с поднятой на виртуале виндой ставим Guacamole, и удаленно полноценно управляем виндой через любой современный веб браузер из любого утюга. Винда при этом абсолютно недоступна извне что защищает ее от всяческих кулхацкероф.
Ему волю дай так он всю возможную память сожрет... Не разобрались еще в проблеме? Хотя бы выяснили в чем причина?
Проверьте на предмет "поврежденных" открытых графиков. Т.е. повреждены данные. У меня были такие после обновления. Выявил путем последовательного закрытия и перезапуска. У меня отжирал всю виртуальныю память.
Еще на версии 8.х самопроизвольно в таблицу текущих торгов и в настройки закзанных потоков данных добавляются инструменты. Обычно это фьючерсные контракты. Каждый раз убираешь и снова сами добавляются. Скажете, что брокер, но у меня вопрос - почему у брокера есть возможность добавлять мне в поток и в таблицы данные.
Я бы еще понял если бы только на одном компьютере проблема с потреблением памяти была, но она как минимум на двух мне доступных, где разные графики, и все они вполне себе работают, не повреждены.
А что до самопроизвольного добавления инструментов, проверьте не стоит ли у вас галочка в "Настройки->Основные->Программа->Получение данных->При получении нового инструмента добавлять его во все таблицы." Если стоит то надо снять сохранить и перезапустить квик.
Ему волю дай так он всю возможную память сожрет... Не разобрались еще в проблеме? Хотя бы выяснили в чем причина?
И еще, раньше закрепленный на панели быстрого запуска квик запускался и закрепленный значек его становился активным, а сейчас вместо этого создается второй значек. Нельзя ли вернуть как было? Вот зачем второй создается когда должен становиться активным первый который закреплен.
И всё-таки чрезмерное потребление памяти присутствует. Сначала при запуске вроде все нормально но поработав какое то время у меня снова потребление зашкаливает за 3 гигабайта. Ссылку на дамп процесса квика отправил на почту.
И сделайте пожалуйста возможность изменения сортировки запущенных lua скриптов в списке с помощью мыши или еще как... Чтобы можно было самостоятельно установить где какой скрипт в списке располагается.
Кажется я разобрался. Проблема была в ключе запуска -full-dump который мне рекомендовала указывать техподдержка для выявления причин падения прошлых версий. Убрал данный ключ и потребление памяти пришло в норму.
Более того. Даже без запущенных скриптов, открыто всего несколько вкладок с графиками и различными таблицами, Quik 8.8 жрет 2,5 гигабайта памяти, и это ВНЕ торговой сессии!
Уважаемые разработчики, то что Quik 8.8 перестал падать это большой прогресс, но он стал непомерно жрать память! Смотрите скрин.
К сожалению не смотрел специально какое потребление памяти было у версии 8.7, НО у версии 8.6 оно не превышало 500-600 мегабайт, при ровно тех же запущенных скриптах. Откуда такая дикая прожорливость у версии 8.8 ?
Evgeniy Karnaukhov написал: Добрый день, Для указания вещественной природы параметра индикатора нужно обязательно дополнять его значение суффиксом .0. В документации данное условие мы отразим в очередном обновлении ПО.
Это окончательный ответ по данному вопросу или следующий сотрудник все таки скажет что будете исправлять? А потом следующий подтвердит что будете исправлять но документацию, а не софт... Где определенность?
Есть куча закодированных индикаторов в которых объявлены целочисленные переменные, но не ограничивающиеся только лишь целыми числами. Как с ними быть? Изменить переменную на дробную в коде нельзя так как он закодирован, а предвидеть такое поведение квика было никак нельзя. Почему все делается как угодно но только не для человека ???
Зато я отправлял уже раз 6.. полные дампы.. из них половина полностью с квиком без своих скриптов индикаторов и ключей. Но почему-то так причина и не установлена. Во всяком случае об обратном они не сообщали.
Settings =
{
Name = "*Индикатор" ,
K = 2 ,
line =
{
{
Name = "Line" ,
Color = RGB ( 128 , 128 , 255 ),
Type = TYPE_DASH,
Width = 2
}
}
}
То дальше параметр в K нельзя прописать с дробными
Если обьявить:
Код
Settings =
{
Name = "*Индикатор" ,
K = 2.25 ,
line =
{
{
Name = "Line" ,
Color = RGB ( 128 , 128 , 255 ),
Type = TYPE_DASH,
Width = 2
}
}
}
То дальше можно прописывать дробные.
ДО 8.7 прекрасно все работало даже на lua 5.3 (версии 8.5-8.6), как и в версиях 6.17-8.6.
А что делать тем у кого индикаторы закодированы ? Уважаемые разработчики, сделайте милость, исправьте баг чтобы можно было тестить данную версию в рамках рабочих скриптов...
Не успели выложить и уже БАГИ.... Невозможно задать десятичные значения параметров в собственных индикаторах где ранее это было возможно. Тупо не ставится ни точка ни запятая в качестве разделителя дробной части. Соответственно это СРАЗУ ставит крест на дальнейшем тестировании данной версии...