151

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

(accuracy==nil and 0 or accuracy)

Тогда вот эта строка вызывает много вопросов... Хотя... В том же Си, да и не только, есть сокращенная запись if else. Неужели в луа это и есть сокращенная запись if then else. По крайней мере выглядит это именно так... Т.е. запись эквивалентна

function qwerty(accuracy)
    if accuracy==nil then
        return 0
    else
        return accuracy
    end
end

152

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

Изначально был вопрос "как округлить значение" (число). Это все же не тоже самое, что "как отформатировать строку с заданной точностью".
Хотя в разрезе QUIK скорее требуется форматирование строки, да.
Вероятно далее будет вопрос "округлить с учетом шага цены" smile

153 (2023-02-08 10:47:27 отредактировано dark184)

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

Вероятно далее будет вопрос "округлить с учетом шага цены"

Не, такого вопроса не будет, это уже реализовано и давно smile

Хотя в разрезе QUIK скорее требуется форматирование строки

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

да.

Это следует читать как ответ на вопрос?

Неужели в луа это и есть сокращенная запись if then else

154 (2023-02-08 10:49:21 отредактировано swerg)

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

dark184 пишет:

Хотя... В том же Си, да и не только, есть сокращенная запись if else.

Не совсем понятно что значит "сокращенная запись if else".
Скорее вы говорите про другое, про то, что логические выражения вычисляются не полностью, а "до получения однозначного результата".

В документации Lua это описано так (используется термин "ленивое вычисление", причем определено оно только для логического оператора and и or):

3.4.5 – Логические операторы

В Lua существуют следующие логические операторы: and (И), or (ИЛИ) и not (НЕ). Как и управляющие структуры, все логические операторы считают false и nil как false, а все остальное как true.

Оператор отрицания not всегда возвращает false или true. Оператор конъюнкции and возвращает свой первый аргумент, если его значение false или nil; иначе, and возвращает второй аргумент. Оператор дизъюнкции or возвращает свой первый аргумент, если его значение отлично от nil и false; иначе, or возвращает второй аргумент. Оба and и or используют ленивое вычисление; т.е., второй операнд вычисляется только если необходимо.

Интересно, что эти операторы возвращают первый или второй аргумент, а вовсе не true/false. Сам первый раз на это обратил внимание.
На этом и построен трюк

accuracy==nil and 0

155

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

dark184 пишет:
да.

Это следует читать как ответ на вопрос?

Неужели в луа это и есть сокращенная запись if then else

Это просто междометие в данном случае smile

156

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

На этом и построен трюк

Блин, так и мозг вывихнуть можно smile Даже представить себе такое не мог в луа smile В принципе для меня все прояснилось теперь, спасибо.
Теперь понятно что это трюк, хотя по сути это и есть условие if-then-else. Но функция которую я приводил как аналог, хоть и выполняет тоже самое, эквивалентом все же считать нельзя, трюк работает чуть по другому.
Теперь понятно и для чего сравнивать accuracy с nil, иначе сломается вся логика smile

157 (2023-02-18 18:22:37 отредактировано dark184)

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

Можете подсказать с таким вопросом. Очень не хочется полагаться на запись/чтение в файл(хотя я использую запись в файл, но исключительно для логов), любой сбой и я теряю важные данные...
QUIK вроде бы более менее адекватно рассчитывает среднюю цену по инструменту. Пример, допустим купил я один лот(для краткости пусть будет все по одному лоту чтобы не использовать полную формулу) по инструменту, чуть позже делаю вывод что неплохо бы усредниться еще одним лотом... Тут понятно, средняя цена плюс цена только что купленного лота и пополам. Через какое то время я опять делаю вывод что надо бы усредниться еще одним лотом... И вот здесь расчет средняя цена плюс цена только что купленного лота и все это на 3 уже не катит, будет ошибка. Уже надо знать цену всех трех лотов и считать среднюю цену(правда можно даже и в этом случае правильно посчитать среднюю цену). Квик же считает правильно, ну плюс минус небольшая погрешность, ей можно пренебречь... Проверял лично, сомнений нет что считает верно.
Из чего я могу сделать 2 вывода:
1. Либо квик все таки знает цену всех лотов, а значит где то он их хранит. Вот бы до этого добраться, есть такая возможность?
2. Либо квик ничего не знает, кроме средней цены и количества лотов до покупки и цены с количеством лотов последней покупки. Из этих данных он вычисляет новые значения средней цены. Принципиально вроде бы ничего сложного нет. В моем примере уже перед третьей покупкой несложно посчитать среднюю цену даже мне, достаточно среднюю цену умножить на количество лотов в портфеле(в данном случае еще 2), затем при совершении третьей покупки к этому прибавить цену последней покупки и разделить на 3. Получим верный результат. НО! Если квик считает именно так, то вычислить изначальную цену уже невозможно.

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

