Не понятно в чем проблема-то у вас? Брокер специально для вас сделал волшебство: как-будто вы продаете / покупаете один актив в разных системах. Готовый арбитраж. (На самом деле юридически, конечно же, это разные активы, разных торговых площадок, и брокер на разных площадках депонирует для вас эти разные по сути активы, однако для удобства в терминале неттирует для вас позиции по разных площадкам, как-будто это один и тот же актив.)
Но что хотите вы - не понятно. Хотите вести и видеть раздельные позиции по каждой торг. системе? Уточните у брокера, вдруг он умеет отключать это волшебство неттирования.
Заявки не могут"улетать вникуда". Они либо выставляются, либо нет. Можно проанализоровать, если заявки не выставились - выставить снова.
А еще есть параметр "Статус сессии" или типа такого, если в хотите попасть ровно поближе к началу сессии. Поставьте на него колбек - и как откроется - пулите заявки. Там может быть два параметра "статус сессии" и ,"период сессии" или что-то такое, посмотрите как они выставляются в нужный вам момент времени.
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 написал: Константин Рейм , вернете первый найденный класс.
Так в этом и состоит вопрос: как найти ОДИН подходящий класс. А не список. И подход в сообщении Константин Рейм совершенно и единственно правильный: задать свой порядок приоритета для поиска класса среди общего списка, и уже основываясь на этом списке искать первый класс, куда входит инструмент, чтобы исключить "неподходящие" классы.
Подавляющее меньшинство. У меня жестко настроены SRP, со знанием дела это говорю. В основном самодельщина этим страдает, ну и ancient software, включая квик. Вот на этапе установки многие пытаются распаковаться в temp и стартануть оттуда, это да.
Google Chrome и прочие ему подобные браузеры, WatsApp, Скайп, Zoom. Это та "самодельщина", что с ходу пришла на ум. Большинство это или меньшинство - я не знаю, однако ж это наиболее массово используемые сейчас программы, согласитесь. И все они по умолчанию без спроса ставятся в user\AppData и т.п. и практически молча обновляются там же, не понятно что неся в себе.
Не стоит рассказывать мне, как семерка не работала из PF (x86). Она у меня и сейчас оттуда работает в другой виртуальной машине.
Проверьте включен ли у вас UAC и что там с правами на каталог с QUIK. Наверняка выяснится, что либо UAC отключен наглухо, либо на папку с QUIK выданы права на запись всем пользователям. Ничего нового тут нет, QUIK так работал всегда.
Ещё не хватало, чтобы Арка заморачивалась с профилями, групповыми политиками и прочая
QUIK вполне себе работает на несколько пользователей на машине за счет того, что все настроечные файлы читает из "рабочего каталога", а не оттуда, где лежит info.exe И туда же и пишет, если не ошибаюсь. Механизм не в стиле Microsoft, но рабочий. Да и докрутить его до поддержки доменных политик не сложно, достаточно рабочий каталог указывать в профиле пользователя через подстановки.
Прикольно, конечно, у винды получилось: с одной стороны хорошо и по делу защитили Program Files С другой - теперь все проги ставятся в user/local, чтобы была возможность лёгкого и незаметного их апдейта Выходит в мире не решили толком проблему удобства пользователя и защиты Как обычно, удобство победило безопасность
Иван написал: Единственный нюакнс который заметил - как полагаю на время запуска звука приостанавливает работу скрипта. Может ошибаюсь - но все же это доли секунд.
Проигрывать файлы - затратно. Даже если само проигрывание идет асинхронно, надо до возврата из функции загрузить указанный файл (чтобы знать случилось ли это успешно), проинициализировать звуковую карту и разные прочие накладные расходы. На это время, понятно, всё приостанавливается.
Есть просто разные подходы к расчету "средней цены позиции", зависит от требуемого результата и деланий. QUIK в "Таблице лимитов по бумагам" рисует в самом деле "цену приобретения". Которая, как очень удачно и красноречиво показано выше на примере закупочной цены картошки, не изменяется при продаже. Однако часто трейдер желает видеть другой параметр - цену "безубыточной продажи" для оставшихся ведер картошки. А вот эта цена уже зависит от того, по чем был продан предыдущие партии ранее закупленного картофеля.
"Случайный" порядок будет всегда. В этом нет ни намеренной ошибки, ни злого умысла. Соответственно и "исправлено" это никогда не будет. Исправлять нечего.
Причина проста: биржа отправляет информацию о сделках, заявках и ответах на транзакции (OnTransReply) через разные подключения в шлюзам биржи. Это физически разные подключения, через разные порты (возможно даже разные хосты), посмотрите сами документацию по шлюзу МосБиржи, например. Таким образом эти потоки не синхронны уже на стороне шлюза биржи.
Стоп-заявки - сущность сервера QUIK, не биржи. Так что "отклоняет" их - сервер QUIK, При отклонении стоп-заявки сервер всегда присылает причину (текстом). Например, "недостаточно средств", т.к. иногда под стоп-заявку требуются средства. Если бы вы озвучили этот текст причины - была бы возможность ответить более предметно.
И было бы здорово, если бы вы уточнили: как связана тема и содержание вопроса??
Александр написал: При регистрации через luaopen_ квик выгружает lua53.dll раньше, чем саму dll при условии, что я не подписываюсь на main или вызываю в main ошибку при помощи LuaError.
Могли бы вы описать более подробно: как вы это поняли про порядок выгрузки?
Sergey Denegin написал: Как только программеры квика сами не могут понять, что когда они окончательно достанут своими новыми виснущими версиями пользователей, все откажутся от квика, и и брокерские конторы перестанут платить, и будут они искать новую работу. Рубят сук на котором сидят
Давно есть метатрейдер с выходом на биржу. С крутым встроенным языком и всё такое. Предлагаю бить не словом, а делом, т.е. ногами ) После расскажете как оно.