Алексей Орешкин написал: 3. Правильно ли я понимаю что функцию main в роботе могу и не использовать, тогда скрипт выполнится 1 раз и всё, далее он будет завершён?
Не совсем понятна задача: требуется среди имеющихся стопов найти последний или при появлении нового стопа (а он и будет на помент появления последним) как-то на это отреагировать? Если первое - то только так, как вы написали. Если второе - то просто добавить в скрипт обработчик OnStopOrder
ответ-то на исходный вопрос прост: просто те цены, что вы видите в стакане - выставлены другим, существенно более быстрым, чем ваш, роботом, который тоже пытается жить внутри спреда и вас всё время обгоняет. И никогда вы его не обгоните.
Есть прекрасная статья - ну кто хочет разобраться, конечно, а не готовый рецепт получить, а потом удивляться, почему он не работает у меня. (ответ: потому что не подходит)
Важно осознать что там вовсе не про дельфи. Всё описанное там не зависит от языка вообще, это особенность представления в двоичном компьютере (а других у нас нет) так называемых "чисел с плавающей точкой".
Для Lua - разумеется тоже подходит с той лишь поправкой, что в том Lua, который у нас есть в рамках QUIK, у нас в принципе всего один тип числовых переменных, и это - Double.
Michael Bulychev написал: Проводились тесты интерпретатора против JIT-компилятора, а в этом случае результаты вполне очевидны. Можно взять тесты из примера и провести сравнение Lua vs LuaJIT и получить примерно такое же соотношение времени выполнения.
Справедливости ради - на нескольких сайтах уже опубликованы пошаговые "уроки" по написанию роботов. Разной степени заглубляемости. Можно начать с них. Ищутся легко гуглем
Как-то странно, у вас текст ошибки про TRANS2QUIK_IS_QUIK_CONNECTED, а в тексте программы её вообще нет. Где-то обман видится мне.
Вероятнее всего не хватает уточнения про CallingConvention. Попробуйте заменить описание функций вот на такое примерно, пример для TRANS2QUIK_CONNECT (не проверял, надеюсь мне удалось правильно соорудить синтаксис для VB):
<DllImport("D:\...Проект\Resources\TRANS2QUIK.dll", CallingConvention:=CallingConvention.StdCall, EntryPoint:="_TRANS2QUIK_CONNECT@16")> _ Public Shared Function TRANS2QUIK_CONNECT( ByVal lpstConnectionParamsString As String, _ ByRef pnExtendedErrorCode As Long, _ ByVal lpstrErrorMessage As String, ByVal dwErrorMessageSize As Long) As Long End Function
Кстати, если я не ошибаюсь, на .NET можно в один проект включать и VB.NET файлы, и C# Если так - то просто возьмите готовый заголовочный файл библиотеки от arqa (есть в архиве), там есть пример на C#, подключите его, там есть готовые правильные определения интерфейса. Ну разве что выкинуть из него что-то, что лишнее, т.к. там, к сожалению, не чистый заголовочник.
Вячеслав, у вас есть пруф подтверждающий то, что вы сейчас написали, или это ваши фантазии? Как-то всё очень сомнительно выглядит, особенно вот это
Цитата
Вячеслав написал: и в этот момент начнёт выполняться основной поток Quik, который захочет вызвать наш callback, то основной поток Quik будет ждать на lua_lock операции
С обновлением QUIK с сервера РАЗРАБОТЧИКА тоже нет совершенно никаких проблем. А в остальном - не понятно, зачем вы платите деньги такому брокеру, которому на вас откровенно плевать и который не слушает ваше мнение??
Вячеслав написал: Предполагаю, что QLua использует отладочные функции debug.sethook для перехвата управления и переключения Lua VM c потока main на поток callback'ов.
В QLua используются реальные разные потоки операционной системы Windows. Потоки переключает Windows, где реализована вытесняющая мультизадачность. Бесконечные циклы не мешают Windows переключать процессор между исполнением кода разных потоков, никакая Lua VM тут ни при чем. Что вы еще пытаетесь найти в Lua VM?
И да, код в смысле Lua-программы прерывается в реализованном случае вовсе не обязательно "между операторами Lua". Прерваться код может и "посередине выполнения одного из операторов".
sandyman написал: Ау, техподдержка? Может что-то стоит предпринять в отношении такой безалаберности брокеров?
Вы платите деньги брокеру, но требуете, чтобы другие оказывали на него давление. Стандартная позиция терпил в нашем государстве. "Царь-батюшка, убери *** в нашем подъезде, без тебя никак".
А что такое "упрощение"? ну вот конкретно можете нарисовать? Если сделать конфигурацию квика только с нужными вам графиками/таблицами - это упрощение? или что-то всё равно будет мешать? тогда что именно будет мешать в таком случае?
нене, я не предлагаю задумчивое лицо. Это анриал в обсуждаемой ценовой категории. Я про то, что это минимум цен, от которого можно как-то отталкиваться, выходя с предложением к брокеру.
пока, наверное, единственный вариант - как-то сигнализировать из самого скрипта "я запустился". Вариантов можно придумать разных (создать файл с датой/временем запуска, например, сразу при старте скрипта).
Вообще, на мой взгляд, идея хорошая как пожелание: сделать явную индикацию, что при старте QUIK не запустился какой-то скрипт, который должен был запуститься автоматически при старте.
Сергей Чугунов написал: терзают другие "смутные сомнения"...
Да нет никаких "смутных сомнений", ёлы-палы. Ретейловый брокер - это всегда компромисс между стоимостью и качеством. Стоимостью, заметьте, для клиентов, т.е. из вашего кармана. Хотите иметь невообразимые времена задержки - поступайте как делают взрослые парни: скидываетесь брокеру на отдельный для вас сервер, подключаетесь к этому серверу - и радуетесь! А что, скинуться на 10 человек/подключений - глядишь, и радость к нам придёт.
briliantoff написал: А почему-бы в файле настроек не сохранять все настройки QUIKа? Я например использую звуки, уровни, цвета да и других всяких куча, но при переустановке винды или переходе на другой комп все приходится настраивать заново.
Не очень понятно о чем это. Если вы просто скопируете всё папку с QUIK - то все ваши настройки полностью сохранятся. Не понятно как вы так переходите на другой комп, что ничего не сохраняется и приходится перенастраивать заново?
Вы подключены к серверу? по другим типам инструментов удаётся выставить заявки? Если да - то брокер не предоставил вам торговых операций по опционам, вопросы брокеру.
Вячеслав написал: QLua использует 1 мьютекс для разделения выполнения функции main и callback'ов или 2?
Вы задаёте просто удивительные вопросы, ну вот честно. Ради любопытства, можете сказать, как вы предполагаете использовать 2 мьютекса для синхронизации между потоками? ну вот чисто теоретически? А если это никак - то о чем вопрос??
Вячеслав написал: P.S. Подозреваю, что в QLua просто переопределили lua_lock и lua_unlock, чтобы разрешить многопоточность. Сейчас выясняю, как выполняется синхронизания глобальных переменных в Lua между потоками при переопределённых lua_lock / lua_unlock.
Вы так пишете, как-будто есть другие способы. Про это уже писалось (на старом форуме, как водится).
disasterovich, у вас совсем немного инструментов, между которыми вы переключаетесь.
А что если сделать несколько вкладок, на каждой вкладке - график своего инструмента. Тогда это разные графики, на каждом свои тренды. И переключаться легко и быстро.
Вячеслав написал: используется разные структуры lua_State*
Это вот откуда такой вывод?
Цитата
Вячеслав написал: и сразу ли значение, присвоенное в одном lua_State станет доступно в другом
Конечно сразу. Вы и сами легко это можете проверить, добавляя в колбеке за раз 100 (или тысячу) элементов одном потоке, и тут же вычитывая их в main(). Новые элементы будут видны в main еще до завершения колбека.
Николай Камынин написал: т е на какой момент извлеченный в main элемент будет первым в таблице, если колбеке есть вставка первого элемента?
Таблица, как известно, в QLua всегда целостна. Не зависимо от многопоточного обращения. Целостна в том смысле, что в любой момент времени количество элементов, вычитываемое через получения размера в таблице гарантированно совпадает с реальным количеством элементов на момент вычитывания значения счётчика.
Потому не очень понятен ваш вопрос. Если на момент обращения элемент в таблице уже размещён - то произойдёт корректное обращение к элементу таблицы, если же элемент еще не размещен - то его и не будет!
Единственное тонкое место, как известно из предыдущих обсуждений, состоит лишь в том, что если в одном потоке у нас есть t[1] = 5 (поток 1) а в другом потоке есть x = t[1] (поток 2) и они происходят "одновременно", то возможны варианты:
а) x = t[1] приведёт к ошибке, т.к. на самом деле в потоке 1 этот код еще вовсе не начал выполняться и элемент еще не добавлен; однако тогда и счётчик нам скажет, что количество элементов еще 0 (если это первый элемент)
б) после выполнения x = t[1] не будет ошибки, но в x окажется nil; это произойдёт в том случае, если в потоке 1 уже успеет добавиться новый элемент в таблицу с индексом 1, однако само значение ему еще не присвоится; (хотелось бы отметить, что само состояние таблицы будет при этом совершенно корректным! т.е. количество элементов в таблице равно 1, это единственный элемент равен nil)
в) в результате выполнения после x = t[1] в x будет значение 5, т.е. к моменту выполнения этого кода в рамках потока 2 в потоке 1 уже успел и новый элемент в таблицу добавиться, и значение ему присвоиться.
Николай, вы очень невнимательны. Исходники лежат рядом, каждый может легко их прочитать и собрать самостоятельно, во избежание. Ну и, конечно, любопытно, что вы скажете о разных торговых приводах, которые авторы принципиально распространяют только в бинарном виде.