158 (2023-02-18 21:53:28 отредактировано swerg)

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

Скорее всего QUIK ведет цену и объем покупок.
Знать среднюю цену прошлых покупок и их объем достаточно, чтобы рассчитать среднюю цену с учетом новой сделки. И обязательно учесть её объем.

Доступно ли значение объема на стороне терминала - не знаю.

159

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

Средняя цена и объем покупок есть в квике, их без проблем можно вытащить в любой момент. Интересует возможно ли вытащить цену всех покупок? Как в примере, есть 3 покупки(в данном случае каждая покупка по одному лоту чтобы не заморачиваться с полной формулой), по разным ценам, например 100, 120 и 140 условных единиц. Средняя цена по квику будет 120 с пренебрежимо малой погрешностью, даже считать не нужно. А вот цену всех покупок 100, 120 и 140 однозначно можно выдернуть из таблицы сделок пока она не опустошилась после смены торгового дня. А вот возможно ли эти цены вытащить когда таблица сделок уже опустошилась? Вручную я могу заказать отчет по всем сделкам, а вот из скрипта луа???
Рассчитать цену первой покупки уже невозможно, ибо может случиться и так 95, 125 и 140 и средняя цена будет тоже 120 как и в первом случае. Мне для расчетов нужно отталкиваться не от средней цены, а именно от первой, ну или последней. От первой немного проще, ибо расчеты будут быстрее.

160

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

Чтобы посчитать те величины, которые считает QUIK - знать все цены - не требуется. Надо лишь знать общий объем и среднюю цену приобретения. Важно, это именно цена приобретения позиции, не цена безубыточности, т.к. при закрытии позиции она не пересчитывается.

Пример:
Пусть есть 3 сделки:
90 руб - 3 лота
105 руб - 2 лота
98 руб - 5 лотов

"Обычным образом" мы бы посчитали так:
(90*3 + 105*2 + 98*5) / (3+2+5) = 97 средняя цена приобретения (и это точно, без погрешностей).

Но QUIK считает итерационно после каждой сделки:
Изначально объем 0, цена приобретения 0
После первой сделки: (0 * 0 + 90 * 3) / (0 + 3) = 90 цена, 0 + 3 = 3 объем
После второй сделки: (90 * 3 + 105 * 2) / (3 + 2) = 96 цена, 3 + 2 = 5 объем
После третьей сделки: (96 * 5 + 98 * 5) / (5 + 5) = 97 цена, 5 + 5 = 10 объем

Обратите внимание, знание цен всех предыдущих сделок - не требуется. Достаточно знания общего объема и средней цены за этот объём.
И без погрешностей! Всё точно.

Если же вам нужен какой-то другой алгоритм - тогда надо как-то сбирать данные для него. Из QUIK вчерашних сделок не достать по определению. Он "знает" только 1 текущий день торгов.

161

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

