Проблемы с трансляцией данных о лимите свободных средств, Трансляция данных о свободных средствах в терминале, а также в таблицах Quik-Lua противоречива и в ряде случаев некорректна.
Использую Quik версии 11.0.0.92 на нескольких счетах. На одном из счетов неверно транслируются данные о лимите свободных средств.
Неверные данные получаемые в поле таблицы lim_non_margin (функция getPortfolioInfoEx) при работе с LUA В самом терминале также неверно отображается лимит на количество лотов, которое можно приобрести на срочном рынке (поле "Max", ниже окошка ввода количества лотов). В терминале, в "Итогах" таблицы "Состояние счета", в поле "Свободно" объем денежных средств также отражается верно. Фактически можно выставить заявку на существенно больший объем чем отображается в поле "Max" - пропорционально объему денежных средств, которые видно, через поле "Свободно" в "Итогах". Разница между некорректным (заниженным) и истинным значением (поле "Свободно") - несколько порядков. Пробовал: обновление, смену сервера, перезаказ данных - безрезультатно. Проблему наблюдаю несколько недель.
В чем проблема? Вручную заявки выставлять еще можно, но робот без верных данных работать не может.
Робот пытается выставить заявки и по части из них на разных счетах приходит сообщение о неудачной попытке. "Ошибка создания заявки [GW][332]. Нехватка средств по лимитам клиентам" Срочный рынок, инструменты AFZ0, CHU0, MNU0 и др. При этом данные таблиц свидетельствуют что средств достаточно. Например, пытается выставить две заявки CHU0 по которым ГО составляет около 33 тысяч рублей. При этом в соответствии с данными таблицы "Состояние счета" свободных средств порядка 300 тыс. руб., а доступное количество заявок на покупку и продажу - 9 и т.п. С чем может быть связана проблема? Есть ли способ программно проверить достаточность лимитов непосредственно перед выставлением каждой заявки?
Вот так ругается на строку кода в цикле расположенном в пределах main, где пытаюсь считать статус соединения... while is_run do sleep (50) if isConnected() == 1 then .. -- не могу понять, что тут написал не так, ругается на эту строку ... end
Интересно мнение форумчан - как предпочитаете писать скрипты - все в одном файле или в виде конструктора - с подгрузкой отдельных файлов: 1. Отдельных функций/процедур (выставление заявки, считывание определенных данных и т.п.) 2. Отдельных классов (стратегия, позиция и т.п.)
Давно использую скрипт, который работает без ограничения по времени (ночью комп не выключается, утром он обновляет настройки и продолжает работу - очень удобно). В теле main он "бегает" по циклу с определенной паузой. В последнее время он стал самостоятельно спонтанно выключаться по непонятной причине. При этом логи показывают что функция OnStop не запускается, также в окне "Доступные скрипты" нет указания на какую либо ошибку работы скрипта. Соответствующее окно сообщений пусто. Единственная обнаруженная закономерность - работа прекращается после успешного выполнения транзакции по удалению заявки... (это частое действие и в большинстве случаев оно завершается без проблем...) Как в такой ситуации определить причину неожиданной остановки скрипта?
На срочном рынке (фьючи) все работает, а вот отправку транзакции на фондовом рынке никак не могу настроить. Кому не жалко - покажите фрагмент кода (желательно, отправка с переносом на следующие сутки) и как должен выглядеть код-клиента. В поддержку финама не дозвониться, код для срочного рынка озвученный сбером никак не подходит... ((
} 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) }
Мониторинг работы скрипта - полагаю сверхактуальная задача для большинства поклонников алгоритмической торговли. Особо она важна в тех случаях, когда используются лимитные заявки. Упал скрипт, упал квик, упал комп, нет соединения... - все эти события могут привести к серьезным проблемам... Пришла в голову простая схема, как этот мониторинг может осуществляться: скрипт регулярно, скажем с периодичностью в 1-10 секунд, записывает в специальный файл время и статус / результаты работы, например, наличие соединения, величину вариационной маржи, или количество сделок по счету. На мобильном телефоне используется программа, которая регулярно считывает содержимое файла и сигнализирует пользователю (звуковой сигнал, будильник и т.п.), если время значительно отличается от текущего (что-то "упало"), или же статус / результат торговли не отвечает заданным критериям. Вопрос форумчанам: 1. Как мониторите состояние скриптов Вы? Что думаете по-поводу такой схемы? 2. Знаете ли программу для Андроид, имеющую подобный функционал для удаленного мониторинга ПК, чтения логов и оповещений?
Использую квик 8.2.13. брокер Финам Для торговли в Lua использую поток обезличенных сделок по классу FORTS, Использую меню Система / Заказ данных / Поток обезличенных сделок и добавляю все инструменты из этого класса в число выбранных, по которым должны импортироваться обезличенные сделки. Однако через короткий промежуток времени (минуты, часы) импорт соответствующих данных прекращается, если зайти в упомянутое выше меню, видно, что там ничего не выбрано или выбран лишь один инструмент, сейчас это ближний фьючерс на нефть). Что за чудеса?
При попытке логгирования изредка появляется ошибка доступа к открытому текстовому файлу: attempt toi use closed file. Как корректно обработать эту ошибку, чтобы она не приводила к остановке работы скрипта? Как проверить открыт ли файл или нет, перед попыткой записи?
Используя меню Система-Заказ данных - Поток обезличенных сделок - выбираю все доступные инструменты по классу "ФОРТС фьючерсы" (Добавить все - Сохранить). Однако, по прошествию некоторого времени вижу, что выбранные инструменты вновь переходят в недобавленные - надо повторять операцию по новой. Что это такое? Пытался ставить галку "Получать информацию по всем обезличенным сделкам с текущего момента" - не помогает...
На днях обновил 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(class_cod, sec_code, 'EVNSTARTTIME').param_value для того чтобы получить время окончания вечернего клиринга, которое, как известно обычно - 19.00, но иногда смещается на 19.05 Однако, в те дни, когда клиринг смещается на пять минут, функция как обычно возвращает "стандартное" значение "190000". В частности, такая ситуация была отмечена 10 января, тестировалось по ближайшим фьючерсам газпрома и других ликвидных базовых активов. В чем дело?
Рекурсия - когда функция ссылается сама на себя - вещь не самая удачная в программировании, однако иногда она все же нужна для работы роботов в Луа. В частности у меня написана функция инициации робота, которая вызывает сама себя, в случае, если нет соединения с сервером. Иными словами, в определенной точки функции, если не считаны параметры времени сервера (т.е. очевидно нет связи с ним), оператором 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, как я увидел, неработоспособна и во всех других случаях, когда она регулярно (многократно) срабатавает. В чем проблема? И как реализовать данную задачу корректно: скрипт многократно пытается инициироваться, пока не наступят благоприятные условия.
Я наношу на графики значки / ярлыки с использованием функции 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 бара раньше чем нужно? С чем это может быть связано? С путаницей времени начала и конца свечи? Иди с тем, что к началу бара привязывается край значка?
Вот сейчас, например, не вижу стаканов ни по одному основному фьючерсу за исключением FSU8, по акциям видно все. Чаще бывает что не видны стаканы только по некоторым значимым фьючерсам. В "Потоке котировок" и "Потоке обезличенных сделок", конечно, включен показ для всех фьючерсов. С чем может быть связана проблема? П.С. Набор "непоказываемых" стаканов становится видным сразу после старта и в течении сессии не меняется. П.С.С. При попытке подписки на стакан средствами Луа возвращаются нулевые значения бид/аск
Расчет финансового результата - проблемы для некоторых фьючерсов, Изменение шага цены после дневного клиринга создает сложности для расчета финансового результата нерублевых фьбючерсов (RI и т.п.)
Я довольно успешно использую следующий механизм для расчета текущего (пока позиция не закрыта) и окончательного финансового результата торговли в рублях.
Без подробных разъяснений код выглядит так: 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 "Нереализованная прибыль" и "Вариционная маржа", финансовый результат рассчитанный с применением новых значений некорректен и в нашем случае необходимо использовать старое значение шага цены как для момента входа, так и для момента выхода, или же новое значение, для момента входа в позицию и ее закрытия. Кто как решает эту проблему?
Из списка доступных классов исчез класс акций ММВБ (пятница вечером). Через creatdatasource / lua источники данных не грузятся, графики не строятся и не обновляются. При редактировании таблиц этот класс не отображается. В чем дело не могу понять.
Как определить программно стоимость позиции или лота "сложных" фьючерсов на индексы и биржевые товары (Ri, BR и др.) Есть ли стандартная функция или надо считать по сложному?
При выставлении заявок роботами я активно использую поле для комментариев -- так я отличаю заявки разных роботов. Делаю я это с помощью нижеприведенного поля:
["CLIENT_CODE"] = roboName, -- так в заявках выставляемых с полями на английском ["Комментарий"] = roboName, -- так в заявках на русском
Около недели назад, в выставленных заявках, где используются обозначение полей на английском, поля перестали приходить в функции OnTransReply. Т.е. поле brokerref, которое возвращает функция OnTransReply оказывается пустым. При этом в таблице заявок и сделок Quik имя робота прекрасно отображается в поле "Комментарий " Кто-либо сталкивался с такой проблемой? С чем она может быть связана
Сейчас, 12 февраля в 02 часа ночи, однако результат исполнения кода дает время - 9 февраля, 12 часов дня. При этом в строке сообщений Quik время выводится верное (оно берется из компа?) Выглядит строка сообщений приблизительно так: 2:17:29 09-12:17:29
Почему время сервера сильно отстает от реального? У меня из-за этого проблемы с исполнением кода...
В последнее время в робот периодически выдает ошибку чтения стакана и падаете. Не может прочитать поле 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
Пример такой, я считываю данные по стакану и анализирую их. В случае какой-либо ошибки (торговая сессия завершена, не удалось считать стака, бид или аск и т.п.) нужно сразу завершить анализ инструмента и перейти к следующему в рамках цикла. На Си++ такое действо можно совершить с помощью оператора continue. Как это сделать в Lua - инфы нигде не нашел. Можно использовать условия if then, но придется городить их огромное количество, что сильно усложняет читабельность кода. Есть какой либо простой выход/ спецоператор?
Не могу получить стаканы по акциям, В последние дни не открываются стаканы по акциям (пустые поля при открытии соответствующего окна), программно их получить тоже не удается.
В последние дни не открываются стаканы по акциям (пустые поля при открытии соответствующего окна), программно их получить тоже не удается. Стаканы по фьючерсам открываются нормально. Данные по акциям заказаны - с этим все ок.
Брокер Финам. В мобильном приложении финама все работает. Версия 7.12
Есть у меня файл с вот-таким кодом отправки заявки с русскими полями и возможностью переноса через клиринг / ночь. (Когда-то формировал его на основе три-файла) t = { -- Задаем базовые параметры ордера ["CLASSCODE"] = CLASS_CODE , ["Инструмент"] = SEC_CODE, ["ACTION"] = "Ввод заявки", ["Торговый счет"] = ACCOUNT, ["Тип"] = "Лимитированная", ["Комментарий"] = RoboName, ["К/П"] = tradeDir, ["Количество"] = tostring(lots), ["Условие исполнения"] = "Поставить в очередь", ["Переносить заявку"] = "Да", ["Цена"] = tostring(PRICE), ["TRANS_ID"] = "1" , ["Дата экспирации"] = expDate
} res=sendTransaction(t);
Как только я копирую его в другой файл (текстовый файл Notepad++, Copy-Paste), он перестает работать. Выдает ошибку "Неправильно указан вид транзакции" + крикозябли "Р’РІРѕРґ заявки", то бишь "Ввод заявки". Чего только не делал -- все перепроверял до буквы, переписывал, сверял переменные. Никак не работает. Чтобы интегрировать этот код в новый файл, приходится делать копию оригинального и вокруг этого загодочного блока вставлять остальные куски кода скрипта. Тогда работает. Что это? Сталкивался кто-либо с таким?
Допустим я наворотил на график 5-6 индикаторов. Настроил их. Хочу чтобы они с такими же настройками появились на множестве моих других графиков, или на графиках создаваемых вновь. Сохраняю шаблон исходного графика с индикаторами. И... опаньки, параметры графика (таймфрейм и т.п.) использовать при построении нового можно, а вот индикаторы - нет. Есть ли такая возможность в принципе? Если нет -- очень неудобно, прошу зарегистрировать пожелание!
При этом работают два скрипта, которые перестали читать данные стакана... Чтение данных стакана через Lua с недавних пор приравнивается к открытию котировочного окна что-ли?
Хочу средствами Луа проверить и, при необходимости, выбрать все фьючи в Заказа данных / Поток обезличенных сделок. Мои настройки почему-то постоянно сбрасываются. Возможно ли такое и какова реализация?
Есть открытый текстовый файл, скажем, длинной в 100 строк. Необходимо дописать данные, скажем, в 79 строку (номер известен). Возможно ли такое средствами Lua, есть ли у кого пример реализации подобной функции?
Настройки окон сохраняются в файл wnd, а в какой файл сохраняются настройки задаваемые в разделах "Система/Настройки", в частности - параметры заявок, оповещения и т.п.? Можно ли сохранять и копировать данный файл из-разных/одной версии Quik?
С помощью параметра ["EXECUTION_CONDITION"] можно задавать тип транзакции, для рынка фьючей, я смог найти три возможных параметра
'PUT_IN_QUEUE' -- поставить в очередь заявок -- обычная лимитная заявка 'FILL_OR_KILL' -- исполнитель немедленно или выполнить «KILL_BALANCE» – снять остаток
Заявка 'FILL_OR_KILL' исполняется на весь объем или отменяется, однако мне нужна заявка, которая могла бы исполниться частично, и затем - отменялась автоматически. Такой тип на зарубежных площадках есть -- это "Immediate or canceled" (IOC). Однако, насколько я понимаю в QUIK/LUA такая возможность не реализована.. Прав ли я и с чем это связано? Кто как обходит проблему?
П.С. Чтобы не разводить базар "зачем": 1) чтобы не было нужды писать реализацию по удалению заявок, 2) чтобы экономить на количестве транзакций генерируемых роботом.
Удаление элементов в больших таблицах., Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц.
Столкнулся с проблемой - скрипты "падают" из-за нехватки памяти. В одной из них формируется несколько сотен таблиц, в каждую из которых два раза в секунду добавляется новые элемент (история бид, оффер и сделок, подробнее см. https://forum.quik.ru/forum10/topic2958/). Я пришел к выводу, что без удаления "старых" исторических значений из этих таблиц в течение сессии / одного запуска не обойтись. Однако, обнаружилось, что это очень затратная по ресурсам / времени процедура для которой я не вижу удобных альтернатив. Стандартный подход - использовать 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, # и подсчетом элементов - достаточно будет обрезать "хвост" массива/таблицы, индексы будут начинаться с единицы и будут идти без пробелов. Однако, такой подход означает, что мы все равно выполняем ресурсозатратную процедуру (переименование индексов) -- с меньшей потерей времени, но чаще (при каждом добавлении нового элемента). Есть ли у кого-то пример эффективного решения подобной проблемы?
Сегодня мой "боевой" скрипт LUA в ходе работы сегодня несколько раз падал с такой ошибкой. Поначалу грешил на то, что вставил в другой скрипт анализ изменения стаканов по всем фьючам, но отключение модуля результата не дало. По понятным, думаю, причинам, выложить его в открытый доступ не могу. В этой связи вопросы. 1. Подскажите, какова возможная причина проблемы? 2. У кого были похожие ситуации, с чем они связаны и как удалось избавиться от проблем? 3. Как самостоятельно попытаться идентифицировать источник проблемы и оптимизировать код? 4. Есть ли возможность использовать для LUA какие-либо программы отладки, которые анализируют
П.С. Версия quik - 7.12 Windows 10 64 бит 32 гб RAM. Одновременно работает 4 скрипта из них два - ресурсоемких. Включены таблицы всех сделок по фьючам и российским акциям (все инструменты). П.С.С. Вообще с переходом от 7.11 к 7.12 проблемы появляются одна за одной.
В соответствии с инструкцией формат вызова функции 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 но она возвращает нулевые значения...
Даже при переключении между окнами возникает пауза. Пакетный запуск нескольких десятков заявок через Lua вешает квик приблизительно на минуту. До обновления никаких проблем не было. Обновлялся через Финам. Система производительная, Windows 10.
В последние дни скрипт постоянно вылетает из-за этой ошибки 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 ФИНАМ
Кто сталкивался? В чем причина и как с ней бороться?
Сабж. Как известно иногда она начинается в 19.00, иногда - в 19.05 Пробовал разные средства - поля STATUS и TRAIDSTATUS всегда имеют значения 0. Данные о последней сделке и стакане заявок в период клиринга прекрасно выдаются, по ним судить о времени начала и окончания этого периода нельзя :-(
Двухфакторная авторизация мешает работе роботов. Каждый раз с 9.30 до 10.00 и только в этот промежуток надо авторизоваться в терминале. Подумываю о том, чтобы от нее отказаться Интересно субъективное мнение пользователей - кто работает с ней или без нее. Насколько это на ваш взгляд опасно? П.С. Финам-квик-луа
Мой торговый робот регулярно перевыставляет ордера, что обеспечивает постоянный поток сообщений в терминале Quik и сопутствующих звуковых оповещений. Я пытался отключить оповещения в настройках - однако, это никак не помогает. Насколько я понял они по умолчанию приходят от брокера и не отключаются. Однако же это кажется полным бредом. Мало того что это мешает работать (я пользуюсь одним ПК для разных целей, как, подозреваю, и многие здесь), хуже того, при частых оповещениях практически невозможно сделать что-либо в самом Quik, например, вручную выставить заявку! Прошу внимания разработчиков и совета пользователей -- как бороться с этой "диверсионной" активностью?
Использую торговый робот который периодически- несколько раз в день совершает сделки. Работаю за тем же компьютером, где запущен терминал и скрипт Lua. Задачу оповещения я решал через запуск звукового файла, однако, обнаружил, что он задерживает поток в котором исполняется на то время в течение которого проигрывается мелодия (стандартный код - ниже). Для меня это неприемлемо. Вопрос пользователям - как решаете задачу оповещения о редких, но важных для вас событиях
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
С помощью OnQuotes записываю "слепки" стаканов в файл. Несложно узнать серверное время получения стакана пользователем (мной), например, с помощью функции getInfoParam('SERVERTIME'). Однако, очевидно, что время получения стакана и его генерации на сервере биржи будут отличаться -- требуется а) время чтобы доставить стакан, а также б) время на работу алгоритма. При этом компонента а) может от случая к случаю сильно разниться, соответственно, будет все время меняться и период запаздывания связанный с доставкой данных по стакану. В этой связи интересно знать, есть ли какой-либо маркер на сервере биржи отмечающий время генерации/изменения стакана и возможность его получить средствами quik | lua
Состояние счета - якорь и связь с графиками, Не удается увязать выбранную позицию в таблице "Состояние счета"с графиком, -- для того чтобы автоматически отображался выбранный инструмент
В таблице "Состояние счета" при выборе отдельных позиций (в моем случае - фьючерсы на отдельные инструменты) хотелось бы тут же видеть их отображение в окне "График", которое имеется на той же странице. Во всех таблицах это можно сделать нажимая на якорь в правом верхнем углу, однако в таблице "Состояние счета" такого якоря нет. Это крайне неудобно - для контроля за позициям постоянно приходится искать глазами нужный инструмент на других страницах. Возможно я что-то не понимаю или сделал не так, или же такая необходимая опция для упомянутой таблицы недоступна. Если верно последнее - с чем связана такая ограниченность функционала? Версия 7.6.1.1.
Заявки не переносятся на следующий день, Проблема с переносом заявок на рынке FORTS, выставленных с использованием LUA. Не работают флаги ["Дата экспирации"] и ["Expiration date"] в SendTransaction
Выставленные через LUA заявки не переносятся на следующий день в тех случаях когда используется параметр EXPIRY_DATE с соответствующими значениями (будущая дата / 'GTC'). Работаю с фьючерсами на FORTS через Финам, версия программы последняя на сервере - 7.6.1.1. Эта проблема уже обсуждалась на форуме https://forum.quik.ru/messages/forum10/message14444/topic1590/#message14444 Однако, предложенное решение - использование названий параметров на русском, не работает, по крайней мере у меня. Квик отказывается их понимать и выдает ошибку Такое впечатление, что интерпретатор вообще никак не реагирует на флаг "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' }
При попытки войти в меню "Редактировать..." для вновь созданного графика терминал обычно зависает. Что за беда и как с ней бороться? Версия 7.2.2. Windows 10 64bit Железо производительное.