76

Re: Общие вопросы по написанию скриптов LUA.

Список параметров динамический. Зависит от классов, которые вам доступны.
Вероятно, когда-то были классы, где были такие параметры. Теперь этих классов нет - нет и параметров.

dark184 пишет:

сейчас они у меня отображается торгуется и открыта соответственно.
Полный список вообще в природе существует?

Скорее только экспериментально. Да и биржа может разные статусы придумывать (как были когда-то добавлены всякие аукционы и прочее).
С другой стороны с практической точки зрения для вас есть состояния торгов в которые можно торговать, и в которые нельзя торговать. Причем "можно торговать" - это "сессия открыта". Все прочее - фактически для вас "торгов нет". Вот такой простой признак предлагаю smile

77 (2022-11-08 10:29:26 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

На сегодня пока выявил три признака, "закрыта", "открыта", "ЦАЗ". Перечислимый тип данных. ЦАЗ появляется перед открытием торгов за 10 минут. Т.е. если торги открываются в 10:00, то в 9:50. Уже месяца два торгую роботами и пришел к выводу что для роботов, так сказать "префлоп" очень важен, ибо заявки неплохо бы выставлять еще до торгов. Сейчас у меня 20 роботов крутятся на тормознутом I3 и если выставить заявку в начале торгов можно профукать закрытие сделки с предыдущей сессии. Хотя не факт что это зависит от проца, квик тоже не ахти скоростной судя по всему. С целесообразностью открытия сделки на "префлопе" пока не определился, но пока перевес в сторону за "да". Хотя все равно лотерея, нужно еще пособирать статистику.
Кстати, что имеется ввиду под "перечислимый тип" в луа?

78

Re: Общие вопросы по написанию скриптов LUA.

dark184 пишет:

Хотя не факт что это зависит от проца, квик тоже не ахти скоростной судя по всему. С целесообразностью открытия сделки на "префлопе" пока не определился, но пока перевес в сторону за "да". Хотя все равно лотерея, нужно еще пособирать статистику.

На открытии торгов тормозит все: биржа, инфрастуктура брокера, интернет канал клиента, в меньшей степени клиентские терминалы (т.к. тут легко нарастить мощность). Т.к. в этот момент раздается очень много информации с биржи брокерам, от них клиентам, интернет каналы забиты, сервера в полной загрузке и т.д.
По-моему пытаться в этой мутной воде что-то выловить - очень лотерея. В дни особого движа задержки (любых действий) в отдельных случаях доходили до минут. Стоит ли этот риск профита?
Ловить утренний движ надо  в сильно другой конфигурации, не домашним подключением через сервер брокера.

dark184 пишет:

Кстати, что имеется ввиду под "перечислимый тип" в луа?

Это в коде как выглядит?
Ну т.е. каким кодом вы получили "перечислимый тип"? Или это из справки?

79

Re: Общие вопросы по написанию скриптов LUA.

В общем случае что за тип данных применимо именно к луа? А то тут мозговзрыв с типами, я то привык работать конкретно с типами данных, если я переменной назначил double, он им и останется если не преобразую явным или неявным способом. А здесь пойми еще когда из целого типа преобразуется в double... Ну и в частности к getParamEx. Если верить справке, то в param_type есть значение 4, называется перечислимый тип...

80

Re: Общие вопросы по написанию скриптов LUA.

dark184 пишет:

getParamEx. Если верить справке, то в param_type есть значение 4, называется перечислимый тип...

Условное название. В Lua честного типа "перечисление" конечно же нет.
Это скорее про тип, или "смысл типа", как его возвращает биржа, в терминологии биржи.
Т.е. подразумевается, что будет какие-то одно из заранее предопределенных значений. (только не факт, что найдете предопределенный список)

В Lua это наверняка будет число. Int или Double - тут только эксперимент покажет. Хотя может быть и строка, но опять же не произвольная, а одна из строк какого-то списка.

81 (2022-11-08 15:59:33 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

В общем поэкспериментировал немного с этим типом. В принципе в приложении getParamEx() это самый настоящий перечислимый тип, как в Си...
getParamEx().param_value возвращает строку "1.000000"
getParamEx().param_image возвращает строку "открыта"
Еще понаблюдаю, но уже почти уверен что каждому целому числу соответствует свой статус в виде строки со словом... Принципиально это и есть перечислимый тип, например в Си. Но как я понял по факту такой тип данных в скрипте не создать?

82 (2022-11-08 16:54:31 отредактировано swerg)

Re: Общие вопросы по написанию скриптов LUA.

Число - это не перечислимый тип. Вернее целое число - это перечислимый тип с диапазоном -MAX_INT...+MAX_INT грубо говоря.
Перечислимые типы - это class enum в С++, например. Или перечисляемый тип в Паскале.

Но как я понял по факту такой тип данных в скрипте не создать?

На мой взгляд в Lua нет перечислимых типов.
С другой стороны набор констант - плюс-минус сойдут за перечислимый тип. А если еще значения констант для перечисления запихать в таблицу Lua - так и вовсе здорово же получится, по-моему.

Впрочем, не совсем понятна задача которую вы хотите этим перечислимым типом решить.

83

Re: Общие вопросы по написанию скриптов LUA.

Я просто разбираюсь с getParamEx(). В данном случае функция очень удобна для вычисления когда торги идут, когда нет. Плюсом похоже от стакана квика можно отказаться. Вобщем смотрю, думаю, выдумываю, упрощаю себе жизнь...

84

Re: Общие вопросы по написанию скриптов LUA.

swerg пишет:

На мой взгляд в Lua нет перечислимых типов.

Что то типа

function enum(...)
    local t = {}
    for k,v in ipairs{...} do
       t[v] = k
    end
    return setmetatable(t,{__newindex=function() error("Низзя!") end})
end

wonderful = enum("Olga","Irina","Maria")
neveragain = enum("Sveta","Nina")

85

Re: Общие вопросы по написанию скриптов LUA.

Т.е. в данном случае по индексу в массиве получаем строку?

86

Re: Общие вопросы по написанию скриптов LUA.

dark184 пишет:

Т.е. в данном случае по индексу в массиве получаем строку?

По строковому ключу получаем порядковый номер

wonderful.Olga это 1
neveragain.Nina больше neveragain.Sveta

Можно развивать эту тему, если очень нужно (зачем?)
например, написать метаметоды сравнения таблиц и добавить в таблицы скрытые идентификаторы типов - так можно запретить сравнивать друг с другом поля разных перечислений.

87

Re: Общие вопросы по написанию скриптов LUA.

Народ, возник такой вопрос. У меня запущено 23 робота, каждый создает свою таблицу. Таблицы мне нужны были только на время начальной отладки, но со временем оказалось что в принципе в таблицах нет большого смысла, проще и информативнее выводить отладочную информацию или в файл, или в message()... Если инфы много, то файл, если немного, то сообщение...
На данный момент пришел к пониманию, что из всей необходимой информации мне нужно знать только текущий статус робота. Именно эта информация для всех роботов мне важна, остальное даром не нужно. Тем более то, что мне может быть когда нибудь пригодится пишется в файл...
Поэтому хотелось бы организовать одну единую таблицу, к которой каждый робот будет иметь доступ и писать в нее необходимую информацию о своем статусе. Вопрос, возможно ли это организовать средствами lua? Из первых предположений. Первый запущенный скрипт создает таблицу с фиксированным t_id, остальные скрипты при запуске проверяют существует ли таблица, и если да, то получают к ней доступ по t_id. Ну и соответственно пишут в нее свой статус. Строку таблицы робот будет выбирать исходя из собственного уникального trans_id.
Как вариант можно запускать отдельный скрипт для создания таблицы, а роботы обнаружив таблицу будут кидать туда свой статус.
Да, знаю есть библиотека для обмена информацией между скриптами посредством файлов, но очень бы не хотелось вникать в нее без крайней необходимости...

88 (2022-11-24 15:24:52 отредактировано swerg)

Re: Общие вопросы по написанию скриптов LUA.

dark184,
не совсем понятно в чем ваш вопрос.

Скрипты выполняются изолированно. Вам нужно как-то обмениваться информацией между ними.
Вариант один - использовать предназначенные для этого готовые библиотеки (ни одна из них физические файлы на диске не использует, кстати).

Например, эту
[url]https://quik2dde.ru/viewtopic.php?id=61[/url]

Все просто, для вашего случая, прикрутите за 2 минуты.

89

Re: Общие вопросы по написанию скриптов LUA.

Почитал ветку, почитал на гитхабе. Само собой в дебри не лез. Мне лично не совсем понятен механизм. Как я понял в памяти выделяется некоторая область в которой хранятся запущенные туда переменные? Причем все запущенные туда переменные являются копиями переменных из скрипта?
Лично я вижу для моего случая несколько по иному, ибо смысл прикручивать библиотеку ради передачи ну пусть будет 50 строк статуса каждого робота? Роботы и так поджирают памяти так, что квик зависает (на самом деле каждый скрипт съедает всего около 100 килобайт, и как бы это крайне не много, но стоит их всем скопом остановить, квик зачастую весится намертво, бывает минут через 5 отвисает).
Есть некий скрипт, он запускается, создает таблицу, каким либо образом передает ее t_id всем остальным роботам (например через файл хотя бы. Есть еще мысль, этот главный скрипт выполняется в своем майн естественно, но t_id глобальный. Далее из собственного майн запускает всех остальных роботов, которые работают в своих майн. Вот только в этом случае не уверен что: во первых можно программно запустить из скрипта другой скрипт, во вторых не факт что t_id будет виден в других майн), ну и в конце концов по t_id таблицы все роботы пихают в нее свои статусы...
В любом случае, для реализации такого сценария вроде бы все есть и должно получится, правда бот админ должен быть запущен первым или в основных ботах необходимо организовать проверку на существование таблицы с t_id. Но есть вопросы:
1. ВОзможно ли создать таблицу с заранее известным t_id? Я такой возможности не нашел и подозреваю что ее в принципе быть не может, ибо хрен знает какие еще таблицы созданы и с каким t_id.
2. Возможно ли из одного скрипта запустить несколько десятков других скриптов? В моем случае запуск осуществляется файлом вида NAME_Settings.lua, в котором находятся все настроечные параметры скрипта. К этому файлу подключаются другие файлы уже самого скрипта.
3. В остальном уже сам протестирую...

90 (2022-11-26 16:04:46 отредактировано toxa)

Re: Общие вопросы по написанию скриптов LUA.

dark184 пишет:

Есть некий скрипт, он запускается, создает таблицу, каким либо образом передает ее t_id всем остальным роботам (например через файл хотя бы. Есть еще мысль, этот главный скрипт выполняется в своем майн естественно, но t_id глобальный. Далее из собственного майн запускает всех остальных роботов, которые работают в своих майн. Вот только в этом случае не уверен что: во первых можно программно запустить из скрипта другой скрипт, во вторых не факт что t_id будет виден в других майн), ну и в конце концов по t_id таблицы все роботы пихают в нее свои статусы...

можете воспользоваться lua_share: [url]https://quik2dde.ru/viewtopic.php?id=306[/url] github: [url]https://github.com/untoxa/lua_share[/url]

решений может быть много, но я бы сделал так:
1. создаете в скрипте свою таблицу, в этом же скрипте в lua_share создаете очередь
2. в этом же скрипте в цикле выгребаете очередь, обновляете таблицу (пример: 06_test_share_popqueue.lua)
3. в 100 своих скриптах (в одном или даже разных квиках) пишете в эту очередь (пример: 05_test_share_pushqueue.lua)

если не хотите чтобы очередь копилась когда скрипт не запущен - используйте очередь типа eventlists, тогда максимальный теоретический размер очереди будет равен количеству роботов, пишущих в нее. (примеры: 08_test_share_popevent.lua и 07_test_share_pushevent.lua соответственно)

можете сделать набор очередей в обратную сторону, чтобы через этот скрипт со статусами можно было управлять вашими роботами, типа start/stop/передача настроек, что угодно.

91 (2022-11-26 16:44:06 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

Сегодня по быстрому создал пару тестовых скриптов. Выяснил, что таблица, созданная в одном майне ни в какую не видится в другом майне, даже если передать правильный t_id, я передавал через файл... Ну чтож, похоже без дополнительных библиотек не обойтись sad Надо было сразу вас всех послушать... Но как обычно, сначала набьем шишки сами, а потом слушаем smile
Из двух предложенных StaticVar и lua_share больше нравится первая. Не знаю, попроще чтоли. Но! Опять же что одна, что другая выносит мозг smile Во первых потому, что вобщем то я не программист, я любитель, да и Lua я по большому счету даже не знаю, я предпочитаю Си... Который, кстати, чем больше изучаю, тем лучше понимаю что я нифига не знаю smile Ну а во вторых, даже представить себе не могу, как работают эти библиотеки. Ну как я себе представляю, в этих библиотеках создается некая область памяти, куда помещаются копии, например, переменных. НО! У меня на данный момент 23 робота. По сути они копии друг друга. Отличаются только настройками (например такие, как пороги, класс и тип инструмента и тому подобное) и выбором стратегии... Соответственно и все переменные имеют одинаковые имена, и в большинстве случаев даже одинаковые значения smile И вот у каждого робота есть переменная cur_state... Я не могу понять, каким образом запихнуть значение в общее хранилище из каждого из 23 потоков, а потом еще в одном потоке их разобрать по полочкам? Т.е. определить какое значение к какому роботу относится...

92 (2022-11-27 15:02:38 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

Подключил библиотеку StaticVar. Удалось передать статус рядового робота в робот администратор. Вроде работает.
В связи с чем возник вопрос. Возможно я не правильно это все вижу, но тем не менее... Структура у меня такая. 23 робота запущено(но может быть и меньше, и больше), каждый должен отправлять свой статус, а в будущем может быть и еще что-нибудь, например количество сделок, профит, убыток... Пока только планирую роботов этому научить, подсчитывать сумму на которую он за сутки наторговал, выяснять в профите или убытке, если в профите и есть незакрытая сделка с убытком под конец торговой сессии, подсчитать убыток, сравнить с профитом и принять решение закрывать ли сделку с убытком... Т.е., раз уж такая пьянка, то создать некую структуру с уникальным именем в каждом роботе, где например, две или более переменные(разного типа) строго упорядочены под одним именем. Причем имена всех структур каким то образом тоже надо упорядочить независимо от порядка запуска роботов.
Т.е. рядовой робот после запуска периодически при изменении переменных закидывает их в общее хранилище, а робот администратор читает все это упорядоченное хранилище скопом не задумываясь и тупо визуализирует эти данные в пользовательской таблице. Возможно ли нечто подобное реализовать?

93

Re: Общие вопросы по написанию скриптов LUA.

конечно. используйте ассоциативные массивы (таблицы) LUA.

94

Re: Общие вопросы по написанию скриптов LUA.

Вопрос немного в другом. Как все это будет работать с библиотекой StaticVar (ассоциативные массивы)?

95

Re: Общие вопросы по написанию скриптов LUA.

dark184,
не понятен вопрос. Что именно вы хотите сделать? хорошо бы пример какого-то кода и какую какие от него действия вы ожидаете написать.

Библиотека StaticVar поддерживает сохранение массивов.

96

Re: Общие вопросы по написанию скриптов LUA.

хорошо бы пример

Примера пока нет, пока в голове нет полной картины.

Библиотека StaticVar поддерживает сохранение массивов.

Т.е. если я создаю в одном роботе ассоциативный массив, кидаю его в StaticVar, то в другом роботе я его получу в том же самом виде ассоциативного массива и работать с ним можно без всяких преобразований(типа данных и прочего)?

97

Re: Общие вопросы по написанию скриптов LUA.

dark184 пишет:

Т.е. если я создаю в одном роботе ассоциативный массив, кидаю его в StaticVar, то в другом роботе я его получу в том же самом виде ассоциативного массива и работать с ним можно без всяких преобразований(типа данных и прочего)?

Именно так.

PS
Вроде был там нюанс, что в каких-то случаях какой-то тип преобразовывался к строке. Не помню точно починено это или нет.
Если найдете какую-то ошибку в библиотеке - напишите в соотв. ветке, проверим, починим.

Но в целом - да, все отлично сохраняется, включая типы, вложенные массивы и т.д. Иначе зачем бы библиотека эта была нужна.

98

Re: Общие вопросы по написанию скриптов LUA.

Такой еще вопрос, библиотека вообще еще поддерживается? Т.е. сейчас уже проблемка нарисовалась, она работает только в версии луа 5.3, в 5.4 выдает ошибку. А роботы у меня будут работать и в будущем, а соответственно версии луа в любом случае будут меняться... И вот тут засада, в 5.3 с роботом были проблемы, точно не помню, но были, в 5.4 все хорошо... Т.е. тут вариант либо адаптировать отлаженный робот под 5.3 и снова вылавливать ошибки не имея даже подобия отладчика, либо отказываться от библиотеки...

99 (2022-12-06 17:04:19 отредактировано dark184)

Re: Общие вопросы по написанию скриптов LUA.

Есть такой вопрос.
К примеру есть массив что то вроде этого

settings = {
    [common] =        {    
        [_KIND]             = 2,                -- для демо счета 0
                                                -- для реальных торгов 2
        [TRADE_ACC]            = "0123456789",    -- торговый счет
        [CLIENT_CODE]        = "0123456",        -- код клиента
            }
    [individual] =    {
        [SEC] =        {
            "RUAL",
            "AFKS",
            }
        [CLASS] =    {
            "TQBR",
            "TQBR",
            }
        [uniq_trans_id] = {
            0x20000
            0x21000
            }
    }
}

и есть колбэк в котором я могу получить sec_code

function OnDepoLimit(dlimit)
end

Теперь внутри функции надо как то сравнить элементы массива SEC с элементом таблицы dlimit.sec_code и при совпадении значений действовать. Самое очевидное решение, это перебор... Выглядит топорно, а хочется эстетики smile Поэтому ищу более изящное и быстрое решение в qlua. Поясню.
Допустим приходит колбэк и значение dlimit.sec_code будет равно "AFKS". И вот тут приходит мысль, а если не сравнивать? если каким то чудом значение превратить в индекс? Тогда из settings.individual.uniq_trans_id["AFKS"] получить значение 0x21000? Это первый набросок самой программы.
Мне уже здесь советовали "ассоциативные массивы", и по моему это именно то, что нужно в данном случае. Т.е. все, что было написано выше это все не то. Напрашиваются именно ассоциативные массивы, но пока пазлы как то не складываются полностью. Т.к. допустим инструментов у меня будет... Ну пусть 50 потом, а пока всего на двух потренироваться достаточно. Тогда немного переписываем

Table = {}
RUAL = "RUAL"
AFKS = "AFKS"

Ну вот оно вроде. Теперь если проинициализировать оба значения таблицы,

Table[RUAL] = 1
Table[AFKS] = 2
-- Ну или если избавиться от ненужных переменных, то
Table["RUAL"] = 1
Table["AFKS"] = 2

мы сможем обращаться к нужному элементу по

a = Table[dlimit.sec_code] 

и тогда, в случае если dlimit.sec_code окажется "AFKS", то в а мы получим 2.
НО! Для каждого элемента Table нужны еще два массива, первый будет общий для всех элементов

_KIND            = 2
TRADE_ACC        = "0123456789"               -- торговый счет
CLIENT_CODE        = "0123456"                    -- код клиента

А второй уже каждый индивидуально для каждого элемента массива Table

CLASS            = "TQBR"
trigger_1            = 0
trigger_2            = 0    
percent            = 0    
portfolio            = 0    
uniq_trans_id         = 0x37000
Block_sell_Case        = 0

Вот здесь то и засада, как это реализовать я не допонимаю. Причем доступ уже к этим элементам массива надо организовать через индекс "RUAL" или "AFKS". Чую это очень просто, но либо у меня представление о таких массивах хромает(а оно действительно даже не хромает, а еще даже не ходит), либо изначально ошибка...

100

Re: Общие вопросы по написанию скриптов LUA.

dark184 пишет:

если каким то чудом значение превратить в индекс? Тогда из settings.individual.uniq_trans_id["AFKS"] получить значение 0x21000?

Задать таблицу settings  так:

settings = {
    [common] =        {    
......
        [uniq_trans_id] = {
            [AFKS] = 0x20000,
            [чета_еще] = 0x21000
            }
......