Как получить значение Лимита открытых позиций по фьючерсам или как получить элемент из таблицы?
Пользователь
Сообщений: Регистрация: 27.01.2017
18.02.2022 19:29:04
Зачем Вы сравниваете с true. Это булевый тип. А таблица - это table.
getFuturesLimit(p_firmid, p_account, 0, "SUR") возвращает таблицу. В ней есть поле cbplimit типа number.
Как получить значение Лимита открытых позиций по фьючерсам или как получить элемент из таблицы?
Пользователь
Сообщений: Регистрация: 27.01.2017
18.02.2022 18:48:34
Только сейчас обратил внимание.
Формат вызова функции такой getFuturesLimit(STRING firmid, STRING trdaccid, NUMBER limit_type, STRING currcode)
первым идет код фирмы, а не код класса. Это же лимиты всей срочной секции, а не одного класса. А фирма firmid = SPBFUT000000
Как сверить количество лотов в Квике и в моем роботе .
Пользователь
Сообщений: Регистрация: 27.01.2017
18.02.2022 09:47:01
Что-то не очень понятна проблема. Есть методы получения баланса по бумагам, контрактам. Причем для разных типов расчетов. Все что они делают - это передают выдают данные, которые транслирует брокер. Сам терминал ничего не знает про ваши активы. Чем они не угодили?
Правда, в большинстве случаев, скрипт ведет свою позицию, и общая позиция на балансе ему не интересна и даже вредна. Ведь разные скрипты и человек могут вести торговлю одновременно. Один в лонг, другой в шорт - баланс 0, а позиции есть.
Как получить значение Лимита открытых позиций по фьючерсам или как получить элемент из таблицы?
Пользователь
Сообщений: Регистрация: 27.01.2017
17.02.2022 21:31:49
Нет. значение же не true, зачем с ним сравнивать. Зада же посмотреть, что в таблице. 4 - цикла, значит там 4 - записи
Лучше выводить не в сообщения, а в лог файл. Но раз через сообщения, то можно так:
Код
local t
for i=0,getNumberOf ("futures_client_limits")-1 do
t = {}
for k, v in pairs(getItem("futures_client_limits",i)) do
t[#t+1] = tostring(k)..' = '..tostring(v)
end
message('i: '..tostring(i+1)..' : '..table.concat(t, '; '))
end
Как получить значение Лимита открытых позиций по фьючерсам или как получить элемент из таблицы?
Пользователь
Сообщений: Регистрация: 27.01.2017
17.02.2022 20:44:51
Пройдитесь циклом по таблице futures_client_limits и посмотрите, что там. Чаще всего на этом этапе и находится проблема.
Как получить кол-во принтов по инструменту
Пользователь
Сообщений: Регистрация: 27.01.2017
10.02.2022 20:46:05
Если речь про параметр "Количество сделок за сегодня", то это данные из таблицы Текущих торгов. Имя параметра NUMTRADES.
Как вывести данные своей таблицы по DDE?, Как вывести данные своей таблицы по DDE?
Пользователь
Сообщений: Регистрация: 27.01.2017
04.02.2022 11:34:32
Все зависит от задачи.
Если это действительно принятие решения в реальном времени, то тогда и блок анализа должен работать с потоком данным (с заданным периодом квантования времени). Т.е. лучше всего в самом скрипте и организовать. А если снаружи, то это либо база данных куда будет записываться слепок данных в каждый квант времени (т.е. много данных), либо необходимо успевать анализировать каждый пакет данных и тогда можно сделать на socket или другим способом межпроцессорного взаимодействия.
Для накопления уже проще. Все записывать с заданной периодичностью, с отметкой точки времени, чтобы данные не смешивались. А уже куда записывать - менее важно, хоть и существенно.
Агрегировать объемы по ценам
Пользователь
Сообщений: Регистрация: 27.01.2017
03.02.2022 09:33:47
Да, но округление не нужно в данной операции.
Агрегировать объемы по ценам
Пользователь
Сообщений: Регистрация: 27.01.2017
02.02.2022 21:14:47
Можно так, а можно просто math.modf
Только в скобках, т.к. функция возвращает два значения - целую часть и дробную часть
int_x = (math.modf(a/b))
Агрегировать объемы по ценам
Пользователь
Сообщений: Регистрация: 27.01.2017
02.02.2022 13:40:37
Вот для примера простой скрипт
Агрегировать объемы по ценам
Пользователь
Сообщений: Регистрация: 27.01.2017
02.02.2022 09:42:34
Изначально разбивать не надо. Это же арифметическая операция (правда можно кеширование сделать, если память есть).
цена 127 - это целое(127/10)*10 = 120 цена 127 стала 120, т.е. период квантования = 10. Значит все числа из диапазона 120-129 становятся 120. А значит и их объем будет для числа 120.
А как получить объемы по ценам 123 или 134? Если у Вас задача суммировать обемы сделок по каждой цене, то тогда это более простая задача - просто суммировать объемы с одной и той же ценой.
t ] {} ....
t[123] = (t[123] or 0) + deal.qty
t[134] = (t[134] or 0) + deal.qty
И получите таблицу со всеми объемами, где ключ - это цена, а значение - это объем.
Что касается нефти, то я, обычно, такие числа привожу к целому, умножая на 10 в степени разрядности дробной части. А потом уже провожу манипуляции.
Агрегировать объемы по ценам
Пользователь
Сообщений: Регистрация: 27.01.2017
01.02.2022 19:19:35
Просто кластиеризуйте ценовой диапазон.
Для примера кластер в 10 рублей.
цена 127 - это целое(127/10)*10 = 120 цена 144 - это 140 цена 142 - это 140
и т.д. Тогда сумма объемов на одинаковых кластерах и даст нужный результат.
По сути - это та же задача, когда необходимо привести цену ордера к шагу цены инструмента.
Медленный вывод в таблицы QLua через SetCell
Пользователь
Сообщений: Регистрация: 27.01.2017
31.01.2022 16:35:08
Загрузка в 12% - это не значит, что одно ядро все занимает. Чтобы однозначно сказать, необходимо открыть монитор ресурсов и посмотреть подробную картину для каждого ядра.
Работа с метками, ошибки при закрытии/открытии программы Quik., Свои уровни на графике из файла.
Пользователь
Сообщений: Регистрация: 27.01.2017
27.01.2022 11:05:07
При любой установке соединения с сервером необходимо "ждать" момента когда соединение есть и пропущенные данные получены. Отследить установку соединения - не проблема. А вот подгрузку данных - уже приходится контролировать некие параметры. Для примера разность времени сервера и времени последнего полученного пакета. Пока пакеты не "догонят время", стоит подождать.
Правда по наблюдениям за процедурой старта терминала видно, что сначала отрисовываются окна, потом устанавливается соединение. Поэтому если скрипт просто подождет установки соединения, то графики, скорее всего, уже есть.
Отловить свою лимитную заявку, после "исполнения" Take profit
Пользователь
Сообщений: Регистрация: 27.01.2017
24.01.2022 13:00:13
Статус стоп-заявки - это всего лишь индикатор того в каком состоянии заявка на сервере брокера. Исполнилась - значит исполнилось условие. Далее идет подача команды на установку лимитного ордера по указанным параметрам. Если команда не пройдет шлюз, то можно проверить это через бит 10 и 11 флагов стоп-заявки. Если же лимитный ордер был установлен, то у стоп-ордера будет заполнено поле linkedorder Номер заявки в торговои? системе, зарегистрированнои? по наступлению условия стоп-цены. По нему и можно найти лимитный ордер в таблице orders и проверить уже его статус, предпринять какие-то действия.
Повторная подписка на свечи через CreateDataSource не работает на версии 9.2.3.15
Пользователь
Сообщений: Регистрация: 27.01.2017
22.01.2022 09:39:34
Вопрос целесообразности подписки на колбек. Если - это необходимо для получения цены сделки внутри бара, то это не лучшая идея, т.к. этот колбек медленный и будут пропуски.А если это для того, чтобы узнать, что пришел новый бар, то не проще ли запомнить прошлый Size и сравнить с новым. Когда придет тогда и делать что-то. А так колбек будет дергаться много раз, ради одного события.
Объясните, пожалуйста, один момент в коде.
Пользователь
Сообщений: Регистрация: 27.01.2017
16.01.2022 15:46:45
Состояние заявки можно получить в колбеке OnOrder или найти в таблице ордеров запись по номеру ордера order_num (индекс записи можно запомнить).
Из таблицы сделок можно (а значит и из колбека OnTrade), конечно, но это на каждую сделку придется переходить в таблицу ордеров. Если ордер большой, то это уже может быть накладно. Колбек OnOrder прямо вернет запись таблицы ордеров.
Владимир, заявки могут быть не на закрытие всей позиции.
Как получить значение параметра "дата торгов" из таблицы сделок?
Пользователь
Сообщений: Регистрация: 27.01.2017
15.01.2022 13:04:19
Не очень понятно зачем именно дата торгов, если есть дата время самой сделки datetime.
Трейлинг- стоп. Как протестировать на quik?
Пользователь
Сообщений: Регистрация: 27.01.2017
15.01.2022 13:00:51
Цитата
Egor Denisov написал: Здравствуйте. Хочу у себя реализовать lua скрипт реализующий функцию трейлинг-стопа с защитным временем. Вопрос в следующем: как правильно поступить, чтобы получить ситуацию, когда цена инструмента делает прокол на несколько процентов и возвращается обратно в течение 1-2 секунд. На игровых серверах таких ситуаций может и не быть совсем. Как моделировать и тестировать такие ситуации?
На демо серверах такое как раз чаще встречается.
Что же касается вопроса, то не очень понятно, что необходимо сделать. Не подтягивать стоп если это прокол? Если так, что самое простое - это организовать таймер ожидания функции проверки изменения цены с прошлого опроса. Тогда у Вас проверка будет более большими квантами времени. Если непрерывно, то, условно, это будет раз в 100 млс. А так - раз в установленное время секунд, скажем раз в 1 сек.
Правда здесь есть вероятность того, что именно во время проверки это аномальное изменение и случится. Для этого можно организовать счетчик. Т.е. если такое случается больше чем 1 раз проверок, то это подтвержденное изменение. Для примера: Проверяем 1 - нет изменений. Счетчик 0. Проверяем 2 - есть изменение. Счетчик 1. Проверяем 3 - уже нет изменения. Счетчик сбрасывается в 0.
В результате изменение пропущено как ложное. Вот если в течении двух отсчетов изменение сохранится, то есть.
Он не поддерживает кодировку Win1251. Квик же в 2022 только ее понимает... Правда для ZeroBrane можно скрипт на том же lua для перекодировки при открытия файла настроить. Но это не лучший вариант. Часто файлы потом не открываются вообще.
Редактор для LUA
Пользователь
Сообщений: Регистрация: 27.01.2017
13.01.2022 09:36:52
Цитата
Лучше используй Notepad
Очень спорное утверждение. Почему не Vim или Emacs? Notepad++?, если речь про него, хорош если быстренько открыть водном файле, посмотреть, закрыть.
Редактор для LUA
Пользователь
Сообщений: Регистрация: 27.01.2017
13.01.2022 09:34:13
Цитата
Вася написал: А как сделать, чтобы в visual stidio code кириллица нормально отображалась? А то у меня ромбики вместо букв.
Установить в настройках кодировку по умолчанию win1251. Можно только для рабочей зоны, можно доля всех файлов lua. По желанию.
Спасибо большое, я и не сомневался что для тех кто пишет на LUA в quik это будет очевидно. МОжет еще подскажете, как сделать чтобы он срабатывал переодически по времени?
По всей видимости, это был сарказм. Окружение терминала в рамках qlua не предоставляет методов по доступу к окну доступных скриптов lua.
Вариантов два: -- Разобраться с утечкой памяти. Это будет единственно правильным решением.\ -- Написать некий proxy-метод в библиотеке, который будет приводить к перезапуску основной логики. И дергать его по таймеру уже из скрипта lua или прямо организовать цикличность в запуска в самой библиотеке.
Правда есть еще вариант: написать скрипт, использующий w32.dll. Найти окно доступных скриптов, виртуально нажать кнопки остановки и запуска. Для примера, как это сделано в автологинах.
как мне скомпилировать или достать luasql
Пользователь
Сообщений: Регистрация: 27.01.2017
08.01.2022 13:10:21
Если я правильно помню luasql от под win32. Возьмите сборку под x64, хотя бы от swerg Либо сами внесите изменения.
И соберите через make или прямо в VC.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 27.01.2017
05.01.2022 16:13:46
Это не мой тест. Я просто запустил вышеприведенный чужой код на чистом луа. И вижу, что я также ничего не вижу.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте
Пользователь
Сообщений: Регистрация: 27.01.2017
05.01.2022 11:53:20
Странный спор.
Берем тот же скрипт, приводим к универсальному виду:
Код
_G.message = _G.message or _G.print
_G.message('begin: '..tostring(os.clock()))
local t = {}
for i = 1,150000 do
t = os.time()
end
_G.message('end: '..tostring(os.clock())..', memory: '..tostring(collectgarbage("count")))
Да, разница с чистым lua есть, но не сказал бы, что это как-то мешает. Тем более, что накладные расходы при запуске скрипта в окружении терминала есть.
Что касается хранения таблиц, то, как правило, необходимы последние для расчета чего-то в скользящем окне. Остальное то зачем держать - вычистить, сборщик уберет со временем.
Работает ли Lua с ИТП (Иностранной Торговой Площадкой)?
Пользователь
Сообщений: Регистрация: 27.01.2017
04.01.2022 11:23:57
Если данные транслируются в ТТТ, то и getParamEx вернет их. Укажите корректный код класса и код инструмента. Можете увидеть их в информационном окне: правая клавиша в строке ТТТ - информация об инструменте.
string.dump не верно работает
Пользователь
Сообщений: Регистрация: 27.01.2017
04.01.2022 09:08:36
Ну так
Код
local f = assert(load([[print('hello')print('world')]]))
string.dump не верно работает
Пользователь
Сообщений: Регистрация: 27.01.2017
03.01.2022 11:51:03
Как уже правильно сказали выше, файл должен быть в бинарном представлении открыт.
Вот отрывок из книги создателя языка:
Lua принимает предкомпилированный код практически везде, где он допускает исходный код. В частности, loadfile и load принимают предкомпилированный код.
Мы можем написать упрощенную версию luac непосредственно на Lua:
Код
p = loadfile(arg[1])
f = io.open(arg[2], "wb")
f:write(string.dump(p))
f:close()
Основная функция здесь — это string.dump: она получает функцию Lua и возвращает ее предкомпилированный код как строку, правильно оформленную для ее обратной загрузки в Lua.
Т.к. в Квике теперь две версии lua, то необходимо запускать все в одной версии.
Редактор для LUA
Пользователь
Сообщений: Регистрация: 27.01.2017
02.01.2022 14:36:18
visual stidio code + plugins:
ну и для git
Или IntelliJ IDEA + EmmyLua
Дело вкуса. Но idea тормоз, особенно при глобальном поиске.
Таблица сделок, номер заявки превращается в число e+
Пользователь
Сообщений: Регистрация: 27.01.2017
02.01.2022 09:40:55
Если версия Квика 7, то там lua 5.1. А вот с ним уже не все так очевидно. Он, действительно, может не переварить номер из 19 символов. Поэтому, собственно, и был переход на lua 5.3. Поэтому обновляйте версию.
Таблица сделок, номер заявки превращается в число e+
Пользователь
Сообщений: Регистрация: 27.01.2017
29.12.2021 18:05:11
Если тип number и предположительно целое, то достаточно такой конструкции
Код
if type(x) == "number" and (math.floor(x) == x) then
return _VERSION == "Lua 5.1" and string.format("%0.16g", x) or tostring(math.tointeger(x) or x)
end
Что же касается получения данных из таблиц Квика, то вызов getItem необходимо свести к минимуму. Один вызов на индекс и запомнить в переменной. Иначе большой расход памяти.
Изменение настроек (Settings) внутри кода индикатора, В окне свойств пользовательских настроек не отображается новое значение
Пользователь
Сообщений: Регистрация: 27.01.2017
26.12.2021 09:43:13
А зачем изменять два раза параметр? Одного раза достаточно. Что касается видеть - то нет. Это либо ошибка, либо разработчики не предполагают изменение вне настроек. Правда если Вы хотите изменять и в коде и в поле настроек, то это уже другая задача: необходимо как-то "сказать коду", что поле изменено в форме и не изменяй его.
Впрочем, Вы можете решить данную задачу используя две (три) переменные.
Одна - в структуре Settings. Вторая - прошлое используемое значение (чтобы понимать, что в форме его изменили). Ну и третья - рабочая, значение которой берется из прошлых двух.
Изменение настроек (Settings) внутри кода индикатора, В окне свойств пользовательских настроек не отображается новое значение
Пользователь
Сообщений: Регистрация: 27.01.2017
25.12.2021 09:17:38
Если это чисто внутренние данные, то может тогда и не хранить их в Settings. А если необходимо именно в них, то можно перед выходом из функции Init установить необходимое значение и оно будет использоваться в расчетах.
Правда возникнет неоднозначная ситуация - в окне ввода параметров будет отображаться то, что ввел пользователь, а расчет будет вестись от переопределенного значения. Но это уже вопрос к разработчикам - Settings явно кешируется и выдается в форме ввода из кеша, не учитывая, что параметры изменены в коде.
Не понятная ошибка помогите, луа самп тут, (exception) and (error)
Пользователь
Сообщений: Регистрация: 27.01.2017
20.12.2021 18:37:09
Возможно, но чтобы понять проблему необходимо видеть код функции inicfg.load.
Хотя, как правило, если нет уверенности, что данные корректны, то стоит проверять значения прежде чем их использовать. Как минимум убедиться что type(updateIni) == 'table'. Но это не решит проблемы загрузки(записи по указанному пути) файла через сеть.
Не понятная ошибка помогите, луа самп тут, (exception) and (error)
Пользователь
Сообщений: Регистрация: 27.01.2017
20.12.2021 15:09:58
Видимо, все же стоит обратиться на форум для того продукта, где этот скрипт используется. Поиск дает ответ, что это какая-то игра GTA. Это форум посвящен совсем другому продукту.
Как создать экземпляры класса в цикле?
Пользователь
Сообщений: Регистрация: 27.01.2017
18.12.2021 21:38:09
Ну так это и есть хеш таблица - интерфейс
Как создать экземпляры класса в цикле?
Пользователь
Сообщений: Регистрация: 27.01.2017
18.12.2021 15:24:44
Таблицы lua - это хэш таблицы. Точнее весь lua - это операции над таблицами. Поэтому банально t[1] = что-то t[2] = что-то ....
Или
t['что-то'] = вот-это t['еще'] = другое
Можно даже в качестве индекса другую таблицу указать
tbl = {} t[tbl] = 'что-то'
Так что как сохранить - это больше вопрос как лучше сохранить в данном случае.
Ошибка запуска скомпилированного файла
Пользователь
Сообщений: Регистрация: 27.01.2017
18.12.2021 09:16:15
Цитата
nikolz написал: Ну да, типа скрыть тот ужас, который нагородили в роботе, который сливает депозит, но за деньги заказчика. Чтобы не было мучительно стыдно за такой развод. Тогда обязательно.
В принципе да. Но покупать алгоритм - то еще занятие. Тем более, что они все давно исследованы вдоль и поперёк. Для примера, если кто не видел -
Как создать экземпляры класса в цикле?
Пользователь
Сообщений: Регистрация: 27.01.2017
18.12.2021 09:12:25
Не в даваясь в подробности, зачем и где хранить, то - как обычно, через метод конструктор. Он же у Вас объявлен.
Ошибка запуска скомпилированного файла
Пользователь
Сообщений: Регистрация: 27.01.2017
17.12.2021 21:56:41
Если себе, то смысла никакого. Если на заказ, то уже имеет смысл.
Как все таки сделать http запрос из Lua?
Пользователь
Сообщений: Регистрация: 27.01.2017
17.12.2021 18:21:32
В папке mime находится dll. За поиск динамических библиотек отвечает путь package.cpath
Его тоже необходимо указать.
Чтобы искать во вложенных папках можно использовать такую маску
для package.path: path .."\\?.lua;"..path.."\\?\\?.lua;"
для package.cpath: path .."\\?.dll;"..path.."\\?\\?.dll;"
Как все таки сделать http запрос из Lua?
Пользователь
Сообщений: Регистрация: 27.01.2017
17.12.2021 17:05:35
Чтобы скрипт нашел библиотеку в каталогах отличных от предопределенных, необходимо дополнить путь искателя
Проверьте, что запускаете в корректной версии. В последних версиях Квика две версии lua 5.3.5 и 5.4.1. Если не выбираете в версию при запуске, то выбирается по умолчанию из настроек.
Как все таки сделать http запрос из Lua?
Пользователь
Сообщений: Регистрация: 27.01.2017
17.12.2021 16:20:29
Что значит зачем. Lua не имеет встроенной поддержки web soсket. Поэтому необходимы библиотеки (а не программы), чтобы сие действие стало доступно. Ссылки на сборки библиотек недавно обсуждались.
статус заявки: выставленной по стоп-лоссу, снята, а не активна
Пользователь
Сообщений: Регистрация: 27.01.2017
15.12.2021 18:22:47
Если речь про срочный рынок, то цену активации необходимо задавать конкретным значением. Например, рассчитать как сдвиг стоп-цены на 100-200 шагов цены, помня о зависимости ГО от цены. Но, как уже обсуждалось, не факт, что проскальзывание будет меньше. Поэтому контролировать связанный лимитный ордер необходимо.
Также ситуацию когда стоп ордер исполнен, а лимитный ордер не установлен, тоже необходимо контролировать. При этом учитывать, что просто может долго приходить ответ об его установке, а не кидаться и закрывать позицию самому. А то в итоге выйдет уже не закрытие позиции.
статус заявки: выставленной по стоп-лоссу, снята, а не активна
Пользователь
Сообщений: Регистрация: 27.01.2017
15.12.2021 18:02:24
Не на всех рынках есть понятие "По рынку". Если после активации ордера лимитный ордер не смог пройти контроль лимитов цен, достаточности средств, то он не будет зарегистрирован. Правда, статус стоп-ордера должен быть "исполнен" т.е. не активный и не снят. А вот биты 10 и 11 как раз могут говорить о причине проблемы.
Перестал работать SERVERTIME. не могу понять в чём проблема
Пользователь
Сообщений: Регистрация: 27.01.2017
11.12.2021 12:57:48
Проще можно, но когда сервер начнет возвращать данные не в ожидаемом формате, то придется уже разбирать формат.
Если же для себя пишешь, то конечно, можно упрощать. Правда надо помнить, что 9 утра сегодня - это больше чем 22:00 вчера. Если же просто время сравнивать, то будет ошибка.
Вопрос по написанию скрипта
Пользователь
Сообщений: Регистрация: 27.01.2017
08.12.2021 09:09:03
Пишите скрипт с интерфейсом. Он будет показывать сигналы (для примера ). Пишите скрипт, отправляющий сигналы на почту, телеграм.
[BUG] Повышенная загрузка CPU при большом количестве функций в скрипте