Александр М написал: Это же Ваши слова, у Вас обязан быть этот список с приоритетами. Выложите его здесь или в любом другом разделе, прикрепите сверху и все сразу увидят, что Вы там рассматриваете и ничего ли по дороге не потерялось.
Становитесь клиентом, который платит деньги за поддержку (брокер, например), и перед вами будут даже отчитываться. В крайнем случае заинтересуйте вашего брокера (финансово, через объём торгов и, соответственно, комиссии) настолько, чтобы через него получать информацию. А по-другому, зайчики, это не работает.
ВладимирА в мейне проинициализировал: .... Проинициализировал такую таблицу прямо в мейн (как и таблицу визуализации результатов),
Гнилое это дело в main() (т.е. отдельном потоке) работать с визуальными элементами. Добром не заканчивается (это из общих соображений). Хотя квиковцы с вызовом методв создания визуальных элементов из main() как бы справились, но не верю я, что там все надежно сделано. Это так, общие мысли по поводу процитированного.
Вопрос должен оформляться просто: - полный код, который каждый может скопировать и запустить/проверить/поэкспериментировать, иллюстрирующий проблему (но желательно код наименьшего объема при этом) - описание что ожидается - описание как на самом деле - вопрос "как сделать ожидаемое?"
Тогда, быть может, кто-то разберётся и ответит.
А все эти амбулы-шмамбулы - это вы для книжек своих поберегите, может их кто и прочитает. Но в вопросы такого плана никто вникать не будет.
Для полноценного интерфейса проще взять внешнюю библиотеку. Например такую. Не всё там просто и гладко, но хотя бы возможностей в самом деле много.
Александр написал: В метатрейдере скрипт работает в отдельном потоке. В метатрейдере скрипт работает пока пользователь его не завершил или не возникла ошибка.
Спасибо, вы рассказали то, что я никак не мог найти в документации, да и просто в интернетах.
Ладно, хрен с ним с этим троллем. Я на самом деле никак не могу получить ответ на свой вопрос, который давно меня заботит. Ну вот как это сделано в метатрейдере, в других терминалах? нигде ж нет никакого main(). Есть по сути просто скрипт с колбеками (да? я не ошибаюсь?) И вот когда в этих системах прекращается вызов этих колбеков?? я никак не могу этот момент найти, или ищу плохо. Или там после запуска скрипта вызов из него колбеков никогда не прекращается? Расскажите, а
Владимир написал: НЕ БЫВАЕТ "модели без main()"! При запуске скрипта ЧТО-ТО должно начать выполняться. Вот это "что-то" и есть main, хоть горшком её назови.
Чушь. Берем скрипт и начинаем из него дергать колбеки по мере поступления событий. Никакой main() для этого не нужен. И ничего "что-то" выполнять постоянно для этого тоже не требуется.
Об этом и мой вопрос: как скрипту себя остановить? как сказать "я устал, я ухожу, не дергайте больше мои колбеки" без наличия main()?
Так сказали же, вроде: по OnStop сбросить все заказанные обработчики и отдать управление в main.
Внимательнее вопрос стоит прочитать. Модель другая: нет main() чтобы не было многопоточности, есть только обработчики. OnStop - это если пользователь остановить захотел. А если скрипт сам захотел остановиться - откуда OnStop возьмётся?! Вопрос был: как в модели без main() скрипту самого себя остановить? как это сделано в других имеющихся системах торг. терминалов (не фантазийных), кто знает?
Вообще говоря морока с main() была в QUIK внедрена по глупости считаю. В каком потоке обрабатывать колбеки - это отдельный разговор, непосредственно к main() не имеющий отношения. Но с main() квиковцы внедрили такую логику: колбеки вызываются до тех пор, пока не произошел выход из main(). Как вышли (добровольно, замечу!) из main() - так вызов колбеков прекращается.
И вот на какой вопрос я при этом не нахожу ответа. Если бы не было main() - каким образом останавливать обработку колбеков, когда автор скрипта уже не хочет чтобы колбеки вызывались? ну вот в самом деле, нельзя же все время для всех скриптов вызывать колбеки. Или можно? Как этот момент решается на других платформах, кто-будь может рассказать? я вот сколько на метатрейдер смотрел - так и не смог найти ответ на вопрос: когда же "колбеки" из скриптов в нём перестают вызываться?
Многопоточности в jit нет, в этом беда. А модель API для qlua сделали в QUIK многопоточной по самой идее, так что jit, похоже, нам с вами не светит никогда. Грусть.
Nikolay написал: Владимир, это же написано в документации к расширению языка от разработчика
Как уже всем известно, документацию Владимир не читает? так что смысла давать на неё ссылки - нет, увы. Разве что только ушат помоев получите в ответ (уже получили, как видите).
Владимир написал: Я не понимаю, что такое "торговая система"
Скрипт Lua
Неожиданно. Вольное применение терминологии - это здорово, конечно, но как же вас понять-то тогда??
Т.е. у вас 2 разных Lua-вкрипта торгуют одним и тем же инструментом на одном классе, так? ну и ведите в каждом из них свою позицию по куплям / продажам. При надобности пишите в два разных файла, в каждом скрипте в свой файл. Но до добра это всё не доведёт, по-моему. Один скрипт покупает, другой тут же продаёт - в чем финансовый результат таких прикольных действий?
Не понятно в чем проблема-то у вас? Брокер специально для вас сделал волшебство: как-будто вы продаете / покупаете один актив в разных системах. Готовый арбитраж. (На самом деле юридически, конечно же, это разные активы, разных торговых площадок, и брокер на разных площадках депонирует для вас эти разные по сути активы, однако для удобства в терминале неттирует для вас позиции по разных площадкам, как-будто это один и тот же актив.)
Но что хотите вы - не понятно. Хотите вести и видеть раздельные позиции по каждой торг. системе? Уточните у брокера, вдруг он умеет отключать это волшебство неттирования.
Заявки не могут"улетать вникуда". Они либо выставляются, либо нет. Можно проанализоровать, если заявки не выставились - выставить снова.
А еще есть параметр "Статус сессии" или типа такого, если в хотите попасть ровно поближе к началу сессии. Поставьте на него колбек - и как откроется - пулите заявки. Там может быть два параметра "статус сессии" и ,"период сессии" или что-то такое, посмотрите как они выставляются в нужный вам момент времени.
Nikolay написал: А зачем "рекомендованное", если есть книга от автора языка. Купите или "купите" уже книгу Роберту Иерузалимски "Программирование на языке lua", если уж на сайте языка никак не получается.
Объем знаний по собственно языку Lua - это лишь десятая часть того, что необходимо знать для написания сколь-нибудь качественных роботов в QUIK. Так что книжка по Lua - это прикольно, но я подразумеваю, что она (или аналогичное по собственно языку) автором уже усвоено, и дальше наконец-то начинается самое интересное. Ну я надеюсь, что усвоено, хотя как показывает эта ветка...
Андрей написал: Dll это не исполняемый файл интерпретатора. Скорее всего ЛУА зашит в код.
Соберите exe-шник и будет вам "исполняемый файл", использующий для работы qlua.dll или Lua53.dll в зависимости от версии терминала. https://github.com/swerg/qlua-exe
agrevbethh написал: можно ли делать заявки когда не работает мос биржа?
На мос биржу - конечно нет.
Для тестов можно использовать т.н. "игровой сервер". Движение цен там нереальное, да еще и зацикленное, зато работает 24 часа в сутки, отработать механику собственно выставления заявок вполне можно.
Maksimus написал: Скачать справочник по LUA с оф.сайта, там не справка,а просто пару строк о каждой функции написано,и что и как делать,вообще не понятно!!!
ftp://ftp.quik.ru/public/updates/ В архиве терминала с каждой версией разработчики выкладывают документацию по применению Lua в QUIK, в описанием, примерами. Для кого? Для чего? Чтоб не осталось в стороне... Есть, конечно, разные претензии к этой документации, но она таки есть.
Христиан написал: как будет работать main() в отдельном потоке при наличии только 1 ядра? Все ли будет работать или нужно минимум 2. Поправьте если я чего-то не понимаю, спасибо
Да, все будет работать. Как именно - зависит от вашего скрипта. Если у вас main просыпается раз в 100 мс и просто проверяет не нажата ли кнопка "стоп", посл чего снова уходит в sleep(100) - то не проблема. Если же у вас main постоянно работает не засыпая на sleep и загружает полностью одно ядро - то, увы, общая скорость работы терминала в такой схеме заметно просядет, т.к. терминал будет делить единственное ядро с постоянно загруженным потоком main.
TGB написал: Я думаю, что разработчики QUIK это, наверное, понимают и не подавляют параллелизм выполнения таких функций ( а они есть).
Разработчики QUIK, очевидно, не могут сделать что-то другое, кроме как использовать блокировки, встроенные в Lua. А блокировки там сделаны так, что никакого "умного" блокирования не производят. В самом деле: как интерпретатору Lua различать хранение локальных и не локальных переменных? в обычных компиляторах с локальными переменными в разных потоках все просто, ибо они размещаются на стеке - волшебно выделяемом / освобождаемом ресурсе, но Lua-переменные - штуки более сложные, плюс с управляемым временем жизни через сборщик мусора. Так что увы, волшебства никто делать не будет.
TGB написал: В нативном коде Lua лок пустая операция во всех функциях C-API.
И поэтому "нативный", как вы его назвали, код Lua не предназначен для многопоточного выполнения.Хотите многопоточности - необходимо прописать реализацию функции lua_lock, что в QLua, очевидно, и сделано.
swerg написал: Собственно о том как понять актуальные данные или нет приходят в Lua-скрипт (и терминал) - и состоит вопрос этой ветки.
Если сформулировать чуть точнее, то, видимо, нужен признак: те данные, которые сейчас получил терминал (и Lua-скрипт) - это последние полученные (и отправленные) сервером на данный момент данные, или мы получаем "исторические данные", которые сервер по каким-то причинам решил заново послать на терминал.
Владимир написал: НЕ МОЖЕТ быть такого способа! НЕ МОЖЕТ! В ПРИНЦИПЕ не может! А "рекомендованный лучшими собаководами" я тоже давал (в другой ветке). Цитирую: "Квик как-то получает данные, которые лично я намерен считать априори достоверными и не контролировать это дело вообще никак. Луа получает эти данные от Квика".
Торговый робот выставляет заявки, ориентируясь на получаемые данные. Причем заявки выставляются на биржу в момент выставления их роботом, очевидно. В тот же самый момент для принятия решения робот опирается на те данные, которые он в это самый момент получает из терминала (а тот от сервера брокера, который тоже QUIK). И если данные окажутся не актуальными, то, очевидно, заявки на биржу будут выставлены совсем не те, которые ожидались разработчиком и алгоритмистом торгового робота. Отсюда и возникает острая надобность отличать актуальные получаемые данные от неактуальных.
Собственно о том как понять актуальные данные или нет приходят в Lua-скрипт (и терминал) - и состоит вопрос этой ветки. Очевидно, лишь разработчики могут подсказать ответ. Если ответа всё еще нет - то хотя бы донести до них в очередной раз простую штуку: такой признак очень требуется!!
Судя по написанному вами в этой ветке - вы таких роботов не разрабатывали и/или не эксплуатировали сколь-нибудь продолжительное время. О чем не я первый вам говорю, кстати. Именно поэтому - лелея последние остатки надежды на вашу адекватность - я так подробно вам написал всё это. Дальше уже ваш выбор: продолжать ли вам общение в этой ветке и в каком тоне, господин "профессиональный алгоритмист".
Sergey Gorokhov написал: Михаил, к чему это все? Мы же с Вами уже не один год общаемся и ровно этот вопрос совершенно точно уже обсуждали.ответ не поменялся, надежного способа нет, есть разные варианты которые могут дать более менее правдивую оценку актуальности данных.
Позволю себе ответить за Михаила на вопрос "к чему это все". Всё это, очевидно, к тому, что, как вы верно написали, " уже не один год общаемся", но до сих пор "надежного способа нет". Хоть бы сколь-нибудь надёжного или, хотя бы, "рекомендованного лучшими собаководами" (с) Отсюда и эмоции. И крайне странно не понимать такую простую взаимосвязь.
Let_it_go написал: смысл понятен - мне надо 32 битную, а тут 62. Но как с этим бороться, - не понимаю.
Скорее наоборот: вам нужна версия библиотеки x64 (причем для Lua 5.3), а у вас библиотека собрана под x32 платформу. (я понимаю, что вы можете не согласиться с таким толкованием, читая сообщение об ошибке, однако такое сообщение следует отнести просто в разряд специфичного юмора программистов из одной не особо известной компании МикроСофт)
Что с этим делать? Пути два: 1) Обратиться к автору библиотеки и попросить его собрать для вас вариант x64 для Lua 5.3 2а) Если вы знаете где взять исходники - обратиться к тому, кто понимает как сделать пункт 1) 2б) Самостоятельно проделать пункт 1) Если исходников нет - увы, ничего поделать нельзя.
Все графики биржевые (постфактум) - общедоступны. Достаточно взять график из любого источника и убедится, что он именно так объективно менялся, как вы видели в терминале. Если не так - тогда уже есть с чем предметно разбираться.
PS Это стандартная история: пока я не поставил ставку - все менялось строго по моим прогнозам. Как я поставил ставку - все пошло не так! меня обманывают!! Ну разумеется, именно так всё и было.
А еще в терминале есть такая клёвая супер-кнопочка с плюсом (на панельке "стандартная") Её нажимаешь - открывается диалог со всеми доступными окнами, причем с окном фильтрации вверху. В фильтр вписываешь часть названия нужного окна - и вот оно, под руками оказывается.
Gla написал: Почему нет возможности вызвать это окно просто?
А зачем закрывать эту таблицу? обычно настраиваешь терминал как удобно, с нужными таблицами - и пользуешься. И когда один раз настроил (да, изрядно помучившись со специфическим интерфейсом) - то уже более-менее забываешь про все эти странности и сложности с поиском окон, потому что они уже есть, настроенные как надо.
Gla написал: Некоторые пижоны делают еще и - символы не латиница - просто не вводятся в поле программно. Блокирована возможность.
По-моему это какие-то криворукие программисты, которые просто не могут не латинницу в пароле корректно переварить. Так-то использование не латинницы в пароле вообще напрочь убивает возможность подбора пароля.
Не понятен вопрос. Что такое "серверная консоль"? Вы хотите, чтобы программа запустилась на стороне сервера QUIK? или чего-то другого?
Если речь про запуск какой-то программы из Lua (на том же компьютере, где запущен терминал QUIK, разумеется) - то воспользуйтесь в Lua os.execute Например: os.execute("C:\\Windows\\System32\\calc.exe")
Вполне может еще сетевой буфер влиять: несколько транзакций по факту накапливаются на вашей стороне в один сетевой пакет, после чего весь макет одновременно уезжает серверу, где они все сразу обрабатывает Это можно объяснить как меньшее кол-во заявок в секунду по вашим замерам, так и одновременность их обработки.
Попробуйте связаться с брокером и уточнить у него по чем для вас встанет для вас увеличение допустимого количества транзакций в секунду. Вдруг это будет обозримая цифра. Ну либо придётся менять алгоритм, избавляюсь от простой идеи одновременного снятия буквально всех заявок. Наверняка ведь вашу торговую идею можно реализовать иначе, красивее и без внезапного снятия буквально всех выставленных заявок.
e2e4 написал: Далее окно диалога управления подвисает на 5 секунд. Откуда это время понятно, ожидание завершения потока функции main по умолчанию.
А мне не понятно откуда в этом коде возникает этот timeout Вроде всё должно завершиться сразу и корректно, т.к. в OnStop есть IsRun = false Чисто для прикола отлогируйте значение IsRun из main() и других мест, ну мало-ли какая мистика.
Пока похоже на косяки обработки обращения к пользовательским таблицам из main(), вроде про это были жалобы на форуме.
Sergey Gorokhov, скажите: я верно понимаю, что скрипт останавливается только в 2-х случаях: 1) Либо произошел корректный выход из main() -> тогда в окне скриптов не будет ошибки (и других сообщений) 2) Либо произошла какая-то (любая) ошибка -> тогда в окне скриптов гарантированно будет отображена ошибка
Верно? других вариантов нет? Точно нет?
Если так, то Иван Рубудет достаточно добавить логирование условия выхода из цикла main() и всё станет понятно.
Anton написал: Константин Рейм , вернете первый найденный класс.
Так в этом и состоит вопрос: как найти ОДИН подходящий класс. А не список. И подход в сообщении Константин Рейм совершенно и единственно правильный: задать свой порядок приоритета для поиска класса среди общего списка, и уже основываясь на этом списке искать первый класс, куда входит инструмент, чтобы исключить "неподходящие" классы.