Что увивительно: вы подробно и многословно излагает ваши домыслы и предположения, а также оценки. В то же время ваши "баг репорты" (ну вам так кажется, что это баг репорты, судя по оформлению) крайне скудны и даже бесполезны именно из-за этой скудности; т.е. явно видно, что это слив эмоций, о чем я и пишу. Я же, в свою очередь, хотел бы пробудить вас к конструктиву, ибо лишь конструктив способен изменить мир. И именно изменение мира мне бы хотелось видеть. Да, я бы хотел пробудить вас к большему конструктив.
Ну а уж приносить конструктив в ваши сообщения для всеобщего блага или продолжать лишь бессмысленный слив эмоций - это ваше решение, это ваша жизнь; наполнять её смыслом или нет - решать вам.
повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
Владимир написал: Я всё-таки пробежался по сообщениям службы техподдержки. Слова же "Ваше пожелание было реализовано в версии X.X.X терминала QUIK" встретились лишь 6 раз.
Старатель написал: Про CQ01954637 тоже месяцами врали, что не воспроизводится и про CQ01939238 и мн. др... Потом признались, что проблема действительно есть.
Я таки сомневаюсь что "врали". В самом деле не воспроизводилось. Потом удалось нащупать условия. Часто пользователю кажется, что "так всегда", а по факту у него - комплекс неких частных условий. Причем возможно даже массовых, но отличающихся от тех, в каких живут разработчики по массе разных причин (очевидно, например, что разработчики не гоняют QUIK месяцами не закрывая; наоборот, постоянно перезапускают для проверки новодела).
Впрочем, это не объясняет не поправляемых годами признанных (т.е. воспроизведенных) проблем.
Андрей написал: Или вы про колбек OnMoneyLimit? Я не измерял насколько он раньше, чем 1й onTransReply, но экспериментально видел, что за 50мс отправлять создание не получается.
Изначально речь не шла про "быстро". Речь шла про "ненадежно". Именно в этом разрезе я вам и пишу. И т.к. нужна надежность - то хоть OnMoneyLimit, лимиты по нему меняются, как изменились лимиты - точно можно ставить заявку новую. А может и OnOrder попробовать. Еще раз подчеркну: речь про надежность, а не про "быстрее".
А если надо быстрее - долбить на все эти события, где-то да пройдет "побыстрее".
Андрей написал: Событийная модель и приводит к тому, что создание ордера требует паузы в 100-300мс после снятия.
После какого конкретно события 100-300мс? (нет события "снятие заявки"; есть отправка транзакции, получения ответа на транзакцию, изменение состояния заявки, изменение состояние лимитов; давайте уже выражаться более точно, для лучшего понимания; "кто ясно мыслит <-> тот ясно излагает")
Цитата
Андрей написал: как обеспечить функционал, аналогичный MOVE_ORDERS срочного рынка. Почему там это есть, а здесь нет?
Потому что такой функционал предоставляет секция срочного рынка. Пишите ваши пожелания на биржу, здесь про доработки биржевого ядра писать бесполезно.
Цитата
Андрей написал: Тогда я не совсем понимаю, чего ждет сервер QUIK от биржы на клиентский KILL_ORDER.
Сервер QUIK ждет ответа на эту транзакцию. Впрочем, этот ответ ему до лампочки, он его просто транслирует на клиента. А после, по другому каналу (дада, мир устроен сложнее, чем вам кажется), биржа отправляет информацию об изменении статуса заявки на "снято", в результате чего сервер QUIK уже разблокирует деньги на лимитах. Одна беда: если не ошибаюсь, сначала изменение заявки рассылается, а уж потом разблокируются лимиты, но это не точно. Впрочем, пока до клиента по сети доедет сигнал об изменении состояния заявки - скорее всего на сервере лимиты уже будут разблокированы; именно поэтому я и предложил именно на это событие реагировать; не понял только из ваших рассуждений: вы попробовали такой вариант?
Цитата
Андрей написал: Я никак не могу отправить изменение ордера за 20мс, хотя очевидно, что лимиты позволяют.
Возможно надо просто смириться с мыслью, что в рамках обычного клиента QUIK желаемые скорости недостижимы. И надо посмотреть какие еще есть варианты роботизированных подключений; а варианты эти есть. И что значит "лимиты позволяют"? Не торгуйте на всю котлету, если хочется чудес, торгуйте на пол-котлеты, тогда второй половины будет хватать на все эти move.
Старатель написал: За много лет менялись компы, ОС, ЦП, ПЗУ, ОЗУ... Неизменным осталось только отсутствие таймаута ожидания при установке связи с сервером.
Фиговатый канал связи? Особенно проблемы с демо очень удивляют.
Андрей написал: Проблема в том, что между этими транзакциями приходится ждать сколько-то много мс, иначе создание еще не понимает, что перед этим отправлена транзакция снятия.
Вроде бы тут как раз должна пригодиться событийная модель QLua: отправлять вторую транзакцию по изменению состояния первой заявки на "снята".
Цитата
Андрей написал: 1) Сделать вторую версию ф-ции sendTransaction, которая пропускает "проверку достаточности средств на сервере", идет сразу на биржу.
Заявки с разными ценами, так что средств от первой заявки может не хватить на вторую, так что проверка достаточности средств необходима.
Цитата
Андрей написал: Ведь ваша проверка на сервере Quik - это как пре(дварительный)фильтр. Без него ничего страшного тоже не произойдет
Произойдёт. Потому как сервер QUIK в данном случае - единственная проверка достаточности средств в случае фондового рынка. С точки зрения биржи (для фондового рынка) все операции выполняются на счете брокера, на весь лимит брокера.
Цитата
Андрей написал: Без него ничего страшного тоже не произойдет - получим отказ от биржи в реплае.
Либо первая заявка "сыграет" за это время - что делать со второй? Или сессия торговая закроется - что делать со второй заявкой? а в первой?
Однозначно "правильно" ответить на эти вопросы не представляется возможным, каждый видит приемлемый для себя вариант.
Так что только самостоятельно, ручками в своём роботе каждому придётся решать эту задачку. Сообразно своему видению правильных путей разрешения краевых сценариев.
Let_it_go написал: обычный код я ничего необычного с ним не делал
Главное никому этот код не показывайте!
PS номера строк в сообщениях об ошибках формирует интерпретатор Lua. QUIK тут ни при чем, QUIK вам не поможет. можете проверить ваш код на каком-нибудь online-Lua - результат будет тот же, я уверен (ошибка без номера строки).
s_mike@rambler.ru написал: Когда задают вопрос про версию, это означает, что никто даже и не пошевелился, чтобы найти ошибку. Она проявляется на любой версии ккогда спрашивают код скрипта, это означает, что никто даже не почесался прочитать первые три сообщения ветки когда спрашивают скриншот окна сообщения, это значит, что никто даже не пробовал поискать в текстах терминала слово "видеопамяти " Даниил, вам спихнули эту проблему, потому что все равно никто не решить не может?
Здесь вы совершенно неправы. То, что кому-то кажется "да у меня в каждом скрипте так" на самом деле означает лишь то, что человек этот каким-то определённым образом пишет скрипты. Но делает всегда именно так, поэтому "в каждом скрипте...". Но, важно! не в "любом", а в "каждом моём". Далее. Если кто-то воспроизведёт примерно подходящую по описанию ошибку - скорее всего это будет совсем другая ошибка, а не та, с которой сталкиваетесь вы. Т.е. вашу проблему - уж точно не починят. Именно поэтому спрашивают всегда конкретный проблемный код. А не обще-абстрактные рассуждения. На любом абсолютно программистском форуме.
Если есть конкретный проблемный код - с ним всегда здесь разбираются. Как минимум убеждаются, что с ним в самом деле есть проблема. Это видно по сообщениям поддержки. Другое дело, что не всегда, скажем мягко, в итоге проблему чинят - это да, это так. Но не приводить проблемный код - это вообще крайне странный подход к общению. Или вам просто эмоции слить?
На самом деле требуется рисование прямоугольников произвольного цвета заливки по заданным координатам на графиках из скриптов (по времени) Когда уже сделаете?
Кстати, как по мнению пользователей должны задаваться горизонтальные координаты? по времени? по пикселам? по интервалам времени? или как?
[QUOTE]ddonny написал: и например, если делаю так:
function OnInit() --Subscribe_Level_II_Quotes(CLASS_CODE_OPT, TICKER_OPT) --переменные инициализируются данными, после второго запуска скрипта LEVEL2_BID_COUNT = getQuoteLevel2(CLASS_CODE_OPT, TICKER_OPT).bid_count LEVEL2_OFFER_COUNT = getQuoteLevel2(CLASS_CODE_OPT, TICKER_OPT).offer_count end [QUOTE]
Данные не мгновенно же появляются. Subscribe_Level_II_Quotes <-- происходит подписка, данные приедут позже (причем только после выхода из обработчика Lua! это надо учитывать)
Старатель написал: В результате вместо того, чтобы выдать ошибку, что у пользователя нет прав для работы с отключенным кодом клиента, QUIK стал молча подменять его на другой. Т.е., скрипт отправляет транзакцию с CLIENT_CODE = client2//brokerref, а заявка приходит с client_code = client1, brokerref = client1//client2//brokerref Это косяк.
Ну это такой момент, который пошел от пользовательского интерфейса QUIK. Если подключен только 1 логин (вернее один "код клиента") - то этот код автоматически подставляется, чтобы пользователя не грузить и "было удобно". В общем-то логично, согласитесь. И для подавляющего большинства пользователей (я думаю для всех) это удобно, думаю и с этим вы согласитесь.
Отправка транзакций через QLua в этом месте не отличается. Все волшебство (которое, оказывается, еще и на сервере) просто работает.
Я примерно понимаю ваше негодование, вы надеялись, что транзакции не проедут и ошибок торговли не будет. Однако в самом деле зачем такое поведение исправлять. Оно явно устраивает подавляющее большинство пользователей, которые имеют только 1 код клиента и этим кодом даже не заморачиваются ни при ручной подаче заявок, ни пир торговле через скрипт.
swerg написал: 1. В документацию включить список функций, которые нельзя вызывать из OnStop() по каким-либо причинам, как нарушающие корректность выполнения программ Lua или работу терминала. 2. После этого у вас будет список функций с ограничением по функционалу. Очевидно, далее следует работать над уменьшением размера этого списка, т.е. надо добавлением возможности всё же вызывать функции из этого списка из OnStop() (c постепенным удалением таковых функций из данного неприятного списка).
Просьба уточнить, о каких конкретно функциях, вызываемых из OnStop(), идет речь? Быть может, мы не так поняли, но речь вроде бы шла про блокировку основного потока функцией OnStop() (как и описано в документации).
Речь о функциях, которые нельзя вызывать из OnStop.
swerg написал: Не должно быть никакой привязки к визуальной таблице
Не нравятся мне безапелляционные сообщения подобного рода. Если Вы так пишите - аргументируйте.
Каковы ваши цели? И где аргументация с вашей стороны? Есть ваше мнение общие рассуждения по поводу "решение должно быть быстро реализуемым", "удобным для большого количества пользователей QUIK". На речи депутатов похоже, общие слова "за мир во всем мире".
Что вам нужно аргументировать? то, что в скрипте должен быть контролируемый полностью доступ к данным? Считаю, что это очевидно. Или быть может вас устраивает ситуация, когда сейчас чтобы получить свечей приходилось бы открывать графики, задавать на них какие-то "идентификаторы", лазить по меню и что-то нам настраивать чтобы в скрипте в итоге поехал поток данных? это удобно?? Очевидно же что нет. Так что требуется аргументировать?
И, главное, с чего вы считаете, что я для вас что-то должен аргументировать?
Albert Eritsyan написал: Просьба зарегистрировать пожелание предоставления пользователю возможности выбора путей сохранения этих файлов без глобальных изменений кода Quik.
Я так и не понял: что вам мешает перенести весь QUIK на нужный HDD? И никакой опции не понадобится.
Albert Eritsyan написал: Как то странно проецируется alltrade в RAM, при проецировании столько памяти в RAM не должно было выделиться, а должны были выделиться только под нужные страницы файлов.
Значит с точки зрения Windows именно столько и требуется выделить "под нужные страницы файлов". "Проецирует" в память - операционка, не QUIK.
Albert Eritsyan написал: Данная опция обеспечит возможность расположения этих файлов на HDD, в то время как программа сама будет находиться на SSD (чтобы не затирать SSD временными большими файлами).
Странное желание. Основное время запуска QUIK (а только это время волнует пользователя) занимает как раз чтение файлов с накопленными данными. Если у вас нет места на SSD - просто перенесите весь QUIK на HDD. Ну если вы готовы мириться с упавшей от этого скоростью запуска терминала.
Дада, снижение траффика - это как раз путь уменьшения размера служебных файлов. А если вы считаете, что все, что вы получаете, вам требуется - то тогда и служебные файлы будут вот такими, да.
Не должно быть никакой привязки к визуальной таблице Должен быть чисто программный интерфейс на манер CreateDataSouce c последующим вызовом call-back функции на каждую новость. И API перебора всех уже имеющихся новостей.
Roman Azarov написал: Как уже было сказано ранее, такова реализация работы OnStop() на текущий момент, это не является ошибкой.
Ограничения, не указанные в документации - есть ошибка.
Цитата
Roman Azarov написал: Просьба более подробно описать, как Вы хотели бы видеть логику работы функции в данном месте. Готовы зарегистрировать пожелание на доработку.
Регистрируйте. 1. В документацию включить список функций, которые нельзя вызывать из OnStop() по каким-либо причинам, как нарушающие корректность выполнения программ Lua или работу терминала. 2. После этого у вас будет список функций с ограничением по функционалу. Очевидно, далее следует работать над уменьшением размера этого списка, т.е. надо добавлением возможности всё же вызывать функции из этого списка из OnStop() (c постепенным удалением таковых функций из данного неприятного списка).
Sergey написал: У меня есть основной скрипт и еще несколько дополнительных, которые основной подключает через requare. Все скрипты расположены в отдельной папке но не внутри директирии QUIK (так нужно).
Указывайте полный путь к скриптам, тогда они всегда будут находиться. Как - см. выше
Я бы откопировал нужное количество Trans2QUIK.dll с разными именами или разными каталогами и подключал бы их динамически, указывая для каждого экземпляра свой путь до QUIK при вызове TRANS2QUIK_CONNECT
Roman Azarov написал: В текущей реализации, экспорт таблицы текущих торгов возможен только средствами DDE (не обязательно в Excel) и ODBC. Можем зарегистрировать пожелание на возможность экспорта в текстовый файл. Регистрируем?
Зарегистрируйте другое пожелание. Из ТТТ должен открываться таблица, отображающая соответствие названий параметров и их "формальное название". Тогда каждый сам легко и наглядно сможет это соответствие увидеть без всяких DDE и экселов. С обязательной возможностью копирования данных из такой таблицы!!! чтобы не приходилось перепечатывать названия параметров.
Вам в этом случае не придется поддерживать актуальность документации, просто отпадает надобность в документировании.
TGB написал: 1. Непонятно, почему таблицы QUIK обслуживаются в основном потоке обработки колбеков. В чем проблема сделать обслуживание таблиц QUIK в отдельном специальном для этого потоке?
Это как раз понятно: лезть в объекты интерфейса Windows и связанных с этим собственных структур данных из разных потоков - слишком сложная замута. Потому её всегда избегают.
Цитата
TGB написал: а все работу по завершению скрипта пользователя выполнять в потоке main.
Сам себя поток прибить не может. Должен кто-то "извне".
Цитата
TGB написал: 2. Зачем завершение скрипта пользователя выполняется в потоке обработки колбеков?
Не совсем так. Очевидно, что написан обычный стандартный код (который выполняется в основном потоке):
Код
вызвать OnStop()
подождать завершения потока main() или таймера на 5 сек <<-- вот тут проблема
if сработал таймер -> прибить поток для main()
Т.к. идет просто ожидание без процессинга очереди сообщений Windows и прочих действий - то и получаем, что и терминал в это время висит, и функции, которые через основной поток выполняются, не рабтают.
Положим как-то мы сформировали свечи для нестандартных TimeFrame Вопрос: есть ли возможность как-то их отрисовать штатными средствами QUIK, через Lua-индикаторы, например? Я не сумел придумать как это сделать. Ведь на графиках, на которые накладываются индикаторы, есть возможность выбирать только стандартные TimeFrame. Но может есть какие-то другие варианты?
Andrey Bezrukov написал: Описываемое Вами поведение, формально, не является проблемой или ошибкой в работе lua-скриптов в терминале.
Это несоответствие описанного в документации поведения программы, в значит - ошибка. Плюс, конечно, совершенно кривая и топорная реализация ожидания завершения main(), когда (из документации)
Цитата
"РМ QUIK может некоторое время находиться в «подвисшем» состоянии"
Итак, открываем документацию, файл "Использование Lua в Рабочем месте QUIK.pdf".
На картинке "Событийная модель" после OnStop мы видим фразу:
Цитата
"Прекращение вызова обработчиков событий терминала QUIK".
Однако далее в тексте мы видим другое объяснение:
Цитата
"Также необходимо иметь в виду, что функция OnStop() выполняется в основном потоке РМ QUIK, и, так как в момент ожидания завершения скрипта (5 секунд) он занимает основной поток РМ QUIK, то другие обработчики событий уже не вызываются, а само РМ QUIK может некоторое время находиться в «подвисшем» состоянии."
Т.е. это уже не "мы сознательно сделали так, чтобы обработчики не вызывались", а "ну, блин, ну так во вышло, что по случайному стечению обстоятельств из-за имеющейся реализации обработчики вызываться перестают". Между "мы сознательно так сделали" и "ну вот так вот получилось" - есть большая разница.
Окей, я продолжаю далее следовать рекомендациям из того же описания (официального). Чуть ранее:
Цитата
Возможные подходы написания скриптов Lua для плагина QLua в Рабочем месте QUIK .... 2. Вся необходимая логика описывается в функции с предопределенным именем main().
Супер. Такой подход нам и демонстрирует автор изначального сообщения этой темы. Он все делает в main(). Использует лишь один обработчик, связанный с интерфейсом пользователя OnStop(), т.к. надо же скрипту сообщить "остановись, хватит". Ибо иного пути нам не предоставлено.
И тут вдруг выясняется, что в этом описанном в документации подходе есть "особенности", когда часть функций попросту не работают в каких-то ситуациях! Как это так?? Это явная ошибка, которую необходимо исправить. Да, обработчики событий не должны вызываться после OnStop, в этом есть логика, да и это явно описано в документации. Но другие-то функции взаимодействия с терминалом почему не должны работать?? потому что "так получилось"? Нет уж, это не есть обоснование; это лишь признание кривоватой реализации данного места, которая, очевидно, является ошибкой и должна быть исправлена.
Mixa, пойми главное: ты можешь сейчас здесь спорить до посинения хоть два года - ничего не изменится. (см. комментарий про 10 лет) Пока сам не сделаешь как тебе надо, опираясь лишь на те средства, какие есть.
На что потратить следующие два года твоей жизни - решать тебе.