function main()
local t = {
["A"] = 1,
["B"] = 1,
["C"] = 1,
["D"] = 1,
}
local _c
local _t = os.time()
local c_err = 0
while true do
local c = 0
for k,v in pairs(t) do
c = c + 1
end
if not _c then
_c = c
message("c = "..tostring(c),1)
else
if _c ~= c then
c_err = c_err + 1
message( "_c ~= c "..tostring(_c).." ~= "..tostring(c), 3 )
end
end
sleep(10)
local time = os.time()
if time - _t > 10 then
message("Количество неправильных количеств: "..tostring(c_err).." (_c = "..tostring(_c)..")",1)
_t = time
end
end
end
Suntor написал: sectypestatic — откуда такой тип выцепили? не вижу в документации... только SECTYPE вижу
ARQA не добавила все параметры ТТП в документацию. Нашел его, сделав по рекомандации АРКИ DDE-экспорт ТТП в Excel с формальными заголовками по всем классам.
Берите из колбэка class_code и sec_code инструмента и проверяйте его тип:
Код
local pi = getParamEx(class_code,sec_code ,"sectypestatic")
local sectype = pi and pi.param_image
if sectype == "Ценные бумаги" then
elseif sectype == "Фьючерсы" then
elseif sectype == "Облигации" then
elseif sectype == "Опционы" then
elseif sectype == "Спреды" then
elseif sectype == "Валюта" then
elseif sectype == "Свопы" then
end
local function orEquals(tofind,...)
for _,v in ipairs{...} do
if v == tofind then return true end
end
return false
end
-- usage
local digit = "one"
print( orEquals(digit,"two","three","one") ) -- true
digit = 4
print( orEquals(digit,2,3,1) ) -- false
Let_it_go написал: А как перебирать тикер лист, если там есть фьючерсы? У них в конце цифра: ticker_list="SBER,GAZP,SiU8"
Стоит попробовать перебирать по группам символов, которые явно не являются разделителями: for sec in string.gmatch(ticker_list,"[^,]+") do --группа символов, но не запятая end
Я бы предложил через socket или ещё как-то с некоторой периодичностью слать пакет, содержащий key и настройки, туда, где внешнее ПО будет слушать эти пакеты. Но если индикатор без новых тиков не умеет что-либо делать после создания ( с индикаторами не работаю ), то это не осуществимо.
Как Вам вариант с генерацией файла типа pid индикатором? Имя файла - уникальный key. Внутри можно или просто датавремя последнего тика писать. Тогда настройки в отдельный файл при перезапуске индикатора сохранять. Либо датавремя+настройки дампить прямо в key-файл.
for _,table in pairs{ "depo_limits", "futures_client_holding", } do
local n = getNumberOf(table)
for i = 0, n-1 do
local limit = getItem(table,i)
local s = ""
for param,value in pairs(limit) do
s = s..param.."="..tostring(value)..", "
end
message( s, 1 )
end
end
Текущие чистые позиции по фьючам или Текущий остаток по бумагам сможете найти, если откроете QLUA.chm в каталоге Квика.
Если Вам охота "не потерять" колбэки, которые возникнут, пока переменные ещё не инициализированы, то стоит их "сложить" в очередь функций, которую разгрести, когда инициализация завершится.
В мануале к table.remove написано, что он удаляет нужный, сдвигая остальные, или последний элемент. В вашем случае надо делать или table.remove(s) или table.remove(s,1), чтобы удалять или с начала, или с конца, или следить, чтобы индекс был меньше размера таблицы.
ПС. Возможно, Вам будет профитнее использовать таблицу, индексированную не по-умолчанию i=1..N, а ключами - номерами заявок. Т.е.: s = { } s[order.order_num] = 1 or order or true Тогда не будет головняков с удалением, за исключением того, что надо точно знать номер удаляемой заявки, чтобы её удалить с помощью s[order_num] = nil
Let_it_go написал: Зачем? Код в моей версии понятный, элегантный и не громоздкий (всего 3 строчки). Если использовать else, он был бы намного объёмнее.
if sd[sec]>200 then otklonenie=5 elseif sd[sec]>50 then otklonenie=4 elseif sd[sec]>0 then otklonenie=3 end
Вроде тоже 3 строчки
Цитата
Let_it_go написал: Нет смысла такое оптимизировать.
Да как так-то?! ))) На горизонте простор для мемов )))
Насколько понял, событий не ооочень много и частота дописываний тоже не hft. Может стоит пересмотреть процесс создания/записи файла? Например периодически полностью пересоздавать его ( данные в памяти ). Если не охота данные в памяти всё время держать, можно сохранять в не очень наглядном lua-формате, загружать с помощью dofile, дополнять и снова сливать в файл.
Если требуется именно дописать, а не изменить, то для случая дописывания в конец строки самым простым представляется прочитать из файла, открытого как io.open( filename, "r+" ), N (=79) строк. Затем шагнуть назад file:seek( "cur", -EOL ), где EOL = "\n":len() - длина перевода на новую строку. А потом дописать с помощью file:write то, что Вам требуется. Для случая дописывания не в конец строки придётся искать позицию иначе.
Если файл создаётся периодически из того же кода, можно отдельно запоминать offset для file:seek нужного для дозаписи места.
• А также для Lua-скриптов повесьте Ctrl+F9 хотя бы, коль Ctrl+F11 занимает QPILE.
• А ещё при активном окне Доступных Lua-скриптов горячие клавиши Квика не работают. С учётом отсутствуя горячей клавиши для вызова/скрытия Lua-скриптов, это обращает на себя внимание.
s_mike@rambler.ru, были давно иногда такие проблемы, преимущественно на ФОРТС. Решались манипуляциями АРКИ с сервером Квика, если успевали заметить, перед или в начале торгов.
Как понял, это просто запуск скрипта, как из cmd.exe. К примеру, введите туда "C:\Program Files\Lua\5.1\lua.exe" "C:\Documents and Settings\%username%\Рабочий стол\new 1.lua" Запуститься интерпретатор lua, который выведет в Вашем случае ничего и исчезнет.
ПС А как Вам IntelliJ IDEA Community с Lua-плагином?
green_X5, В случае работы нескольких терминалов Квика получилось победить описанную Вами проблему только таким способом:
1. Создаём отдельный каталог. Например, D:\wnd 2. Для каждого Квика прописываем в настройках уникальное название файла настроек и сохраняем в D:\wnd. В Вашем случае, например, так: D:\wnd\info_SMS.wnd D:\wnd\info_VTB24.wnd D:\wnd\info_PSB.wnd
1ым пунктом решаем пробему глобальности текущего каталога в Квиках, 2ой пункт - чтобы не перепутать настройки. С учётом того, что у Вас включена опция "Сохранять настройки при выходе", можно предположить, что Квики перезатирали чужие настройки из-за проблемы глобальности. Эту опцию вообще лучше отключать, имхо, и сохраняться только вручную.
--message(os.date("%d.%.m.%Y"),1) -- 1. Вне main
function main()
if false then -- 2. В pcall
local r,err = pcall( function()
--if a > 1 then end -- 5. Другая ошибка
message(os.date("%d.%.m.%Y"),1)
return 1
end)
message(tostring(r),1)
message(tostring(err),3)
end
if false then -- 3. В xpcall
local r,err = pcall( function()
message(os.date("%d.%.m.%Y"),1)
return 1
end, function(err) message(err,3) end)
message(tostring(r),1)
message(tostring(err),3)
end
--message(os.date("%d.%.m.%Y")) -- 4. В main
while true do
message(tostring(os.time()),1)
sleep(1000)
end
end
Результаты:
Quik зависает ( весь UI )
Quik работает, скрипт зависает, сообщения об ошибки нет, цикл while время не показывает!
Аналогично случаю 2
Ошибки выполнения скрипта "Unknown error. Possible unhandled exception.", цикл while время не показывает.
Если вместо os.date внутри pcall или xpcall написать другую ошибку, напр., if a > 1 then end, то скрипт покажет "false", "attempt to compare number with nil", цикл while будет работать и показывать время.
Выводы:
В WinXP в Quik подобная ошибка вне main приводит к зависанию, а в pcall/xpcall не отлавливается и блокирует остальной скрипт
Ужесточить требования, удалив WinXP из списка поддерживаемых