Виктор Столетов написал: Quik выдает сообщение об ошибке: «error loading module 'w32' from file 'G:\БС\QUIK_VTB24\w32.dll': Не найдена указанная процедура.» Библиотека w32.dll в корне Quik присутствует.
У всех работает, у вас не работает. Так не бывает. Скорее всего не ту версию w32 используете.
Когда уже был QUIK - всей этой перечисленной фигни просто-напросто еще не существовало. Как и "стандартов". Так что нет никаких парадоксов.
PS Эмоции сливать - это прикольно, но может их лучше сливать доктору? А сюда уже вернуться здоровым человеком, и внятно кратко изложить каких конкретно фич хочется от QUIK.
Спасение - qlua.exe Делал себе, т.к. в самом деле порой требуется запустить скрипт из ком. строки, а не из QUIK. Но при этом хочется иметь "окружение как в QUIK". Пока поддержано очень мало чего, но для указанных тут случаев годится
http://quik2dde.ru/static-img/qlua-exe/qlua-exe.zip Распаковать, файл qlua.exe положить в каталог с QUIK - оттуда и запускать, все будет работать. Пока это вариант только для Lua5.3, но этого достаточно, считаю, для реальных нужд.
Старатель написал: В 7-м квике не зависает даже более примитивный код:
Мне все лень было проверить, но вот тоже такое впечатление, что в Lua 5.1 более грамотно были сделаны локи многопоточности. А в 5.3 совсем халтуру какую-то сделали.
Константин Рейм написал: Суть вопроса в том что "10:00:05" это серверное время и торги по времени уже начались, а функция status == false не дает торговать каое-то время.
Ну правильно, серверное, от сервера QUIK, а не биржи Конечно расхождение в несколько секунд как-то слишком большое, однако это ж не status мешает отправке транзакции; это значит, что биржа отклонила, т.е. с точки зрения биржи торги еще не начались. Рассинхрон в одну сторону подтверждает и то, что вечером "после окончания сессии" торги еще идут (судя по вашим же сообщениям, как я их понял). Так что либо время биржи отстает, либо сервера QUIK опережает, так я думаю.
Константин Рейм написал: Да и сама эта функция как то странно себя ведет: время "10:00:05", а status == false, (на 3-5 сек. на старте торгов задерживается), время "18:45:33", а status == true. Прокомментируете?
Такой способ в самом деле есть, я про него и писал на форуме (вы таки читаете форум? ух-ты!) Однако хотелось бы иметь честный функционал по реальному изменению количества линий в индикаторе.
Evgeniy Karnaukhov написал: В таком случае рекомендуем разобраться с самим скриптом.
Также напоминаем о рекомендации обновить терминал до актуальной на сегодняшний день версии - 8.12.
Evgeniy Karnaukhov, расскажите: каким образом скрипт может нарисовать мимо вертикальной сетки? А то мне как раз хочется вывести индикатор Lua не ровно в сетку. Ну раз вы предполагаете, что надо разбираться со скриптом - то, видимо, из скрипта такое можно сделать, верно? Расскажите как.
По исходному вопросу - ну это же стандартная фича квика рисовать графики через один: один в сетку, другой со сдвигом. Пользователи рассказывают это 10 лет - но поддержка QUIK каждый раз удивляется и рассказывает небылицы.
Старатель написал: А если ответа никакого нет (мож, пакет потерялся, мож ещё чё), то клиент так и будет ждать у моря погоды... И тайм-аутом там не пахнет.
Цитата
Евгений написал: При выдергивании шнура интернет из роутера, квик сообщает о разрыве связи спустя 30-40 сек.
Во-первых, противоречащие параграфы. Ну если вы вообще про эту ситуацию говорите, а то не понятно.
Во-вторых, еще раз задам свой вопрос: вот потерялись пакеты, и? что вы предлагаете? Как понять они потерялись или серверу нечего отправить? А никак. Только по тайм-ауту. Можно обсуждать его величину, однако видно, что а) тайм-аут имеет место быть б) делать его длительностью в одну секунду - весьма много весомых противопоказаний есть против такого подхода.
Anton написал: Да, надо переводить сокет в неблокирующий режим и вызывать connect с отменой по таймауту
С таймаутом на что? На конект - так он и так есть. Не подключилось - об этом сообщается через вполне разумный тайм-аут. Но если подключилось, но "сервер не шлёт ничего" (или в проводах теряется? как вы отличаете?) - то тут что? Может там и не должно ничего приезжать, как догадаться? какой таймаут установить и на что?
Старатель написал: первый расчёт идёт со старым значением, но уже после нажатия на кнопку OK.
А, все вчитался. Меня устраивает. В том смысле, что мне важно, чтобы до открытия диалога не производился расчет, который у меня очень долгий А после уже пусть считает сколько угодно, вариантов все одно нет.
Да, в самом деле, такой вариант работает, спасибо. Хотя отобразить диалог параметров и для добавление через контекстное меня - тоже бы очень даже не помешало, по-моему. Пусть не такой навороченный (на про все графики/индикаторы в окна, а только про параметры добавляемого индикатора
Цитата
Старатель написал: Но даже так Lua-индикатор пересчитывается 2-3 раза при добавлении, причём первый раз - всегда с параметрами по-умолчанию.
А это чтобы не расслаблялись :) Впрочем, сейчас проверял на 8.11 версии - если пойти указанным вами путём - то до отображения диалога настроек индикатор явно не рассчитывается, из него только Init() зовется для определения кол-ва линий и все.
Просьба добавить возможность изменять количество линий индикатора при изменении настроек. Например, добавить возможность возвращать новое количество линий как результат выполнения OnChangeSettings ()
Старатель написал: Может лучше попросить дать возможность задавать количество дополнительных линий через диалог? С одним общим набором свойств: типа линии, толщины, цвета.
Общие для всех линий свойства и сейчас можно запросить и задать в OnChangeSettings (хотя изменять параметры линий я OnChangeSettings, теоретезирую, но запросить точно можно). Так что и это есть уже.
На самом деле проблема именно в долгом открывании диалога при большом количестве линий, так бы и фик бы в ними. Но т.к. просить ускорить открытие диалога очевидно бесполезно, я и предлагаю такой вот метод, который отлично исправит проблему долгого открытия диалога без ущерба функциональности (для случая, когда параметры линий через диалог задавать в самом деле не требуется).
Есть ли возможность в момент добавления самописного Lua-индикатора на график заставить систему спросить параметры индикаторы до его добавления? Сейчас выглядит так, что индикатор сначала обязательно безусловно добавляется на график, и только этого после можно открыть редактирование параметров. Не всегда можно приемлемые параметры установить в скрипте заранее.
Бывают индикаторы, где приходится для выразительности выводить 100...200 и более линий. Очевидно, что параметры этих линий задаются в скрипте автоматически и пользователь точно не будет их изменять руками через диалог.
Однако, если открыть диалог редактирования параметров такого индикатора - то диалог открывается долго, т.к. свойства всех линий в него запихиваются. но там эти линии не нужны! не будет их пользователь править!
Предлагаю в таблицу Settings добавить свойство, что-то наподобии Settings.DisableLinesEdit = true / false -- по умолчанию false
Если это свойство true - то параметры линий в диалоге вовсе не отображать, далог тогда будет открываться быстрее Если это свойство false или не задано (по умолчанию) - то параметры линий в диалоге отображать как сейчас.
Anton написал: Забегу-таки вперед паровоза. Без второго потока пользовательский мейн вообще нельзя было бы выполнить от слова никак. Были бы только колбеки, как в индикаторах.
На мой взгляд, задумка оказалась неудачной. У разработчиков, очевидно, была необходимость сделать замену QPILE с его раз в секунду выполнением, причем в отдельном потоке. Для чего и была сделана main(). Но дальше началась мутная каша.
На мой взгляд, надо было сделать две категории скриптов Lua (помимо индикаторов): 1) Чисто событийный скрипт. С нем могут быть только обработчики событий. Срабатывает что-либо в нём только по событиям, в одном потоке (не обязательно основном, но в одном). Для особо скучающих добавить еще периодическое настраиваемое событие таймера, что просто. 2) Скрипт, выполняющий бесконечный цикл исключительно в отдельном потоке. Но опять же только в одном потоке, пусть и отдельном. Это будет просто полноценная замена QPile и радость любителям постоянно что-то колбась без остановки.
А вот замешивание в одну кашу двухпоточности в рамках одного скрипта лишь добавляет слишком сложных глюков, при этом постоянно получая кашу в анных, да еще и залезая в дедлоки порой. Никакой пользы при этом это не приносит совершенно, считаю.
Вы документацию уже прочитали про индикаторы? Впрочем, изменять количество линий через параметры индикатора - нельзя, количество линий одноразово определяется значением, возвращаемым из Init() Единственный трюк - это вернуть из Init() достаточно большое заранее достаточное количество, при этом фактически назначать значение только нужному в данный момент количеству линий, остальным линиям возвращать nil, тогда они не будут рисоваться.
На любой график добавляем метку вида "Картинка из файла". (Может с другими типами тоже есть проблема, проверял только на этом типе меток) Выбираем какую-нибудь картинку в параметры. Задаем руками точное значение "Цена"
Метка установилась.
Мышкой на вертикальной оси "тянем вверх", увеличивая масштаб графика.
Встаем на метку, "Редактировать" Почему значение "Цена" изменилось?! Мы же руками его явно задали??
Если значение "Цена" восстановить руками и снова поизменять масштаб вертикальной оси - то значение "Цена" в параметрах метки снова уплывет (и метка сместится на новое значение) Как так?!
Удивительная программа QUIK В какой бы функционал не залез - там обязательно сразу наткнёшься на прорву багов и недоработок, причем гугление пофоруму (я к тому, что по остальным проблемам с графиками, на которые наткнулся, я уже нашел соотв. тему на форуме)
Константин написал: Но все равно остается костыль в виде разбора Lua массивов и т.д.
Сделайте один раз свою обёртку, разбирающую все это - и пользуйтесь на здоровье. Очевидно же, что это ваше пожелание реализовано не будет до 2050 года, смысл тогда желать?
Константин написал: Так же как и с Lua, сделать возможным написания своих программ для QUIK на этих языках. Возможные варианты подключения exe, или dll своих программ. Если допустим при использовании dll то чтоб QUIK вызывал функции OnInit, OnStart, OnDeinit и т.д., и т.п. в зависимости от того скрипт написан, или индикатор.
Конечно данное обновление потребует время. Но даст возможность отказаться от кастрированного Lua. И избавит от танцев с подключением к нему DLL. Конечно сейчас можно подключаться через костыль в виде lua5.X.lib/dll. Но все-же это костыль, который ограничивает некоторые возможности обмена данными.
В чем костыль? И какие такие "новые возможности обмена" предоставит вам другой язык? вы о чем? У "другого языка" будет ровно такое же весьма ограниченное API. И что для вас это изменит? Ну вот в самом деле?
Lua-интерфейс позволяет делать свои какие угодно DLL.А trans2quik и вывод информации через DDE позволяет делать свои exe. Что ж еще требуется-то??
Деньги брокеру платятся. С него и требовать есть смысл. Удивительно как ловко брокера отпинывают пользователей "это QUIK" и пользователю почему-то покорно идут на форум квика. Ну и смысл? Очевидно же, что в проблемах СМС разобраться может только брокер, т.к. это все у него хозяйство настроено. Но брокер ловкий.
Anton написал: Я тоже сейчас посмотрел внутрь (скачал сорцы у swerg) и есть подозрения, что работать эти функции не будут через w32. Например, PeekMessage
Код
long lwnd = MYP2HCAST luaL_optinteger( L, 1 , 0 ); // раз косяк
lua_pushnumber( L, ( long) msg.hwnd); // два косяк
lua_pushnumber( L, msg.wParam); // три косяк
lua_pushnumber( L, msg.lParam); // четыре косяк
На 64 битах HWND это void *, WPARAM и LPARAM - uintptr_t и intptr_t соответственно. Тут их режут до 32 бит и потом еще в даблы упихивают.
Часть функций после появления Int64 для Lua в QUIK я поправил (PostMessage, SendMessage), функции типа PeekMessage мне не нужны, их и не правил пока.
Ноги у либы растут из Lua 5.1 и x86, очевидно, и видимо автору хватало lua_number (который, как известно, в зависимости от сборки Lua может быть int или double; в QUIK это было double). Для Lua5.1 на x64 в этих функциях по уму надо был переходить на user data, чтобы не терять ничего, но после появления нормального int64 в Lua5.3 в QUIK надобность в этих извращениях, по счастью, отпала.
Anton написал: Дайте угадаю, в мейне есть вызов какой-то сишной функции? Так-то, если в нем один луа-цикл без никто, мейн лок захватит и все, квик на первом же колбеке встанет колом, о чем тут и сообщают.
Не надо ничего угадывать. Я взял буквально тот скрипт, который здесь был приведён. Вот полный текст:
Код
function OnStop ()
is_run = false
end
function main ()
is_run = true
a = 0
while is_run do
a = a + 1
end
end
Едрёна-батона... А я еще подумывал сменить комп на поновее-получше. Неужто опять враньё с этими ядрами/гигагерцами?!
Запустил скрипт этот с бесконечным цикл на своем Intel Pentium E2180 2ГГц, два ядра, прошу заменить. 2Гб оперативы. Да, проц грузится на 50%, это понятно, но QUIK совершенно без задержек реагирует на мышь, графики едут, к северу подключаюсь / отключаюсь, таблички сделок моргают, рукописные Lua-индикаторы работают. Неужели у вас на указанном железе в самом деле висит?! Определённо обманываете.