Мне не нужно считать среднюю цену, я ее и так знаю. Именно мне нужен другой алгоритм. Мне нужно знать цену первой сделки(и вычислить ее по средней цене и итоговому объему просто невозможно). Понятно что можно в файл кинуть, но по мне это крайне не надёжно. Я знаю точно, что вручную вытащить из квика я это могу заказав отчёт у брокера по всем моим сделкам. А вот из скрипта могу ли я что то подобное провернуть?
Считать среднюю цену мне не нужно, она в квике есть и вытаскивается без проблем в любое время суток и хоть через год...

162

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

dark184 пишет:

А вот из скрипта могу ли я что то подобное провернуть?

заказать отчет брокера и обработать его?
Штатного API под это точно нет.

dark184 пишет:

Понятно что можно в файл кинуть, но по мне это крайне не надёжно.

Все программы хранят свои данные в файлах. И как-то массовых проблем с этим не наблюдается wink

163

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

Все программы хранят свои данные в файлах

Квик это не все программы... Понимаете в чем проблема... Как бы пояснить? Ну вот буквально только что. У меня есть мини компьютер, стоит на работе и торгует на бирже... Ну результаты работы пишет в файл, не принципиально что, просто пишет. Уезжал с работы, все норм, пусть будет инструмент Х еще днем купился, перед самым отъездом домой он упал и робот по заданному алгоритму усреднил позицию и выставил заявку на продажу... Само собой по заранее заданному алгоритму, но и не суть важно... Важно то, что спустя больше 6 часов я удаленно пытаюсь подключиться к компу... А он оказывается не але! То ли вырубился, то ли уснул! А вместе с ним и роботы. И ладно если бы тырнет пропал просто... И то далеко не факт что "ладно бы". Вобщем, если бы не подключился с домашнего компа до окончания торгов, то и понятия бы не имел что произошло, ибо вся история почистилась бы к следующей торговой сессии, и только запросив отчет брокера можно было бы выяснить что к чему. А по факту инструмент Х продался по лимитной заявке до закрытия вечерних торгов. А т.к. компьютер с роботами по неизвестной причине не в сети(может нет сети, может оборвалось соединение квика, может банально свет отрубили...) не зафиксировал продажу и соответственно не прописал в лог! Нет, пока торговая сессия не закончилась это не проблема, можно пофиксить по таблице сделок. А если сменилась? Таблица сделок пуста, по факту профит, а по логам охеренный минус... Вот вам и супер пупер запись в файл.

164

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

Ненадежный компьютер на ненадежном канале данных. Всё это без мониторинга и уведомлений о проблемах.
Казалось бы, при чем тут запись в файл?

В общем инфраструктура робота - штука очень многоплановая, это да. Должны быть учтены и продуманы форсмажоры и обязательно должен быть мониторинг.
"Вкалывают роботы" пока откладывается wink

165

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

"Вкалывают роботы" пока откладывается

Это точно smile

Ненадежный компьютер на ненадежном канале данных.

Дело то не в компьютере и не в канале.

продуманы форсмажоры

