Иван Ру (Автор тем)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Странная проблема с лимитами - деньги и лимиты есть, но заявка отвергнута по причине их неватки., Наблюдаю сегодня на терминалах 8.5 - 8.6
 
Робот пытается выставить заявки и по части из них на разных счетах приходит сообщение о неудачной попытке.
"Ошибка создания заявки [GW][332]. Нехватка средств по лимитам клиентам"
Срочный рынок, инструменты AFZ0, CHU0, MNU0 и др.
При этом данные таблиц свидетельствуют что средств достаточно.
Например, пытается выставить две заявки CHU0 по которым ГО составляет около 33 тысяч рублей. При этом в соответствии с данными таблицы "Состояние счета" свободных средств порядка 300 тыс. руб., а доступное количество заявок на покупку и продажу - 9 и т.п.
С чем может быть связана проблема? Есть ли способ программно проверить достаточность лимитов непосредственно перед выставлением каждой заявки?
Что я делаю не так, ошибка... attempt to call a boolean value (global 'isConnected')
 
Вот так ругается на строку кода в цикле расположенном в пределах main, где пытаюсь считать статус соединения...
while is_run do
 sleep (50)
 if isConnected() == 1 then  .. -- не могу понять, что тут написал не так, ругается на эту строку
     ...
 end
Принципы написания скриптов, Разделять или объединять?
 
Интересно мнение форумчан - как предпочитаете писать скрипты - все в одном файле или в виде конструктора - с подгрузкой отдельных файлов:
1. Отдельных функций/процедур (выставление заявки, считывание определенных данных и т.п.)
2. Отдельных классов (стратегия, позиция и т.п.)
Можно ли программно получить данные OHLCV по нескольким дневным периодам, без использования графика?, У меня что-то не получилось, есть ли способ?
 
Сабж.
Скрипт прекращает работу, а не должен, Скрипт прекращает работу по непонятной причине, как ее выявить?
 
Давно использую скрипт, который работает без ограничения по времени (ночью комп не выключается, утром он обновляет настройки и продолжает работу - очень удобно). В теле main он "бегает" по циклу с определенной паузой.
В последнее время он стал самостоятельно спонтанно выключаться по непонятной причине. При этом логи показывают что функция OnStop не запускается, также в окне "Доступные скрипты" нет указания на какую либо ошибку работы скрипта. Соответствующее окно сообщений пусто. Единственная обнаруженная закономерность - работа прекращается после успешного выполнения транзакции по удалению заявки... (это частое действие и в большинстве случаев оно завершается без проблем...)
Как в такой ситуации определить причину неожиданной остановки скрипта?
Отправка транзакции в сегменте фондового рынка (акции) - брокеры Финам / Сбербанк, какой формат и где брать код клиента?
 
