[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
24.10.2021 14:53:34
Раз уж эта тема стала такой абстрактной, могу сказать, что в российском сегменте общаться конструктивно сложно - практически всегда происходит переход на личности. Впрочем, это часто происходит и в реальности. Но на всяких интернет ресурсах - это просто данность. Лично мне это малопонятная данность. Поэтому проще общение строить только по конкретным вопросам, игнорируя остальное, что очень сильно мешает, либо еще проще - общаться не с русскоговорящими. Как-то в той среде разработчиков все спокойно и конструктивно происходит.
Также замечу, что вместо ответа на вопрос часто предлагают не ссылку на документацию, в чем я не вижу проблем вовсе, а высказывания - это тебе не надо, и далее уже переход в область, что ты ... такое спрашивать.
Просто взгляд со стороны, не более. Интернет у нас на кафедре подключили где-то в 94-95, так что было достаточно времени составить сравнительное наблюдение. Впрочем, это, конечно, мое сугубо личное мнение.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Для меня как раз наоборот. dofile живет в глобальном контексте, что неудобно. По сути это предкомпилированная блок кода. При этом вместо require можно использовать конструкцию типа:
Код
local lib = load(file_path)()
что, по сути, равносильно dofile, но имеет преимущества. Как минимум, можно получить код ошибки при загрузке модуля, если таковая есть. Например, переопределив dofile так
Код
function dofile (filename) local f = assert(loadfile(filename)) return f()end
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
24.10.2021 10:30:56
А почему бы Вам просто не перенести обсуждение в другое место. И вопросов не будет. Кто захочет, присоединится к общению.
Это относится и ко всем, кто хочет создать здесь тему для обсуждения. Напоминаю, что раздел форума "". Т.е. ожидаются вопросы по написанию кода, выявленных ошибках qlua. А найти специалиста - это не об этом. Итак в последнее время все больше стало абстрактного обсуждения, вместо конкретики.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
23.10.2021 13:18:09
Ну да, здесь никто не делится наработками на чистом LUA. Владимир, Вы бы для начала завели свой открытый репозитарий, скажем на GitHub, и показали хоть что-то. Не знаю как другие, но мне не составляет проблем выкладывать код. В нем ничего нет такого, что стоило бы скрывать. Где-то кривой, писалось давно. Но работает - и ладно. Да, текущие библиотеки, которые активно использую, не выкладываю, но основная причина - у меня не так много времени, чтобы отвечать на вопросы. Тысячи строк кода и десяток библиотек - одно описание всего этого займет уйму времени. Даже по тому достаточно простому коду, что выложен очень давно, часто спрашивают.
Если уже решили писать opensource проект для всех, показать всем как это надо делать, то как раз необходимо завести репозитарий, пригласить участников для разработки. Организовать где-то управление проектом, можно в том же GitHub через ZenHub или любом средстве совместной разработки.
Иначе все это пшик.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
23.10.2021 11:44:03
Дело не в критике, а в целеполагании.
Если задача написать для себя решение, то, пожалуйста, делайте. Никто не мешает.
Но когда Вы говорите, что уже хотите написать эдакий универсальный идеально рабочий скрипт, то это уже вызывает вопросы. Как минимум, что это значит и какие задачи он будет решать. А то может оказаться, что у Вас тоже точка зрения как у Владимира - мне не надо, то и другим не надо.
В конечном итоге это все равно будет решение для Вас, потому что оно будет решать что Вам необходимо.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
23.10.2021 09:16:55
Кажется, что Владимир думает за себя. раз я это ни разу не использовал, то и другим не надо. А сколько могут просить реализовать: опционы и все что с ними связно, календарные спреды, роллирование контрактов, корзина продуктов как единая позиция и балансировка, многоступенчатые входы, профиты и т.д. и т.д.
Что же касается каркаса, то это не так и сложно сделать. По сути это, наверняка, есть у каждого, кто этим занимается. Естественно модульная структура. В каркас включается "изкоуровневые" методы, типа: контроль соединения, получение заказ данных их контроль, инициализация данных по инструменту, подача транзакций, отслеживание состояния ордеров, позиции по инструментам и т.д. Т.е. то, что позволит работать с объектами, а не с сырыми методами. Также интерфейс, чтобы он строился автоматически по переданным настройкам.
Но, как правильно написали выше, это все написано под себя, под свои предпочтения. Если вы хотите работать с колбеками, то начать вам надо не с ТЗ, а с понимания как они работаю и построения временной диаграммы событий. Чтобы потом не было удивления, то колбек OnOrder может прийти раньше, чем OnTransaction.
Далее надо понять, что работа ведется в клиент-серверном окружении и все что с эти связано. Иначе будут вопросы: "почему-это ордер не появляется 10 минут. Я жму купить, а его нет. 10 раз уже нажал. А потом этот ваш ... терминал купил мне аж 1000 контрактов. Я же давал команду всего на 10."
А опционы и связанная с ними математика. Скальперы и их нюансы работы. И т.д.
Т.е. напишите вы proxy, позволяющий реализовать работу с терминалом на более высоком уровне, что, конечно, хорошо. Но это не будет конечный результат ни в коем разе.
Запись в один файл из разных скриптов.
Пользователь
Сообщений: Регистрация: 27.01.2017
23.10.2021 08:54:52
Чтобы обмениваться данными между скриптами есть достаточно средств, помимо файлов есть и решения через память:
раз: два:
И это не считая методик через socket.
Категорично говорить, что это не надо не стоит. Простой пример - передать данные из скрипта в индикатор.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
22.10.2021 10:16:01
Поиск по ключевым словам Quantitative Analysis поможет.
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
22.10.2021 09:58:44
Владимир, я надеюсь Вы понимаете, что мир живет не только так как Вам кажется.
Как только вычислительные мощности позволили обрабатывать большие объемы, так и стали хранить. Чем больше данных, тем лучше. И до этого хранили, но обрабатывать в реальном времени не могли.
Вы бы хоть ознакомились с определением
Только не надо в очередной раз говорить, что это никому не надо, т.к. у Вас все прекрасно работает. И минутки на нашем рынке - это вообще "ни о чем".
[ Закрыто] Ищу спеца по ЛуаКвик, для долгосрочного сотрудничества по созданию робота и его доработкам или для консультаций и наставничества.
Пользователь
Сообщений: Регистрация: 27.01.2017
22.10.2021 09:08:13
Владимир, как обычно, категоричен. Задачи количественного анализа требуют набора статистических данных - это большой объем. Если все сделки за два года по основным бумагам нашего не очень ликвидного рынка занимают десятки гб., то это же на другой площадке будет уже совсем другой объем.
Такой объем хранить в файлах... Это же не просто данные, а источник их анализа, аггрегации. Такое из текста не сделаешь. Поэтому хранят данные в базах данных. По привычке в реляционных базах, но уже чаще в NO-SQL, типа MongoDB и др. Не думаю, что здесь требуется это, но все же.
Из lua доступ возможен. С помощью драйвера LuaSQL, например через ODBC. Версия для lua 5.1 x86 работала стабильно. А вот для lua 5.3 x64 уже не так все радужно - в Квике падает скрипт. Для lua 5.4 еще не пробовал собирать. В принципе это можно обойти через socket, используя какой-нибудь MQ и драйвер записи в базу на другом языке.
Вопрос целесообразности. Если задача хранить небольшие данные, то, конечно, можно и в файлах хранить.
Что нужно сделать перед запуском функции CreateDataSource?
Пользователь
Сообщений: Регистрация: 27.01.2017
14.10.2021 15:28:30
Т.к. Вы не озвучили настройки получения потока данных вашего рабочего места, то для начала прочтите раздел "Особенности получения значений Таблицы текущих торгов" в справке к терминалу (файл qlua.chm). А то может потока данных нет вовсе.
EMA, Расчет средней скользящей
Пользователь
Сообщений: Регистрация: 27.01.2017
13.10.2021 20:40:37
Возьмите уж лучше примеры, поставляемые Arqa. Там хоть более корректно все написано, с замыканиями.
Подскажите как сделать Таймер на пользовательскую функцию?
Пользователь
Сообщений: Регистрация: 27.01.2017
06.10.2021 15:35:32
Совсем недавно было
Индикатор Lua
Пользователь
Сообщений: Регистрация: 27.01.2017
06.10.2021 11:56:06
Цитата
Евгений написал: Подскажите пожалуйста в индикаторе можно получить значение другого индикатора ? вот по этой функции как то не получается getCandlesByIndex
Да, можно. (Правда, если не сломали в 9.* версиях)
Вот, для примера:
Quik - чтение почты
Пользователь
Сообщений: Регистрация: 27.01.2017
05.10.2021 09:06:02
даже на этом форуме есть поиск.
socket - это библиотека для lua. Она включает в себя как lua файлы, так и dll. Она должна быть собрана под нужную версию lua.
imap4 - это тоже библиотека. Поиск любой системе выведет на репозитарий проекта.
Версия 9.* isDarkTheme в индикаторах
Пользователь
Сообщений: Регистрация: 27.01.2017
04.10.2021 09:22:50
Проверено не раз. Версия Квика 9.2.1.4
Код простейший. Функция выполняется в теле индикатора, а не внутри функций.
Код
Settings = {}
Settings.Name = '*line test'
Settings.line =
{
{
Name = "line1",
Color = isDarkTheme() and RGB(255, 255, 255) or RGB(0, 0, 0),
Type = TYPE_LINE,
Width = 2
}
}
function Init()
return 1
end
function OnCalculate(index)
return 100
end
Версия 9.* isDarkTheme в индикаторах
Пользователь
Сообщений: Регистрация: 27.01.2017
02.10.2021 18:26:06
В описании доступных функций глобального контекста индикатора для версии терминала 9.* есть isDarkTheme. Однако, если присутствует ее вызов в теле индикатора, то он не показывается в списке выбора. Если же убрать вызов, то индикатор становится доступен для добавления на график.
В 8-ой версии работает корректно.
Иногда не срабатывает killorder (во время движений)
Пользователь
Сообщений: Регистрация: 27.01.2017
01.10.2021 15:49:18
Не проскочит быстрее первой транзакции, они же в очереди. Вот если получили ответ транзакции об ошибке, тогда можно повторно отправить. Случай что первая транзакция не прошла, но и ответ транзакции не пришел вовсе не рассматриваем (хотя...).
При открытии сделки это было бы открытие дублей позиции, когда все пройдут до биржи.Часто такое вижу: нажимают купить по рынку командой самого терминала. Ничего не происходит. Жмут еще раз. И т.д. Пока не откроется позиция по всем нажатиям. И это без всяких скриптов.
В этом плане терминал, конечно, малоинформативен для простого пользователя.
Иногда не срабатывает killorder (во время движений)
Пользователь
Сообщений: Регистрация: 27.01.2017
01.10.2021 13:22:34
При подаче команд в ядро биржи все встают в очередь. Часть клиентов работает на своих серверах "рядом", минуя брокера. Так если сервер брокера "подвис" или шлюз биржи нагружен, то пока дойдет очередь до вашей команды, ордер вполне мог успеть исполнится. Поэтому будет ответ - снять уже нельзя.
Бороться с этим - это быть быстрее других.
7 секунд - это даже не плохо.
Quik - чтение почты
Пользователь
Сообщений: Регистрация: 27.01.2017
01.10.2021 08:59:37
Да. socket найти под x64 lua 5.3 можно. А вот ssl - уже сложнее. Хотя, кажется, на форуме выкладывали собранные, рабочие варианты.
Фуyкция GetCell не работает
Пользователь
Сообщений: Регистрация: 27.01.2017
30.09.2021 09:24:20
В документации сказано: GetCell Функция возвращает таблицу, содержащую данные из ячейки в строке с ключом «key», кодом колонки «code» в таблице «t_id». Если входные параметры были заданы ошибочно, то возвращается «nil»
В таблице:
image – строковое представление значения в ячейке,
value – числовое значение ячейки.
Quik - чтение почты
Пользователь
Сообщений: Регистрация: 27.01.2017
30.09.2021 09:22:06
Нужны библиотеки IMAP4, socket. Также, скорее всего, необходима ssl, т.к. найти почту без оного уже сложно.
Как разделить число на разряды ?
Пользователь
Сообщений: Регистрация: 27.01.2017
29.09.2021 17:29:06
Код
---@param n number
local function money_value(n, sep)
n = tostring(n)
sep = sep or ' '
local left,num,right = string.match(n,'^([^%d]*%d)(%d*)(.-)$')
print(left,num,right)
if not left or not num or not right then return n end
return left..(num:reverse():gsub('(%d%d%d)','%1'..sep):reverse())..right
end
Подскажите пожалуйста кто знает
Пользователь
Сообщений: Регистрация: 27.01.2017
28.09.2021 09:38:01
'CLPRICE' = 'Котировка последнего клиринга' 'PREVPRICE' = 'Цена закрытия'
Quik - чтение почты
Пользователь
Сообщений: Регистрация: 27.01.2017
27.09.2021 09:31:42
Есть типовой пример.
Код
local version = getInfoParam("VERSION")
local bits = version:sub(1, 2) == '7.' and 'x86' or 'x64'
local gSPath = getScriptPath()
local libs_Path = getScriptPath()..'\\clibs_'..bits
package.cpath = libs_Path.."\\?.dll;"..libs_Path.."\\?\\?.dll;"..package.cpath
package.path = gSPath .."\\?.lua;"..gSPath .."\\?\\?.lua;"..gSPath .."\\?\\init.lua;"..package.path
local imap4 = require 'imap4'
local ssl = require("ssl")
local imapServer = 'imap.yandex.com'
local serverPort = 993
local login = 'login'
local password = 'pass'
-- If in doubt, see RFC 3501:
-- https://tools.ietf.org/html/rfc3501#section-6
-- Create new imap4 connection.
-- Port is optional and defaults to 143.
local connection = imap4(imapServer, serverPort, {protocol = 'tlsv1'})
-- If you are connecting to gmail, yahoo or any other server that needs a SSL
-- connection before accepting commands, uncomment this line:
--
-- connection:enabletls{protocol = 'sslv3'}
--
-- You can skip this step by creating the connection using
--
-- local connection = imap4('imap.gmail.com', 993, {protocol = 'sslv3'})
-- Print the servers capabilities.
print(table.concat(connection:capability(), ', '))
-- Make sure we can do what we came for.
assert(connection:isCapable('IMAP4rev1'))
-- Login. Warning: The credentials are sent in plaintext unless you
-- tunnel the connection over ssh, or use SSL (either via the method shown
-- above or calling connection:starttls(params) before logging in).
connection:login(login, password)
-- connection:lsub() lists all subscribed mailboxes.
for mb, info in pairs(connection:lsub()) do
-- connection:status(mailbox, items) queries status of a mailbox.
-- Note: The mailbox name may contain unescaped whitespace. You are
-- responsible to escape it properly - try ("%q"):format(mb).
local stat = connection:status(mb, {'MESSAGES', 'RECENT', 'UNSEEN'})
print(mb, stat.MESSAGES, stat.RECENT, stat.UNSEEN)
end
-- Sel ect INBOX with read only permissions.
local info = connection:examine('INBOX')
print(info.exist, info.recent)
-- List info on the 4 most recent mails.
-- See https://tools.ietf.org/html/rfc3501#section-6.4.5
for _,v in pairs(connection:fetch('(UID BODY.PEEK[HEADER.FIELDS (From Date Subject)])', (info.exist)..':*')) do
-- `v' contains the response as mixed (possibly nested) table.
-- Keys are stored in the list part. In this example:
--
-- v[1] = "UID", v[2] = BODY
--
-- `v[key]' holds the value of that part, e.g.
--
-- v.UID = 10
--
-- `v.BODY' is the only exception and returns a table of the format
--
-- {parts = part-table, value = response}
--
-- For example:
--
-- v.BODY = {
-- parts = {"HEADER.FIELDS", {"From", "Date", "Subject"}},
-- value = "Fr om: Foo <foo@bar.baz>\r\nDate:..."
-- }
print(v.id, v.UID, v.BODY.value)
local txt = connection:fetch('(BODY.PEEK[TEXT])', v.id)
if #txt > 0 then
print(txt[1].BODY.value)
end
end
-- close connection
connection:logout()
Динамическое количество линий индикатора
Пользователь
Сообщений: Регистрация: 27.01.2017
24.09.2021 20:16:43
Нет, линии не обязательны конечно. Просто старые значения не должны исчезнуть с графика, поэтому вывод линий, пусть даже и одной, должен учитывать это.
Динамическое количество линий индикатора
Пользователь
Сообщений: Регистрация: 27.01.2017
24.09.2021 17:40:36
Цитата
RayIntraday написал: Николай, а как можно сделать, что бы ' maxVol ' формировался в процессе, за некий промежуток времени и оставался неизменным, а не расчитывался по уже полученным данным. Я тут пытался поэксперементировать меняя период и отступ, с разными периодами и разными отступами, но результат получился так себе.
График в процессе торгов движется и данные постоянно меняются и пересчитываются, так что такое представление наверное не особо подходит для торговли и анализа. maxVol, это я так понимаю нечто вроде point of control? Было бы здорово, скажем чтобы maxVol, отрисовывался в течении часа, а потом так и оставался на графике. Может вы знаете как это реализовать в коде? Смотрел на гитхабе, у вас там много интересных вещей, но подобного нет.
Сделать можно. Но для этого необходимо сразу инициализировать столько линий, сколько будет отрисовано для всех интервалов.
Для первого часа 100, для второго еще 100 и т.д. Т.е. выделив 1000 линий можно будет отрисовать, скажем, 10 интервалов. Тогда каждый новый интервал инициировать расчет заново и выводить новый пакет линий.
Но даже на 100 линиях индикатор долго применяет настройки.
Другой вариант использовать не линии, а тип вывода бар (TYPET_BAR) или точки. Тогда можно использовать те же линии, т.к. они не будут соединяться между собой. Правда выглядит это уже не очень.
Подскажите пожалуйста кто знает
Пользователь
Сообщений: Регистрация: 27.01.2017
24.09.2021 10:56:09
Если речь про замыкание функции, то это делается, чтобы обеспечить сохранность данных между вызовами функции. Также это дает возможность создать несколько экземпляров расчета одного и того-же алгоритма. Допустим, Вам необходимо обеспечить несколько вариантов расчета CCI. Для этого пишется одна такая функция конструктор. Далее ее можно вызвать несколько раз с разными настройками и получить разные функции расчета.
Правда этот пример (и другие из архива) настройки передают при каждом вызове для расчета, хотя конструкция замыкания предполагает, что настройки и ds надо было передать при вызове конструктора CCI, т.к. настройки в процессе работы не меняются. Поэтому их нет необходимости каждый раз передавать как аргумент.
OnTransReply возвращает order_num = nil
Пользователь
Сообщений: Регистрация: 27.01.2017
22.09.2021 15:59:51
Ну так у стопа две цены - цена активации и цена отправки транзакции в ядро биржи. Стоп ордера живут на сервере брокера, на бирже только лимитки.
Если есть профит, то есть цена активации профита, есть защитный спред (то же проскальзывние) и есть отступ. Вот отступ - это как бы скользящий стоп. Когда профит активировался, то риск модуль брокера начинает следить за ценой, если она опустится на величину отступа, то отправляем на биржу ордер. Если же растет дальше, то ничего не делаем. В теории это дает получить больший профит.
OnTransReply возвращает order_num = nil
Пользователь
Сообщений: Регистрация: 27.01.2017
22.09.2021 15:43:19
Так это надо тогда сначала разобраться в логике работы стоп ордеров как таковых. Что такое стоп цена, что такое проскальзывание и зачем цена подачи исполняемой заявки должна быть другой и т.д.
OnTransReply возвращает order_num = nil
Пользователь
Сообщений: Регистрация: 27.01.2017
22.09.2021 15:24:19
В сети полно видео с объяснением значения полей при вводе стоп-профит заявок. При подаче транзакции - тот же смысл.
Расширить список функций обратного вызова
Пользователь
Сообщений: Регистрация: 27.01.2017
21.09.2021 11:11:57
Цитата
Старатель написал: Отдельный поток у вас уже есть - main. Зачем ещё один городить?
Дело в том, что вы так или иначе всё равно лезете в основной поток: GUI, хранилище данных.
Да, но зачем нагружать поток терминала, пусть себе в сторонке что-то делается. Тогда можно было бы и нагруженные модули писать. Сейчас же в основном потоке только данные заполнить в общей области видимости, никаких ожиданий и долгих вычислений.
Расширить список функций обратного вызова
Пользователь
Сообщений: Регистрация: 27.01.2017
21.09.2021 10:50:15
Ну если уж просить, почему бы не попросить еще один поток для своих колбеков. Т.е. реализовать методы регистрации своих функций обратного вызова и отдельный поток для них, чтобы не лезть в основной поток вовсе.
Подскажите как отправлять инфу из QUIK в телеграм?
Пользователь
Сообщений: Регистрация: 27.01.2017
21.09.2021 10:46:30
Цитата
Alex написал: Николай можно поподробнее про "замыкание" Спасибо
Если Вы не знакомы с замыканиями, то советую ознакомиться с теорией
Если простыми словами - то это функция объект с своей областью видимости. Что дает возможность создавать разные экземпляры функции с своими переменными.
Таймер на любую функцию можно сделать так (пример на чистом lua):
Код
local timer_processor = function(delay)
delay = delay or 0
local last_time = 0
return function(func, ...)
local cur_time = os.time()
if cur_time - last_time >= delay then
last_time = cur_time
return func(...)
end
return ...
end
end
local some_func = function(x)
x = x + 1
print(x)
return x
end
local timer = timer_processor(2)
local a = 1
while a < 5 do
a = timer(some_func, a)
end
Функция some_func вызывается постоянно, но исполняется только каждые 2 секунды - параметр delay. При этом можно создавать несколько таймеров на разные задержки, используя один и тот же конструктор.
Можно также просто сделать некую функцию, в Вашем случае читающую файл, внутри замыкания, а не передавать ее как аргумент.
Подскажите как отправлять инфу из QUIK в телеграм?
Пользователь
Сообщений: Регистрация: 27.01.2017
20.09.2021 17:27:48
В принципе да. Но проще всего это сделать через замыкание, тогда проще вызывать. Можно даже сделать таймер, чтобы не читать слишком часто.
изменить стоп-заявку
Пользователь
Сообщений: Регистрация: 27.01.2017
20.09.2021 14:18:06
Снять старую, поставить новую.
OnTransReply возвращает order_num = nil
Пользователь
Сообщений: Регистрация: 27.01.2017
20.09.2021 09:57:21
Колбеки хороши, но их не гарантированность - убивает идею.
У Вас доступны методы прямого перебора таблиц: перед подачей транзакции запоминаете число строк в таблице ордеров, после просто проверяете, что появились новые записи в таблице, проверяя каждую, что это необходимая. Правда если номер транзакции сначала не будет заполнен, то уже возникают сложности. Поэтому можно использовать второй вариант - функция SearchItems. Запоминаете номер транзакции и далее ищете в таблице, когда там появится запись.
Далее, что важно в таком сценарии, вы легко запоминаете индекс в таблице, а значит всегда можете обновить информацию по ордеру, без всякого колбека.
Подскажите как отправлять инфу из QUIK в телеграм?
Пользователь
Сообщений: Регистрация: 27.01.2017
20.09.2021 09:48:27
Цитата
А как сделать обмен в обратном направлении? Из Питона в Квик Квик -> Питон все просто. watсhdog python отслеживает изменение файла. В qlua нет функции отслеживания изменения файла. Спс
Ничего сложного. Открываете файл в режиме чтения и читаете его.
Все зависит от методики обмена, как Вы будете записывать информацию. Одна строка, несколько строк. Возможно надо написать свой итератор перебора строк.
Для примера, можно просто читать последнюю строку файла через:
Код
file:seek("end")
last_line = file:read('*l')
Если появится новая строка, то и при чтении она считается, т.к. директива *l - Reads the line from the current file position, and moves file position to next line.
Получать объемы сделок
Пользователь
Сообщений: Регистрация: 27.01.2017
17.09.2021 18:12:24
Выводите метку в виде текста.
Скажем |||||||||||||||||||||||||||||||| мелким шрифтом будет выглядеть как линия. Но вот длину придется подбирать опытным путем, т.к. у метки есть только одна координата - начало.
Подскажите как отправлять инфу из QUIK в телеграм?
Квик воспринимает только win1251, поэтому файл должен быть в этой кодировке. Либо используйте перекодировку в UTF.
Подскажите как отправлять инфу из QUIK в телеграм?
Пользователь
Сообщений: Регистрация: 27.01.2017
17.09.2021 10:27:53
либо socket - можно использовать библиотеку luasocket (собственно ссылка на qlua-rpc примерно про это)
либо named pipes - надо написать(найти) dll обмена на стороне lua
Подскажите как отправлять инфу из QUIK в телеграм?
Пользователь
Сообщений: Регистрация: 27.01.2017
16.09.2021 18:10:09
Чаще всего в таком режиме общения либо дописывают строки в файл.
Скрипт на lua открывает файл на запись, скрипт на Питоне на чтение. Скрипт на питоне помнит последний номер строки и считывает новую, если появилась.
Либо создавать новый файл обмена. После обработки скрипт на Питоне удалит его, давая тем самым ответ, что обработка закончена.
Подскажите как отправлять инфу из QUIK в телеграм?
Пользователь
Сообщений: Регистрация: 27.01.2017
16.09.2021 15:41:37
Цитата
Qlua я знаю. Не могу разобраться как отправить инфу из Quik на внешний скрипт на Питоне.
Все уже придумано до вас
Индикатор Lua
Пользователь
Сообщений: Регистрация: 27.01.2017
16.09.2021 08:52:51
Индикатор должен вернуть значения, не таблицу, число которых равно числу линий.
Поэтому с тем же успехом можете просто перечислить возвращаемые значения
return a, b, c, d ,e ,f и т.д.
Когда число линий действительно больше, то тогда уже лучше хранить значения в таблице, а возвращать через unpack(table).
Перевод робота с lua 5.1 на lua 5.3
Пользователь
Сообщений: Регистрация: 27.01.2017
13.09.2021 12:49:17
Много раз уже обсуждалось. Для примера lua 5.3 при использовании tostring к типу float добаляет ".0 в представление. tostring(5) ~ "5.0"
Если число 5 выглядит как целое, но его тип math.type может быть float. Поэтому tostring добавит в представление точку и ноль. Квик такое не принимает в качестве параметра транзакций, где предполагается целое.
Как получить значение из файла txt
Пользователь
Сообщений: Регистрация: 27.01.2017
10.09.2021 19:27:09
Если классическая задача разбиения строки с разделителем на отдельные элементы, то регулярные выражения помогут. В частности итератор string.gmatch или написать свой итератор. Или, если формат постоянный (число параметров постоянно), то string.match.
Для примера string.match для чтения трех числовых параметров, разделенных запятой:
Проще всего воспользоваться поиском с ключевыми словами "lua split string".
Отменить цикличность появления сообщения
Пользователь
Сообщений: Регистрация: 27.01.2017
03.09.2021 09:00:55
Сделайте замыкание функцию с встроенным таймером, выводящую сообщения. Сможете создавать разные экземпляры на разный интервал. Не будет лишних локальных, а тем более глобальных переменных.
sleep - это заморозить поток, чаще всего это не так и надо выполнять остальные действия.
Подскажите как отправлять инфу из QUIK в телеграм?
Пользователь
Сообщений: Регистрация: 27.01.2017
27.08.2021 18:45:55
Поиск по форуму дает ответ.
Вот одно из решений
Перемещение заявки 2 транзакциями
Пользователь
Сообщений: Регистрация: 27.01.2017
25.08.2021 15:36:14
Время ответа на транзакции - это не детерминированная величина. В ядро биржи уходят лимитные заявки. В ядре биржи всегда будут транзакции атомарны: снять, поставить. При существенной нагрузке на сервера биржи и брокера ответ на команды может приходить совсем не быстро. Мой наблюдаемый рекорд - 12 минут.
Также надо учитывать, что исполнение команд происходит в порядке очереди. Вы не можете гарантировать, что ваша транзакция по установке нового ордера после снятия, будет первой в вашей же очереди команд. Для примера, от Вас идет поток команд, одна из которых сдвинуть ордер. Ядро биржи может обработать команду (и не одну) между снятием-постановкой, если таковые есть. Гарантий достаточности средств, при постановке нового ордера после снятия, нет, т.к. они могли быть заблокированы другими ордерами.
Поэтому контроль перед подачей транзакции будет всегда.
История заявок
Пользователь
Сообщений: Регистрация: 27.01.2017
18.08.2021 11:43:25
Но для решения данной задачи карман - не самый удобный инструмент. Это надо руками выгружать заявки из таблиц заявок, при этом фильтруя исполненные. А в карман загружать из этого файла. При этом как-то очищая дубли, если заявка уже есть в кармане.