Вот над этим как раз и думаю smile Надежность компьютера и канала в принципе еще как то контролируются. А вот аварийное отключение света хоть и редки, но бывают. С этим увы, ничего не поделаешь. Да и компьютер с роутером даже посадишь на ИБП, он тоже не вечен. Уведомления тоже так себе если комп или сеть обрубились, даже если знаешь, что то сделать увы не сделаешь. Они хороши когда сеть и комп доступны остались, можно удаленно все исправить... А вот если робот взял позицию и выставил ее на продажу, после чего отрубили свет... И в этот период заявка на продажу исполнилась, да еще и торговый день сменился(а значит таблица сделок чиста как слеза младенца), роботу остается только зафиксировать факт продажи позиции, а вот ее параметры взять ему уже неоткуда ;( Вот именно над этой ситуацией и кубатурю сейчас. Если же таблица сделок еще не опустошилась, то дернуть оттуда нет никаких проблем. В принципе так сейчас и делаю.
Хорошо бы иметь доступ из скрипта ко всем сделкам за последние день два. Хотя... если подумать ошибки в логах не смертельны, главное чтобы все правильно работало. Единственное что приходит на ум пока, чтобы себя не ошарашить охрененным минусом, просто из лога или затирать такую покупку, или если робот видит последнюю запись как покупка, но позиция по факту уже продана просто дописывать продажу как профитную с заданными параметрами из настроек робота.

166

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

Решать аппаратные проблемы программным способом -занятие бессмысленное.

Решение вашим проблем, как бы это банально не звучало - профессиональный хостинг.

Если ваш робот что то приносит, то этой прибыли на оплату хостинга хватит. Если он приносит меньше, нет смысла тратить на него время.

167

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

Решать аппаратные проблемы программным способом -занятие бессмысленное.

Речь не о решении аппаратных проблем, а о более менее адекватном накоплении статистики.

Если ваш робот что то приносит

Без накопления статистики сказать что либо просто невозможно, у меня есть в портфеле и долгосрок, тот же газпром. На данный момент долгосроком я занимаюсь исключительно вручную, ибо усилий требует минимум. А вот интрадей и краткосрок я поручаю роботам, ибо требует пристального внимания. Изредка вмешиваюсь в работу роботов вручную... Алгоритмы моего робота еще очень и очень далеки от совершенства, да и достичь абсолютного совершенства не получится. Пока на прошлой неделе на бирже не свершился швах, они в среднем приносили мне от 1 до 5% в день, без учета налогов, комиссий(если верить отчету брокера, то все комиссии в сумме около 0.05% от каждой сделки, т.е. 0.1% от профита). Да, чаще 1-2%, но бывало и до 5%. После шваха, посчитать уже сложно, но по примерным прикидкам где то пока в нуле. Вот честно, ну просто лень мне тратить весь день на подсчет вручную по каждому инструменту и исключать из расчета долгосрок.
Всю эту рутину легко можно поручить роботу, но нет нормальной статистики, ибо робот постоянно переписывается, меняется формат данных, из за ошибок и непредвиденных мной ситуаций во время отладки, все это вносит свою погрешность.
Напоминаю, что робот почти полностью отлажен только в части работы с заявками. А вот алгоритмы стратегий до сих пор пишутся, отлаживаются, исправляются, снова отлаживаются, тестируются на демо счете и окончательно отлаживаются на реальных торгах. Так что говорить о профессиональных хостингах пока еще очень рано. Тем более мне в этом еще надо разбираться и я даже не представляю где и как в таком случае торговать и поддерживается ли вообще qlua...
А вот доступ ко всем моим сделкам за весь период торгов одним махом решил бы сразу кучу вопросов, в том числе с подсчетом прибыли/убытка.

168

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

Есть вопрос по квику, таблица состояние счета. Хотя впрочем это не важно, как я понял она вообще к делу не относится. Но в ней есть столбцы балансовая цена и балансовая стоимость. По сути это средняя цена всех набранных позиций... И вот буквально на днях увидел в ней полную чушь, некорректное отображение средней цены. Упустим момент если берем действительно несколько позиций по разной цене. Речь исключительно про один лот и в лоте одна акция. Допустим я взял позицию Лента ао, где точность 1 знак, шаг цены 0.5, по цене ровно 721. До сделки этой позиции не было вообще в портфеле. После того как сделка в 1 лот свершилась, в таблице СДЕЛОК я вижу цену 721, а вот в таблице состояния счета я вижу цену 721.43. Мало того, что отличается, так еще и не соответствует ни точности, ни шагу цены. Я бы понял если бы брал несколько лотов, которые по факту могли взяться по разным ценам, или в процессе бы добирал и продавал бы позиции. НО! Перед сделкой в портфеле не было этого инструмента и единственное событие, это покупка.
Откуда берутся эти цифры? Или же эта цена еще и комиссии за эти сделки учитывает?

169

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

Это ошибка эксплуатации квика на стороне брокера.
Напишите брокер о проблеме, пусть починит.

170

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

Удивительно. Когда озадачился этой проблемой, поднял все отчеты брокера на почте, оказалось что все комиссии по этой сделке как раз равны 0,43. Итого 721.43 средняя цена сделки в точности равна этой сумме smile Видимо разные брокеры по разному считают среднюю цену. Буквально в конце прошлой недели столкнулся с тем, что разные брокеры в квике могут возвращать из коллбэков разные данные! Например совершаю сделку (допустим 1 лот, а в лоте 10 позиций) из OnDepoLimit у одного брокера количество возвращается 1, у другого 10. Т.е. разные брокеры могут возвращать как лоты, так и общее количество позиций лот*размер лота. Вроде робот уже вкалывает в поте лица, а сюрпризы приходят до сих пор smile

171

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

Доброго времени суток. Возникла необходимость скриптом lua получить список кодов инструментов по определенному коду класса(возможно по списку классов, в моем случае это пока "TQBR"). Именно это делает getClassSecurities("TQBR"). НО! Она возвращает не таблицу, а просто строку кодов инструментов, разделенных запятыми. А это значит ее как то надо обработать и превратить как минимум в строковый массив. Нашел на просторах интернета красивое решение

    local v = 0
    tool = {}
    for i in string.gmatch(example, "(%w+)") do
        tool[v] = i
        message(tool[v])
        v = v + 1
    end

НО! Может быть все и заработало бы как надо, но ровно до тех пор пока не наткнулся на код инструмента VEON-RX. Вот здесь то собака и зарылась, вместо одного кода VEON-RX возвращается два кода VEON и RX. Что в принципе и понятно, тире не является ни буквой ни цифрой. Понадеялся что здесь в луа тире не считается знаком пунктуации и заменил %w на %P. А оно в луа тоже оказалось считается знаком пунктуации sad В общем ничего не изменилось. Принципиально этот код я могу просто отфильтровать, но никто не гарантирует  что в будущем не появится еще нечто подобное. Возможно ли решить эту проблему? В любом случае необходимо выделить код инструмента из строки со списком кодов с разделителем запятой.

172 (2023-04-01 18:23:13 отредактировано dark184)

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

Ох, как сложно найти нужную инфу по lua sad Ну по крайней мере мне smile Проблема вроде решилась.

    local example = getClassSecurities("TQBR")
    local v = 0
    tool = {}
    for i in string.gmatch(example, "[^,]+") do
        tool[v] = i
        message(tool[v])
        v = v + 1
    end

Теперь проблемный код VEON-RX возвращается правильно.

173

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

dark184 пишет:

Ох, как сложно найти нужную инфу по lua

Так-то меньше часа прошло, как вы нашли решение smile Ну судя по времени сообщений.

Ну и информация здесь не про Lua, конечно, а про регулярные выражения.

Здорово что всё получилось!

174 (2023-04-07 11:04:15 отредактировано dark184)

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

В принципе час и искал smile НО! Речь конечно про регулярные выражения, но в приложении к языку луа(qlua). Ну и само собой я искал "регулярные выражения" и нифига толком нет. Но позже почитав, оказывается по той информации, что я получил, в луа то их нет, а есть шаблоны... В принципе теже яйца, только в профиль. Причем нашел исключительно на англоязычных ресурсах...
Вобщем даже терминологию вывернули на изнанку ;( Мало проблем с типами данных, которые здесь как таковые отсутствуют, еще и с привычной терминологией проблемы... ;(

175

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

Всем привет. Снова есть вопрос. Сейчас веду логи в обычном текстовом формате, что не очень удобно для чтения, но удобно для записи. В свете последних событий с шаблонами задумываюсь переформатироваться в .csv файл. Для записи не очень удобен, зато чтение парой строк кода. НО! Опять же не очень удобен для визуального восприятия, невозможно задать даже ширину ячейки в таблице, нельзя сохранять формулы и форматирование... Вобщем ничего нельзя. И фиг бы с ним со всем остальным, хотя бы ширину столбцов сохранить... И то нельзя.
Может подскажете более удобный формат, легко писать в файл, наличие внешних программ для визуализации...