На срочном рынке (фьючи) все работает, а вот отправку транзакции на фондовом рынке никак не могу настроить.
Кому не жалко - покажите фрагмент кода (желательно, отправка с переносом на следующие сутки) и как должен выглядеть код-клиента.
В поддержку финама не дозвониться, код для срочного рынка озвученный сбером никак не подходит... ((

Сам я пользуюсь такими вариациями:
-- Задаем базовые параметры ордера
["CLASSCODE"] = CLASS_CODE ,
["Инструмент"] = SEC_CODE,
["ACTION"] = "Ввод заявки",
["Торговый счет"] = accounForSection,
["Тип"]         = "Лимитированная",
["Комментарий"]         = RoboName,
["К/П"] = tradeDir,
["Количество"] = tostring(NumberOfLots),
["Условие исполнения"] = "Поставить в очередь",
["Переносить заявку"] = "Да",
["Цена"] = tostring(CORRECT_PRICE),
["TRANS_ID"] = "1" ,
["Дата экспирации"] = expDate

 }
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 (выбранные инструменты вновь становятся неактивными)
 
Используя меню Система-Заказ данных - Поток обезличенных сделок - выбираю все доступные инструменты по классу "ФОРТС фьючерсы" (Добавить все - Сохранить). Однако, по прошествию некоторого времени вижу, что выбранные инструменты вновь переходят в недобавленные - надо повторять операцию по новой. Что это такое? Пытался ставить галку "Получать информацию по всем обезличенным сделкам с текущего момента" - не помогает...
Библиотека w32, аналог под 64 битную версию
 
Использовал библиотеку w32 для звуковых оповещений в Квик. Однако, с обновлением до 64 битной версии 8 она перестала работать.
Есть ли аналог?
Проблемы после перехода на 64 бит (Финам), Обновил квик от Финам до 64-битной версии, возникли проблемы с работой скриптов
 
На днях обновил 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 возвращает некорректные значения.
 
Пытаюсь использовать функцию getParamEx(class_cod, sec_code, 'EVNSTARTTIME').param_value для того чтобы получить время окончания вечернего клиринга, которое, как известно обычно - 19.00, но иногда смещается на 19.05
Однако, в те дни, когда клиринг смещается на пять минут, функция как обычно возвращает "стандартное" значение "190000".
В частности, такая ситуация была отмечена 10 января, тестировалось по ближайшим фьючерсам газпрома и других ликвидных базовых активов.
В чем дело?
Корректная рекурсия, Как корректно оформить рекурсию в Lua (функция ссылается сама на себя)
 
Рекурсия - когда функция ссылается сама на себя - вещь не самая удачная в программировании, однако иногда она все же нужна для работы роботов в Луа.
В частности у меня написана функция инициации робота, которая вызывает сама себя, в случае, если нет соединения с сервером. Иными словами, в определенной точки функции, если не считаны параметры времени сервера (т.е. очевидно нет связи с ним), оператором 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, Ярлык находится в позиции раньше на несколько баров, чем нужно.
 
Я наношу на графики значки / ярлыки с использованием функции 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 и др.)
 
Как определить программно стоимость позиции или лота "сложных" фьючерсов на индексы и биржевые товары (Ri, BR и др.)
Есть ли стандартная функция или надо считать по сложному?
Комментарий при выставлении заявки - проблемы с обработкой в OnTransReply, Комментарий отображается в таблице Quik, но не считывается в OnTransReply
 
При выставлении заявок роботами я активно использую поле для комментариев -- так я отличаю заявки разных роботов.
Делаю я это с помощью нижеприведенного поля:

["CLIENT_CODE"] = roboName, -- так в заявках выставляемых с полями на английском
["Комментарий"] = roboName, -- так в заявках на русском


Около недели назад, в выставленных заявках, где используются обозначение полей на английском, поля перестали приходить в функции OnTransReply.
Т.е. поле brokerref, которое возвращает функция OnTransReply оказывается пустым.
При этом в таблице заявок и сделок Quik имя робота прекрасно отображается в поле "Комментарий "
Кто-либо сталкивался с такой проблемой? С чем она может быть связана
Неверная дата и время, Стандартные функции Lua возвращают неверное время сервера
 
Тестирую вот такой код:

dt = {}
dt.day,dt.month,dt.year,dt.hour,dt.min,dt.sec = string.match(getInfoParam('TRADEDATE')..' '..getInfoParam('SERVERTIME'),"(%d*).(%d*).(%d*) (%d*):(%d*):(%d*)")
message (tostring(dt.day).."-"..tostring(dt.hour)..":"..tostring(dt.min)..":"..tostring(dt.sec))

Сейчас, 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 индикаторов. Настроил их. Хочу чтобы они с такими же настройками появились на множестве моих других графиков, или на графиках создаваемых вновь. Сохраняю шаблон исходного графика с индикаторами. И... опаньки, параметры графика (таймфрейм и т.п.) использовать при построении нового можно, а вот индикаторы - нет. Есть ли такая возможность в принципе? Если нет -- очень неудобно, прошу зарегистрировать пожелание!  
quik выдает сообщение "Превышено ограничение на количество котировочных окон...", А их в программе открыто всего 3 штуки
 
При этом работают два скрипта, которые перестали читать данные стакана...
Чтение данных стакана через Lua с недавних пор приравнивается к открытию котировочного окна что-ли?
Считывание и установка настроек Quik с помощью Lua, Возможна ли?
 
Хочу средствами Луа проверить и, при необходимости, выбрать все фьючи в Заказа данных / Поток обезличенных сделок. Мои настройки почему-то постоянно сбрасываются.
Возможно ли такое и какова реализация?
Запись в текстовый файл, Нужно дописать данные в определенное место файла.
 
