Буду признателен, если кто-то сможет поделиться кодом расчета подразумеваемой волатильности (по отдельному опциону или серии).
Проблемы с трансляцией данных о лимите свободных средств, Трансляция данных о свободных средствах в терминале, а также в таблицах Quik-Lua противоречива и в ряде случаев некорректна.
Пользователь
Сообщений: Регистрация: 04.09.2016
12.12.2023 15:19:21
Использую Quik версии 11.0.0.92 на нескольких счетах. На одном из счетов неверно транслируются данные о лимите свободных средств.
Неверные данные получаемые в поле таблицы lim_non_margin (функция getPortfolioInfoEx) при работе с LUA В самом терминале также неверно отображается лимит на количество лотов, которое можно приобрести на срочном рынке (поле "Max", ниже окошка ввода количества лотов). В терминале, в "Итогах" таблицы "Состояние счета", в поле "Свободно" объем денежных средств также отражается верно. Фактически можно выставить заявку на существенно больший объем чем отображается в поле "Max" - пропорционально объему денежных средств, которые видно, через поле "Свободно" в "Итогах". Разница между некорректным (заниженным) и истинным значением (поле "Свободно") - несколько порядков. Пробовал: обновление, смену сервера, перезаказ данных - безрезультатно. Проблему наблюдаю несколько недель.
В чем проблема? Вручную заявки выставлять еще можно, но робот без верных данных работать не может.
Странная проблема с лимитами - деньги и лимиты есть, но заявка отвергнута по причине их неватки., Наблюдаю сегодня на терминалах 8.5 - 8.6
Пользователь
Сообщений: Регистрация: 04.09.2016
03.07.2020 12:03:13
Робот пытается выставить заявки и по части из них на разных счетах приходит сообщение о неудачной попытке. "Ошибка создания заявки [GW][332]. Нехватка средств по лимитам клиентам" Срочный рынок, инструменты AFZ0, CHU0, MNU0 и др. При этом данные таблиц свидетельствуют что средств достаточно. Например, пытается выставить две заявки CHU0 по которым ГО составляет около 33 тысяч рублей. При этом в соответствии с данными таблицы "Состояние счета" свободных средств порядка 300 тыс. руб., а доступное количество заявок на покупку и продажу - 9 и т.п. С чем может быть связана проблема? Есть ли способ программно проверить достаточность лимитов непосредственно перед выставлением каждой заявки?
Что я делаю не так, ошибка... attempt to call a boolean value (global 'isConnected')
Пользователь
Сообщений: Регистрация: 04.09.2016
02.07.2020 14:34:04
Вот так ругается на строку кода в цикле расположенном в пределах main, где пытаюсь считать статус соединения... while is_run do sleep (50) if isConnected() == 1 then .. -- не могу понять, что тут написал не так, ругается на эту строку ... end
Принципы написания скриптов, Разделять или объединять?
Пользователь
Сообщений: Регистрация: 04.09.2016
02.07.2020 11:44:46
Интересно мнение форумчан - как предпочитаете писать скрипты - все в одном файле или в виде конструктора - с подгрузкой отдельных файлов: 1. Отдельных функций/процедур (выставление заявки, считывание определенных данных и т.п.) 2. Отдельных классов (стратегия, позиция и т.п.)
Можно ли программно получить данные OHLCV по нескольким дневным периодам, без использования графика?, У меня что-то не получилось, есть ли способ?
Пользователь
Сообщений: Регистрация: 04.09.2016
30.06.2020 18:45:00
Сабж.
Скрипт прекращает работу, а не должен, Скрипт прекращает работу по непонятной причине, как ее выявить?
Пользователь
Сообщений: Регистрация: 04.09.2016
27.05.2020 23:22:08
Давно использую скрипт, который работает без ограничения по времени (ночью комп не выключается, утром он обновляет настройки и продолжает работу - очень удобно). В теле main он "бегает" по циклу с определенной паузой. В последнее время он стал самостоятельно спонтанно выключаться по непонятной причине. При этом логи показывают что функция OnStop не запускается, также в окне "Доступные скрипты" нет указания на какую либо ошибку работы скрипта. Соответствующее окно сообщений пусто. Единственная обнаруженная закономерность - работа прекращается после успешного выполнения транзакции по удалению заявки... (это частое действие и в большинстве случаев оно завершается без проблем...) Как в такой ситуации определить причину неожиданной остановки скрипта?
Отправка транзакции в сегменте фондового рынка (акции) - брокеры Финам / Сбербанк, какой формат и где брать код клиента?
Пользователь
Сообщений: Регистрация: 04.09.2016
07.04.2020 18:26:59
На срочном рынке (фьючи) все работает, а вот отправку транзакции на фондовом рынке никак не могу настроить. Кому не жалко - покажите фрагмент кода (желательно, отправка с переносом на следующие сутки) и как должен выглядеть код-клиента. В поддержку финама не дозвониться, код для срочного рынка озвученный сбером никак не подходит... ((
} else -- Выставляем ордер без переноса через клиринги t = { ["CLASSCODE"] = CLASS_CODE , --заявки выставляются только на рынке theClass ["SECCODE"] = SEC_CODE, ["ACTION"] = "NEW_ORDER", ["ACCOUNT"] = accounForSection, --задано в начале функции по умолчанию ["CLIENT_CODE"] = accounForSection, --задано в начале функции по умолчанию !!! раньше было roboNameWithSufix ["COMMENT"] = roboName, --задано в начале функции по умолчанию ["TYPE"] = "L", -- лимитированные заявки ["OPERATION"] = dir, -- направление продажи ('B' или 'S') ["PRICE"] = tostring(CORRECT_PRICE), ["QUANTITY"] = tostring(NumberOfLots), ["Move order"] = "No" , ["EXECUTION_CONDITION"] = execCond, ["TRANS_ID"] = tostring(1234234) }
Мониторинг работы скриптов с помощью телефона, Технология удаленного контроля алгоритмической торговли
Пользователь
Сообщений: Регистрация: 04.09.2016
03.04.2020 05:51:50
Мониторинг работы скрипта - полагаю сверхактуальная задача для большинства поклонников алгоритмической торговли. Особо она важна в тех случаях, когда используются лимитные заявки. Упал скрипт, упал квик, упал комп, нет соединения... - все эти события могут привести к серьезным проблемам... Пришла в голову простая схема, как этот мониторинг может осуществляться: скрипт регулярно, скажем с периодичностью в 1-10 секунд, записывает в специальный файл время и статус / результаты работы, например, наличие соединения, величину вариационной маржи, или количество сделок по счету. На мобильном телефоне используется программа, которая регулярно считывает содержимое файла и сигнализирует пользователю (звуковой сигнал, будильник и т.п.), если время значительно отличается от текущего (что-то "упало"), или же статус / результат торговли не отвечает заданным критериям. Вопрос форумчанам: 1. Как мониторите состояние скриптов Вы? Что думаете по-поводу такой схемы? 2. Знаете ли программу для Андроид, имеющую подобный функционал для удаленного мониторинга ПК, чтения логов и оповещений?
Проблемы с потоком обезличенных сделок, "Обнуляется" список выбранных инструментов
Пользователь
Сообщений: Регистрация: 04.09.2016
31.03.2020 16:26:14
Использую квик 8.2.13. брокер Финам Для торговли в Lua использую поток обезличенных сделок по классу FORTS, Использую меню Система / Заказ данных / Поток обезличенных сделок и добавляю все инструменты из этого класса в число выбранных, по которым должны импортироваться обезличенные сделки. Однако через короткий промежуток времени (минуты, часы) импорт соответствующих данных прекращается, если зайти в упомянутое выше меню, видно, что там ничего не выбрано или выбран лишь один инструмент, сейчас это ближний фьючерс на нефть). Что за чудеса?
Обработка ошибок - открыт ли файл., Обработка ошибок - открыт ли файл.
Пользователь
Сообщений: Регистрация: 04.09.2016
17.03.2020 22:26:15
При попытке логгирования изредка появляется ошибка доступа к открытому текстовому файлу: attempt toi use closed file. Как корректно обработать эту ошибку, чтобы она не приводила к остановке работы скрипта? Как проверить открыт ли файл или нет, перед попыткой записи?
Поток обезличенных сделок, Прекращается трансляция обезличенных сделок при стабильно работающем quik (выбранные инструменты вновь становятся неактивными)
Пользователь
Сообщений: Регистрация: 04.09.2016
12.03.2020 10:50:52
Используя меню Система-Заказ данных - Поток обезличенных сделок - выбираю все доступные инструменты по классу "ФОРТС фьючерсы" (Добавить все - Сохранить). Однако, по прошествию некоторого времени вижу, что выбранные инструменты вновь переходят в недобавленные - надо повторять операцию по новой. Что это такое? Пытался ставить галку "Получать информацию по всем обезличенным сделкам с текущего момента" - не помогает...
Библиотека w32, аналог под 64 битную версию
Пользователь
Сообщений: Регистрация: 04.09.2016
03.03.2020 13:03:35
Использовал библиотеку w32 для звуковых оповещений в Квик. Однако, с обновлением до 64 битной версии 8 она перестала работать. Есть ли аналог?
Проблемы после перехода на 64 бит (Финам), Обновил квик от Финам до 64-битной версии, возникли проблемы с работой скриптов
Пользователь
Сообщений: Регистрация: 04.09.2016
02.12.2019 16:10:46
На днях обновил Quik который использую при работе на Финам до версии 8.02, 64-битной вместо старой 32-битной. Скрипты перестали работать, при этом обнаружил две проблемы. 1. Очевидная - скрипт выдает ошибку при попытке загрузки или использования библиотеки w32, которую я применяю для озвучки разных событий. Кто-либо знает о 64-битной версии библиотеки которую можно использовать взамен прежней?
2. Перестал работать следующий код: datetime = {} datetime.month, datetime.day, datetime.year = string.match(os.date(),"(%d*).(%d*).(%d*)") соответствующие значения времени оказываются пустыми = nil
Необновленные квики работают корректно...
Кто-то сталкивался / решил подобные проблемы?
Время окончания вечернего клиринга и начала вечерней сессии, getParamEx возвращает некорректные значения.
Пользователь
Сообщений: Регистрация: 04.09.2016
17.01.2019 12:53:04
Пытаюсь использовать функцию getParamEx(class_cod, sec_code, 'EVNSTARTTIME').param_value для того чтобы получить время окончания вечернего клиринга, которое, как известно обычно - 19.00, но иногда смещается на 19.05 Однако, в те дни, когда клиринг смещается на пять минут, функция как обычно возвращает "стандартное" значение "190000". В частности, такая ситуация была отмечена 10 января, тестировалось по ближайшим фьючерсам газпрома и других ликвидных базовых активов. В чем дело?
Корректная рекурсия, Как корректно оформить рекурсию в Lua (функция ссылается сама на себя)
Пользователь
Сообщений: Регистрация: 04.09.2016
17.01.2019 12:15:05
Рекурсия - когда функция ссылается сама на себя - вещь не самая удачная в программировании, однако иногда она все же нужна для работы роботов в Луа. В частности у меня написана функция инициации робота, которая вызывает сама себя, в случае, если нет соединения с сервером. Иными словами, в определенной точки функции, если не считаны параметры времени сервера (т.е. очевидно нет связи с ним), оператором sleep инициируется пауза в работе скрипта, а затем, функция вызывает сама себя и запускается с начала. Выглядит это в общих чертах так:
function OnInit() theDate = 0 -- инициируем переменную, которая будет содержать текущую дату InitBeforSession = false -- инициация перед началом сессии InitEveryDay () -- ежедневная инициализация end
function InitEveryDay () message ('Proliv InitEveryDay start') sleep (100)
-- Индикаторы состояния торговли isTempStoped = false; -- временная остановка работы скрипта isTrades = false; --есть ли торги по фьючерсам? isTradesPrevious = false isConnectedPrevious = false isConnected = false
-- Флаги работы скрипта is_run = false -- флаг работы цикла Main
-- Проверка на наличие соединения if dDT.year == nil then -- если значения полей пустые, значит нет соединения с сервером !!! по-видимому здесь происходит какое-то зацикливание из-за которого quik намертво виснет при запуске в период когда нет соединения с сервером message ("Error: no connection") sleep (5000) -- стоим на месте InitEveryDay () end -- если значения полей пустые
end -- конец функции
function main() -- Задерживаем старт main до исполнения кода onInit (после его завершения флаг stopMain будет переведен в false - см. выше) message ("main - stopMain ") while stopMain do -- старт стопора while sleep (500) message ("main stopMain is "..tostring(stopMain)) end -- конец стопора while end
---------------------------
Проблема в том, что при неблагоприятных условиях, в частности если скрипт стартуется при отсутствии соединения с сервером, скрипт виснет и вешает Квик, приходится аварийно перезагружать программу. Эта схема рекурсии с паузой и оператором sleep, как я увидел, неработоспособна и во всех других случаях, когда она регулярно (многократно) срабатавает. В чем проблема? И как реализовать данную задачу корректно: скрипт многократно пытается инициироваться, пока не наступят благоприятные условия.
Положение ярлыков наносимых на график с помощью LUA, Ярлык находится в позиции раньше на несколько баров, чем нужно.
Пользователь
Сообщений: Регистрация: 04.09.2016
05.09.2018 18:45:30
Я наношу на графики значки / ярлыки с использованием функции AddLabel Один из ее параметров - дата и время свечи. Я получаю время свечи из источника данных с помощью Выглядит для постановки ярлыка на последнюю свечку это приблизительно так:
local DATE, TIME = fCheckLastBarDateTime(ds) fAddLabel (TheBaseSec.chart_name, "=", lastprice, DATE, TIME, R, G, 20, FONT_HEIGHT, HINT)
function fCheckLastBarDateTime(ds, index) local lastbar_index if index then lastbar_index = index else lastbar_index = ds:Size() -- индекс последнего бара end local datetime = ds:T(lastbar_index) local sdatetime = {} -- стринговая переменная с датой и временем -- Приводим параметры к значению хх (вместо х) for k, v in pairs (datetime) do -- перебираем таблицу datetime извлеченную из временного параметра последнего бара для добавления символов к одиночным значениям local param = tostring(v) -- параметр в которое считывается значение отдельного поля if #param == 1 then param = "0"..param ; end -- если только один символ, значит усечен 0 и его надо вновь добавить sdatetime [k] = param -- записываем измененный параметр end -- конец перебора полей таблицы времени -- Формируем дату и время в нужном формате local ddate = tostring(sdatetime.year)..tostring(sdatetime.month)..tostring(sdatetime.day) -- дата в виде строки local ttime = tostring(sdatetime.hour)..tostring(sdatetime.min)..tostring(sdatetime.sec) -- время в виде строки return ddate, ttime, datetime end
Однако, позиционируется ярлык на 1-2 бара раньше чем нужно? С чем это может быть связано? С путаницей времени начала и конца свечи? Иди с тем, что к началу бара привязывается край значка?
Проблемы с получением данных по стакану., Периодически по части инструментов (фьючерсы, акции) не видны стаканы.
Пользователь
Сообщений: Регистрация: 04.09.2016
13.08.2018 11:34:59
Вот сейчас, например, не вижу стаканов ни по одному основному фьючерсу за исключением FSU8, по акциям видно все. Чаще бывает что не видны стаканы только по некоторым значимым фьючерсам. В "Потоке котировок" и "Потоке обезличенных сделок", конечно, включен показ для всех фьючерсов. С чем может быть связана проблема? П.С. Набор "непоказываемых" стаканов становится видным сразу после старта и в течении сессии не меняется. П.С.С. При попытке подписки на стакан средствами Луа возвращаются нулевые значения бид/аск
Расчет финансового результата - проблемы для некоторых фьючерсов, Изменение шага цены после дневного клиринга создает сложности для расчета финансового результата нерублевых фьбючерсов (RI и т.п.)
Пользователь
Сообщений: Регистрация: 04.09.2016
21.06.2018 14:27:08
Я довольно успешно использую следующий механизм для расчета текущего (пока позиция не закрыта) и окончательного финансового результата торговли в рублях.
Без подробных разъяснений код выглядит так: local rublesFor1pointPrice = getPointsToRublesMultiplier('SPBFUT', sec_code) -- расчитываем рублевую стоимость 1 единицы цены лота (для большинства российских акций = 1, для товарных фьючерсов будет отличаться) local last_price = tonumber(getParamEx('SPBFUT', sec_code, "last").param_value) if rublesFor1pointPrice and last_price then -- если получили значение local Margin = lotBalance * rublesFor1pointPrice * last_price -- расчитываем цену позиции в рублях theStrategy.margin.P = Margin -- расчитываем цену позиции в рублях и записываем ее в поле E (enter) поля margin отражающего финансовый результат работы стратегии theStrategy.margin.R = theStrategy.margin.E + Margin - theStrategy.margin.C ...
Для большинства инструментов расчет всегда оказывается корректным, но для фьючерсов, валюта которых отлична от рублей, например для RI возникают проблемы. После прохода через дневной клиринг результат по позициям открытым с 10 до 14 часов оказывается некорректным. Полагаю, это оттого, что в клиринг пересчитывается величина rublesFor1pointPrice в связи с изменением курса рубля (в приведенном случае - к доллару). Т.е. даже при снижении цены для короткой позиции результат может оказаться убыточным. Насколько я понимаю и вижу из данных таблиц Quik "Нереализованная прибыль" и "Вариционная маржа", финансовый результат рассчитанный с применением новых значений некорректен и в нашем случае необходимо использовать старое значение шага цены как для момента входа, так и для момента выхода, или же новое значение, для момента входа в позицию и ее закрытия. Кто как решает эту проблему?
Акции - нет доступа к котировкам, не считываются данные, Из списка доступных классов исчез класс акций ММВБ
Пользователь
Сообщений: Регистрация: 04.09.2016
07.04.2018 17:58:41
Из списка доступных классов исчез класс акций ММВБ (пятница вечером). Через creatdatasource / lua источники данных не грузятся, графики не строятся и не обновляются. При редактировании таблиц этот класс не отображается. В чем дело не могу понять.
Расчет стоимости фьючерсов, Как определить программно стоимость позиции или лота "сложных" фьючерсов на индексы и биржевые товары (Ri, BR и др.)
Пользователь
Сообщений: Регистрация: 04.09.2016
30.03.2018 10:42:34
Как определить программно стоимость позиции или лота "сложных" фьючерсов на индексы и биржевые товары (Ri, BR и др.) Есть ли стандартная функция или надо считать по сложному?
Комментарий при выставлении заявки - проблемы с обработкой в OnTransReply, Комментарий отображается в таблице Quik, но не считывается в OnTransReply
Пользователь
Сообщений: Регистрация: 04.09.2016
28.02.2018 21:44:22
При выставлении заявок роботами я активно использую поле для комментариев -- так я отличаю заявки разных роботов. Делаю я это с помощью нижеприведенного поля:
["CLIENT_CODE"] = roboName, -- так в заявках выставляемых с полями на английском ["Комментарий"] = roboName, -- так в заявках на русском
Около недели назад, в выставленных заявках, где используются обозначение полей на английском, поля перестали приходить в функции OnTransReply. Т.е. поле brokerref, которое возвращает функция OnTransReply оказывается пустым. При этом в таблице заявок и сделок Quik имя робота прекрасно отображается в поле "Комментарий " Кто-либо сталкивался с такой проблемой? С чем она может быть связана
Неверная дата и время, Стандартные функции Lua возвращают неверное время сервера
Сейчас, 12 февраля в 02 часа ночи, однако результат исполнения кода дает время - 9 февраля, 12 часов дня. При этом в строке сообщений Quik время выводится верное (оно берется из компа?) Выглядит строка сообщений приблизительно так: 2:17:29 09-12:17:29
Почему время сервера сильно отстает от реального? У меня из-за этого проблемы с исполнением кода...
Ошибка при чтении стакана
Пользователь
Сообщений: Регистрация: 04.09.2016
06.02.2018 20:28:19
В последнее время в робот периодически выдает ошибку чтения стакана и падаете. Не может прочитать поле price вот в таком коде (ошибка "attempt to index field &" в строках bidPrice = ... ; offerPrice = ...). Не спрашиваю как ее избежать, как ее обработать чтобы скрипт не падал? Как видите опробовал уже и разные проверочные условия, почему-то все-равно проскакивает...
function bidoffCalc(value) -- value -- таблица-объект с данными об инструменте, включая ссылку на базовый актив и его параметры (tShares.value) Subscribe_Level_II_Quotes(value.cod, value.sec) value.tbl = getQuoteLevel2(value.cod, value.sec) --считываем стакан -- расчитываем bid ask local indexBid = tonumber(value.tbl.bid_count); local indexAsk = tonumber(value.tbl.offer_count); local bidPrice = 0 local offerPrice = 0 if indexBid ~= nil then if value.tbl.bid then bidPrice = tonumber(value.tbl.bid[indexBid].price) -- !!!!!!!!!!! где-то здесь появляться ссылка на несуществующую переменную выпадает ошибка attemp to index end end if indexAsk ~= nil then if value.tbl.offer then -- если существует соответствующее значение offerPrice = tonumber(value.tbl.offer[1].price) end end return bidPrice, offerPrice -- NUMBER end
Досрочный переход на следующую итерацию цикла, При определенном условии часть кода внутри цикла не нужно выполнять.
Пользователь
Сообщений: Регистрация: 04.09.2016
11.01.2018 22:34:59
Пример такой, я считываю данные по стакану и анализирую их. В случае какой-либо ошибки (торговая сессия завершена, не удалось считать стака, бид или аск и т.п.) нужно сразу завершить анализ инструмента и перейти к следующему в рамках цикла. На Си++ такое действо можно совершить с помощью оператора continue. Как это сделать в Lua - инфы нигде не нашел. Можно использовать условия if then, но придется городить их огромное количество, что сильно усложняет читабельность кода. Есть какой либо простой выход/ спецоператор?
Не могу получить стаканы по акциям, В последние дни не открываются стаканы по акциям (пустые поля при открытии соответствующего окна), программно их получить тоже не удается.
Пользователь
Сообщений: Регистрация: 04.09.2016
19.12.2017 14:13:38
В последние дни не открываются стаканы по акциям (пустые поля при открытии соответствующего окна), программно их получить тоже не удается. Стаканы по фьючерсам открываются нормально. Данные по акциям заказаны - с этим все ок.
Брокер Финам. В мобильном приложении финама все работает. Версия 7.12
В чем может быть дело?
Проблема с отправкой заявки с русскими полями, При копировании кода он перестает работать
Пользователь
Сообщений: Регистрация: 04.09.2016
05.10.2017 20:30:58
Есть у меня файл с вот-таким кодом отправки заявки с русскими полями и возможностью переноса через клиринг / ночь. (Когда-то формировал его на основе три-файла) t = { -- Задаем базовые параметры ордера ["CLASSCODE"] = CLASS_CODE , ["Инструмент"] = SEC_CODE, ["ACTION"] = "Ввод заявки", ["Торговый счет"] = ACCOUNT, ["Тип"] = "Лимитированная", ["Комментарий"] = RoboName, ["К/П"] = tradeDir, ["Количество"] = tostring(lots), ["Условие исполнения"] = "Поставить в очередь", ["Переносить заявку"] = "Да", ["Цена"] = tostring(PRICE), ["TRANS_ID"] = "1" , ["Дата экспирации"] = expDate
} res=sendTransaction(t);
Как только я копирую его в другой файл (текстовый файл Notepad++, Copy-Paste), он перестает работать. Выдает ошибку "Неправильно указан вид транзакции" + крикозябли "Р’РІРѕРґ заявки", то бишь "Ввод заявки". Чего только не делал -- все перепроверял до буквы, переписывал, сверял переменные. Никак не работает. Чтобы интегрировать этот код в новый файл, приходится делать копию оригинального и вокруг этого загодочного блока вставлять остальные куски кода скрипта. Тогда работает. Что это? Сталкивался кто-либо с таким?
Сохранение индикаторов в шаблонах графиков, Нет возможности сохранять подборки индикаторов и применять их к другим графикам.
Пользователь
Сообщений: Регистрация: 04.09.2016
21.09.2017 22:17:38
Допустим я наворотил на график 5-6 индикаторов. Настроил их. Хочу чтобы они с такими же настройками появились на множестве моих других графиков, или на графиках создаваемых вновь. Сохраняю шаблон исходного графика с индикаторами. И... опаньки, параметры графика (таймфрейм и т.п.) использовать при построении нового можно, а вот индикаторы - нет. Есть ли такая возможность в принципе? Если нет -- очень неудобно, прошу зарегистрировать пожелание!
quik выдает сообщение "Превышено ограничение на количество котировочных окон...", А их в программе открыто всего 3 штуки
Пользователь
Сообщений: Регистрация: 04.09.2016
18.09.2017 10:18:55
При этом работают два скрипта, которые перестали читать данные стакана... Чтение данных стакана через Lua с недавних пор приравнивается к открытию котировочного окна что-ли?
Считывание и установка настроек Quik с помощью Lua, Возможна ли?
Пользователь
Сообщений: Регистрация: 04.09.2016
14.09.2017 14:59:07
Хочу средствами Луа проверить и, при необходимости, выбрать все фьючи в Заказа данных / Поток обезличенных сделок. Мои настройки почему-то постоянно сбрасываются. Возможно ли такое и какова реализация?
Запись в текстовый файл, Нужно дописать данные в определенное место файла.
Пользователь
Сообщений: Регистрация: 04.09.2016
13.09.2017 23:56:30
Есть открытый текстовый файл, скажем, длинной в 100 строк. Необходимо дописать данные, скажем, в 79 строку (номер известен). Возможно ли такое средствами Lua, есть ли у кого пример реализации подобной функции?
Настройки Quik - где файл?, настройки задаваемые в разделах "Система/Настройки" - где сохраняются?
Пользователь
Сообщений: Регистрация: 04.09.2016
01.09.2017 10:42:12
Настройки окон сохраняются в файл wnd, а в какой файл сохраняются настройки задаваемые в разделах "Система/Настройки", в частности - параметры заявок, оповещения и т.п.? Можно ли сохранять и копировать данный файл из-разных/одной версии Quik?
FOK и IOC заявки
Пользователь
Сообщений: Регистрация: 04.09.2016
28.08.2017 23:50:57
С помощью параметра ["EXECUTION_CONDITION"] можно задавать тип транзакции, для рынка фьючей, я смог найти три возможных параметра
'PUT_IN_QUEUE' -- поставить в очередь заявок -- обычная лимитная заявка 'FILL_OR_KILL' -- исполнитель немедленно или выполнить «KILL_BALANCE» – снять остаток
Заявка 'FILL_OR_KILL' исполняется на весь объем или отменяется, однако мне нужна заявка, которая могла бы исполниться частично, и затем - отменялась автоматически. Такой тип на зарубежных площадках есть -- это "Immediate or canceled" (IOC). Однако, насколько я понимаю в QUIK/LUA такая возможность не реализована.. Прав ли я и с чем это связано? Кто как обходит проблему?
П.С. Чтобы не разводить базар "зачем": 1) чтобы не было нужды писать реализацию по удалению заявок, 2) чтобы экономить на количестве транзакций генерируемых роботом.
Удаление элементов в больших таблицах., Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц.
Пользователь
Сообщений: Регистрация: 04.09.2016
22.07.2017 23:28:57
Столкнулся с проблемой - скрипты "падают" из-за нехватки памяти. В одной из них формируется несколько сотен таблиц, в каждую из которых два раза в секунду добавляется новые элемент (история бид, оффер и сделок, подробнее см. ). Я пришел к выводу, что без удаления "старых" исторических значений из этих таблиц в течение сессии / одного запуска не обойтись. Однако, обнаружилось, что это очень затратная по ресурсам / времени процедура для которой я не вижу удобных альтернатив. Стандартный подход - использовать table.remove. Однако, он дает возможность удалять только один элемент, при удалении первых элементов в массиве, многократно меняются индексы всех последующих элементов, что требует много времени. Так удаление первых 5 тысяч элементов таблицы с 10 тыс. полей заняло у меня 6,5 сек. - непозволительно долго. Пример кода: local ElemToKeep = 5000 tab1 = tabInit (1000000) while #tab1 > ElemToKeep do table.remove (tab1,1) end
Есть обходные пути. Можно использовать простое удаление элементов, например, так: --local numElement = #tab2 --local toremove = numElement - ElemToKeep --for k = 1, toremove, 1 do --tab2[k] = nil --end Работа такого кода происходит гораздо быстрее (приблизительно в 2 тысячи раз в упомянутых условиях!). Однако, если мы удалим элементы в начале таблицы, например, с 1 по 2000, мы не сможем использовать их перебор через ipairs, и хуже того, мы не сможем оперативно посчитать число элементов в таблице с использованием #. Их число можно будет получить только путем перебора с вставкой счетчика в цикл pairs. Можно изголяться дальше в этом направлении. Например, каждый раз вставлять новые элементы в таблицу с использованием table.insert и присваивать им индекс 1, сдвигая все остальные в конец. Это решит проблему с ipairs, # и подсчетом элементов - достаточно будет обрезать "хвост" массива/таблицы, индексы будут начинаться с единицы и будут идти без пробелов. Однако, такой подход означает, что мы все равно выполняем ресурсозатратную процедуру (переименование индексов) -- с меньшей потерей времени, но чаще (при каждом добавлении нового элемента). Есть ли у кого-то пример эффективного решения подобной проблемы?
Ошибка not enough memory, сегодня скрипт впервые упал с такой ошибкой -- как выявить причину?
Пользователь
Сообщений: Регистрация: 04.09.2016
20.07.2017 22:55:37
Сегодня мой "боевой" скрипт LUA в ходе работы сегодня несколько раз падал с такой ошибкой. Поначалу грешил на то, что вставил в другой скрипт анализ изменения стаканов по всем фьючам, но отключение модуля результата не дало. По понятным, думаю, причинам, выложить его в открытый доступ не могу. В этой связи вопросы. 1. Подскажите, какова возможная причина проблемы? 2. У кого были похожие ситуации, с чем они связаны и как удалось избавиться от проблем? 3. Как самостоятельно попытаться идентифицировать источник проблемы и оптимизировать код? 4. Есть ли возможность использовать для LUA какие-либо программы отладки, которые анализируют
П.С. Версия quik - 7.12 Windows 10 64 бит 32 гб RAM. Одновременно работает 4 скрипта из них два - ресурсоемких. Включены таблицы всех сделок по фьючам и российским акциям (все инструменты). П.С.С. Вообще с переходом от 7.11 к 7.12 проблемы появляются одна за одной.
getFuturesLimit - параметры, не могу получить таблицу getFuturesLimit
Пользователь
Сообщений: Регистрация: 04.09.2016
06.07.2017 12:25:46
В соответствии с инструкцией формат вызова функции TABLE getFuturesLimit(STRING firmid, STRING trdaccid, NUMBER limit_type, STRING currcode) Почитал форумы и не вполне понимаю какие аргументы подставлять и что они значат Firmid - это SPBFUT или индекс фирмы вида MC0061... trdaccid -- аккаунт? везде пишут что он должен иметь вид SPBFUT...TT, но у меня не так, я в lua использую аккаунт вида 76..0 limit_type -- какие типы лимита бывают, чт currcode - это что вообще? код валюты?
Использовал строку вида FutLimit = getFuturesLimit("SPBFUT", ACCOUNT, 0, "SUR").cbplimit но она возвращает нулевые значения...
Заявка FILL OR KILL на срочном рынке, можно ли сформировать такую заявку на срочном рынке FORTS
Пользователь
Сообщений: Регистрация: 04.09.2016
04.07.2017 10:20:30
Сабж. Если да -- в каком поле и как прописывать такой тип заявки. Есть поле TYPE, но оно содержит только признаки лимитной и рыночной заявки...
Версия 7.12 - жуткие тормоза, После обновления тормозит рабочее место Quik
Пользователь
Сообщений: Регистрация: 04.09.2016
03.07.2017 10:57:22
Даже при переключении между окнами возникает пауза. Пакетный запуск нескольких десятков заявок через Lua вешает квик приблизительно на минуту. До обновления никаких проблем не было. Обновлялся через Финам. Система производительная, Windows 10.
Ошибка field 'day' missing in date table, В последние дни скрипт постоянно вылетает из-за этой ошибки
Пользователь
Сообщений: Регистрация: 04.09.2016
27.06.2017 00:03:15
В последние дни скрипт постоянно вылетает из-за этой ошибки field 'day' missing in date table Возникает она в разных частях кода и в разных ситуациях при попытке считать время сервера.
Для этих целей использую вот такую функцию function fTimeTable() dtServ = {}; dtServ.day,dtServ.month,dtServ.year,dtServ.hour,dtServ.min,dtServ.sec = string.match(getInfoParam('TRADEDATE')..' '..getInfoParam('SERVERTIME'),"(%d*).(%d*).(%d*) (%d*):(%d*):(%d*)") for key,value in pairs(dtServ) do dtServ[key] = tonumber(value) end return dtServ -- возвращает таблицу с элементами данных в последовательности: день-месяц-год час-мин-секунда end
Как кажется, причиной проблемы может быть перегрузка канала связи и пропуск данных -- она чаще возникает при массированной отправке заявок на размещение или снятие ордеров. Но раньше такого не было. Квик 7911 ФИНАМ
Кто сталкивался? В чем причина и как с ней бороться?
Как определить время вечерней сессии, Как определить время начала вечерней сессии на срочном рынке используя средства луа
Пользователь
Сообщений: Регистрация: 04.09.2016
10.06.2017 00:26:59
Сабж. Как известно иногда она начинается в 19.00, иногда - в 19.05 Пробовал разные средства - поля STATUS и TRAIDSTATUS всегда имеют значения 0. Данные о последней сделке и стакане заявок в период клиринга прекрасно выдаются, по ним судить о времени начала и окончания этого периода нельзя :-(
Двухфакторная авторизация - насколько важна?
Пользователь
Сообщений: Регистрация: 04.09.2016
09.06.2017 23:33:09
Двухфакторная авторизация мешает работе роботов. Каждый раз с 9.30 до 10.00 и только в этот промежуток надо авторизоваться в терминале. Подумываю о том, чтобы от нее отказаться Интересно субъективное мнение пользователей - кто работает с ней или без нее. Насколько это на ваш взгляд опасно? П.С. Финам-квик-луа
Сообщение и звуковое оповещение при выставлении заявки - как отключить., Сообщение и звуковое оповещение при выставлении заявки - как отключить.
Пользователь
Сообщений: Регистрация: 04.09.2016
02.05.2017 16:21:11
Мой торговый робот регулярно перевыставляет ордера, что обеспечивает постоянный поток сообщений в терминале Quik и сопутствующих звуковых оповещений. Я пытался отключить оповещения в настройках - однако, это никак не помогает. Насколько я понял они по умолчанию приходят от брокера и не отключаются. Однако же это кажется полным бредом. Мало того что это мешает работать (я пользуюсь одним ПК для разных целей, как, подозреваю, и многие здесь), хуже того, при частых оповещениях практически невозможно сделать что-либо в самом Quik, например, вручную выставить заявку! Прошу внимания разработчиков и совета пользователей -- как бороться с этой "диверсионной" активностью?
Проигрывание мелодии - информация о сделке., Оповещение пользователя о редких событиях в скрипте - как решаете эту задачу.
Пользователь
Сообщений: Регистрация: 04.09.2016
02.05.2017 16:16:11
Использую торговый робот который периодически- несколько раз в день совершает сделки. Работаю за тем же компьютером, где запущен терминал и скрипт Lua. Задачу оповещения я решал через запуск звукового файла, однако, обнаружил, что он задерживает поток в котором исполняется на то время в течение которого проигрывается мелодия (стандартный код - ниже). Для меня это неприемлемо. Вопрос пользователям - как решаете задачу оповещения о редких, но важных для вас событиях
-- играем звуки вверх music1 = {C1, E1, G1, C2} for i, tone in ipairs(music1) do w32.Beep(tone, 100) end
sleep(300)
-- играем звуки вниз music2 = {C2, G1, E1, C1} for i, tone in ipairs(music2) do w32.Beep(tone, 100) end
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
Пользователь
Сообщений: Регистрация: 04.09.2016
31.03.2017 21:29:40
С помощью OnQuotes записываю "слепки" стаканов в файл. Несложно узнать серверное время получения стакана пользователем (мной), например, с помощью функции getInfoParam('SERVERTIME'). Однако, очевидно, что время получения стакана и его генерации на сервере биржи будут отличаться -- требуется а) время чтобы доставить стакан, а также б) время на работу алгоритма. При этом компонента а) может от случая к случаю сильно разниться, соответственно, будет все время меняться и период запаздывания связанный с доставкой данных по стакану. В этой связи интересно знать, есть ли какой-либо маркер на сервере биржи отмечающий время генерации/изменения стакана и возможность его получить средствами quik | lua
Состояние счета - якорь и связь с графиками, Не удается увязать выбранную позицию в таблице "Состояние счета"с графиком, -- для того чтобы автоматически отображался выбранный инструмент
Пользователь
Сообщений: Регистрация: 04.09.2016
22.03.2017 20:39:45
В таблице "Состояние счета" при выборе отдельных позиций (в моем случае - фьючерсы на отдельные инструменты) хотелось бы тут же видеть их отображение в окне "График", которое имеется на той же странице. Во всех таблицах это можно сделать нажимая на якорь в правом верхнем углу, однако в таблице "Состояние счета" такого якоря нет. Это крайне неудобно - для контроля за позициям постоянно приходится искать глазами нужный инструмент на других страницах. Возможно я что-то не понимаю или сделал не так, или же такая необходимая опция для упомянутой таблицы недоступна. Если верно последнее - с чем связана такая ограниченность функционала? Версия 7.6.1.1.
Заявки не переносятся на следующий день, Проблема с переносом заявок на рынке FORTS, выставленных с использованием LUA. Не работают флаги ["Дата экспирации"] и ["Expiration date"] в SendTransaction
Пользователь
Сообщений: Регистрация: 04.09.2016
22.03.2017 00:39:55
Выставленные через LUA заявки не переносятся на следующий день в тех случаях когда используется параметр EXPIRY_DATE с соответствующими значениями (будущая дата / 'GTC'). Работаю с фьючерсами на FORTS через Финам, версия программы последняя на сервере - 7.6.1.1. Эта проблема уже обсуждалась на форуме
Однако, предложенное решение - использование названий параметров на русском, не работает, по крайней мере у меня. Квик отказывается их понимать и выдает ошибку Такое впечатление, что интерпретатор вообще никак не реагирует на флаг "EXPIRY_DATE", заявка выставляется с сроком жизни до конца сессии, даже если туда забивать ошибочные данные, например, -- прошедшую дату.
Пример кода: t = { -- Задаем базовые параметры ордера ["CLASSCODE"] = FORTS , --заявки выставляются только на рынке FORTS ["SECCODE"] = SEC_CODE, ["ACTION"] = "NEW_ORDER", ["ACCOUNT"] = ACCOUNT, --задано в начале функции по умолчанию ["CLIENT_CODE"] = CLIENT_CODE, --задано в начале функции по умолчанию ["TYPE"] = "L", -- лимитированные заявки ["OPERATION"] = tradeDir, -- направление продажи ('B' или 'S') ["PRICE"] = tostring(Price), ["QUANTITY"] = tostring(lots), ["TRANS_ID"] = tostring(uniq_trans_id), ["EXPIRY_DATE"] = 'GTC' }
res=sendTransaction(t);
Зависание при редактировании графика
Пользователь
Сообщений: Регистрация: 04.09.2016
04.09.2016 00:26:13
При попытки войти в меню "Редактировать..." для вновь созданного графика терминал обычно зависает. Что за беда и как с ней бороться? Версия 7.2.2. Windows 10 64bit Железо производительное.