Есть открытый текстовый файл, скажем, длинной в 100 строк.
Необходимо дописать данные, скажем, в 79 строку (номер известен). Возможно ли такое средствами Lua, есть ли у кого пример реализации подобной функции?
Настройки Quik - где файл?, настройки задаваемые в разделах "Система/Настройки" - где сохраняются?
 
Настройки окон сохраняются в файл wnd, а в какой файл сохраняются настройки задаваемые в разделах "Система/Настройки", в частности - параметры заявок, оповещения и т.п.?
Можно ли сохранять и копировать данный файл из-разных/одной версии Quik?
FOK и IOC заявки
 
С помощью параметра ["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, # и подсчетом элементов - достаточно будет обрезать "хвост" массива/таблицы, индексы будут начинаться с единицы и будут идти без пробелов. Однако, такой подход означает, что мы все равно выполняем ресурсозатратную процедуру (переименование индексов) -- с меньшей потерей времени, но чаще (при каждом добавлении нового элемента).
Есть ли у кого-то пример эффективного решения подобной проблемы?
Ошибка not enough memory, сегодня скрипт впервые упал с такой ошибкой -- как выявить причину?
 
Сегодня мой "боевой" скрипт LUA в ходе работы сегодня несколько раз падал с такой ошибкой.
Поначалу грешил на то, что вставил в другой скрипт анализ изменения стаканов по всем фьючам, но отключение модуля результата не дало.
По понятным, думаю, причинам, выложить его в открытый доступ не могу. В этой связи вопросы.
1. Подскажите, какова возможная причина проблемы?
2. У кого были похожие ситуации, с чем они связаны и как удалось избавиться от проблем?
3. Как самостоятельно попытаться идентифицировать источник проблемы  и оптимизировать код?
4. Есть ли возможность использовать для LUA какие-либо программы отладки, которые анализируют

П.С. Версия quik - 7.12 Windows 10 64 бит 32 гб RAM. Одновременно работает 4 скрипта из них два - ресурсоемких. Включены таблицы всех сделок по фьючам и российским акциям (все инструменты).
П.С.С. Вообще с переходом от 7.11 к 7.12 проблемы появляются одна за одной.
getFuturesLimit - параметры, не могу получить таблицу getFuturesLimit
 
В соответствии с инструкцией формат вызова функции 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
 
Сабж. Если да -- в каком поле и как прописывать такой тип заявки. Есть поле TYPE, но оно содержит только признаки лимитной и рыночной заявки...
Версия 7.12 - жуткие тормоза, После обновления тормозит рабочее место Quik
 
Даже при переключении между окнами возникает пауза. Пакетный запуск нескольких десятков заявок через Lua вешает квик приблизительно на минуту. До обновления никаких проблем не было.
Обновлялся через Финам. Система производительная, Windows 10.
Ошибка field 'day' missing in date table, В последние дни скрипт постоянно вылетает из-за этой ошибки
 
В последние дни скрипт постоянно вылетает из-за этой ошибки
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. Задачу оповещения я решал через запуск звукового файла, однако, обнаружил, что он задерживает поток в котором исполняется на то время в течение которого проигрывается мелодия (стандартный код - ниже). Для меня это неприемлемо.  Вопрос пользователям - как решаете задачу оповещения о редких, но важных для вас событиях

КОД ЗВУКОВОГО ОПОВЕЩЕНИЯ
require("w32")

poluton = 2 ^ (1/12)

-- определим константами частоты гармонического звукоряда
A1 = 440
B1 = A1 * (poluton ^ 2)
C1 = A1 * (poluton ^ 3)
D1 = A1 * (poluton ^ 5)
E1 = A1 * (poluton ^ 7)
F1 = A1 * (poluton ^ 8)
G1 = A1 * (poluton ^ 10)
A2 = A1 * (poluton ^ 12)
B2 = A1 * (poluton ^ 14)
C2 = A1 * (poluton ^ 15)

-- играем звуки вверх
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 - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
 
С помощью 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'
 }

res=sendTransaction(t);
Зависание при редактировании графика
 
При попытки войти в меню "Редактировать..." для вновь созданного графика терминал обычно зависает.
Что за беда и как с ней бороться?
Версия 7.2.2.
Windows 10 64bit
Железо производительное.  
Страницы: 1
Наверх