Еще ньанс: Данная ошибка выскочила всего 1 раз за год бесперебойной работы скрипта..
Сразу бы это сказали...
Цитата
Евгений написал: Хотелось бы узнать причину или как побороть данную ошибку, чтобы срипт не вылетал с ошибкой.
Вероятно при первой проверке getFuturesLimit вернул таблицу, а при второй у брокера что-нибудь глюкнуло, и getFuturesLimit вернул nil Надо было закинуть результат getFuturesLimit в переменную и ее уже проверять
Еще ньанс: Данная ошибка выскочила всего 1 раз за год бесперебойной работы скрипта. Хотелось бы узнать причину или как побороть данную ошибку, чтобы срипт не вылетал с ошибкой.
Евгений написал: Подскажите выскочила ошибка: "attempt to index a nil value" на строчку: "if getFuturesLimit(FIRM, ACCOUNT, 0, "SUR").cbplplanned==nil then"Вроде как раз на nil проверяю.
У вас getFuturesLimit(FIRM, ACCOUNT, 0, "SUR") равно nil, а его индексировать нельзя.
if getFuturesLimit(FIRM, ACCOUNT, 0, "SUR")==nil then break end
if getFuturesLimit(FIRM, ACCOUNT, 0, "SUR").cbplplanned==nil then break end
Ругается на строчку if getFuturesLimit(FIRM, ACCOUNT, 0, "SUR").cbplplanned==nil then
Здравствуйте! Подскажите выскочила ошибка: "attempt to index a nil value" на строчку: "if getFuturesLimit(FIRM, ACCOUNT, 0, "SUR").cbplplanned==nil then"
Instrument = "RTSI" -- Инструмент
ClassCode = "RTSIDX" -- Код класса инструмента
IsRun = true
function main()
while IsRun do
sleep(1000)
for onlyForBr eak = 1, 1 do
dA, error = CreateDataSource(ClassCode, Instrument, INTERVAL_MN1)
if dA==nil or dA:Size()<5 then
break
end
A_Size = dA:Size()
message("A_Size = "..A_Size)
for i = 1, A_Size do
dataA = dA:T(i).year.."."..dA:T(i).month
message("dataA = "..dataA)
end
IsRun = false
end --for onlyForBr eak = 1, 1 do
end --while
dA:Close()
end --main
Выдает A_Size = 391, т.е. 391 месячных свечей. Если с графика сохранить данные в файл, то 292 месячных свечей.
Если посмотреть системные сообщения, то почему после июня 2010 идет май 2005?
Anton написал: Черт, отправилось раньше времени. У вас поток квика никогда ничего в таблицу не запишет, пока цикл while не закончится, а он не закончится, потому что пока вы из колбека не вернетесь, квик ничего в таблицах менять не будет.
Спасибо :-) Значит это относиться ко всем колбекам.
Зависает Quik при обработке событий в таблице, если прямо в функции сделать цикл на проверку изменения заявки.
Порядок действий. Запускаем скрипт - открывается окно. Двойной щелчок левой мыши по 1-й строчке таблицы - выставляется заявка Еще двойной левой мыши - должна сняться заявка, но квик виснет из-за цикла проверки заявки в функции KillOrder()
Код
Account = "7618xxx" -- Код счета
CLASS_CODE = "SPBFUT" -- Код класса
SEC_CODE = "VBZ9" -- Код инструмента
trans_id = os.time() -- Текущие дата и время в секундах хорошо подходят для уникальных номеров транзакций
IsRun = true
firstRun = 0 -- флаг первого запуска
flag = 0
function main()
while IsRun do
if firstRun==0 then
priceMin = getParamEx(CLASS_CODE, SEC_CODE, "PRICEMIN").param_value+0 -- Цена выставления заявки
CreateTable()
firstRun=1
end
SetTableNotificationCallback(t_id, Touch) --ждем двойного щелчка мыши, чтобы выставить заявку или удалить
end
end
function KillOrderS()
local N = getNumberOf("orders")-1
for i = N, 0 , -1 do
order = getItem("orders", i)
if order.account==Account and order.balance>0 and order.sec_code==SEC_CODE and order.flags==25 then
trans_id = os.time()
local tkill = {
["CLASSCODE"]=CLASS_CODE,
["SECCODE"]=SEC_CODE,
["ACTION"]="KILL_ORDER",
["ACCOUNT"]=Account,
["TRANS_ID"]=tostring(trans_id),
["ORDER_KEY"]=tostring(order.order_num)
}
local res=sendTransaction(tkill)
if res ~= '' then message('KillOrderS(): Ошибка отправки транзакции: '..res) else message('KillOrderS(): Транзакция отправлена') end
sleep(5000)
while getItem("orders", i).flags==25 do
message("flags = "..getItem("orders", i).flags)
sleep(1000)
end
end
end
end
function Touch(t_id, msg, par1, par2)
if msg==QTABLE_LBUTTONDBLCLK and par1==1 then
local On Off = "Off"
if flag==0 then
flag = 1
On Off = "On"
SetColor(t_id, 1, 1, RGB(0,255,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0));
TransOpenPos()
else
flag = 0
SetColor(t_id, 1, 1, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR);
KillOrderS()
end
SetCell(t_id, par1, par2, OnOff)
end
end
function CreateTable()
t_id = AllocTable(); -- Получает доступный id для создания
AddColumn(t_id, 1, "ХЗ", true, QTABLE_CACHED_STRING_TYPE, 7);
t = CreateWindow(t_id); -- Создаем
SetWindowCaption(t_id, "ХЗ"); -- Даем заголовок
SetWindowPos(t_id, 0, 0, 100, 100) -- Положение окна
InsertRow(t_id, -1); -- добавляем countLineFileSave строк
SetCell(t_id, 1, 1, tostring(flag))
end
function TransOpenPos()
trans_id = os.time()
local Transaction={
['TRANS_ID'] = tostring(trans_id), -- Номер транзакции
['ACCOUNT'] = Account, -- Код счета
['CLASSCODE'] = CLASS_CODE, -- Код класса
['SECCODE'] = SEC_CODE, -- Код инструмента
['ACTION'] = 'NEW_ORDER', -- Тип транзакции ('NEW_ORDER' - новая заявка)
['OPERATION'] = 'B', -- Операция ('B' - buy, или 'S' - sell)
['TYPE'] = 'L', -- Тип ('L' - лимитированная, 'M' - рыночная)
['QUANTITY'] = '1', -- Количество
['PRICE'] = tostring(priceMin) -- Цена
}
-- Отправляет транзакцию
local Res = sendTransaction(Transaction)
if Res ~= '' then message('TransOpenPos(): Ошибка отправки транзакции: '..Res) else message('TransOpenPos(): Транзакция отправлена') end
end
Andrey.R написал: Здравствуйте, поясните пожалуйста чему именно вы обучаете? Программированию? Или роботу, тогда в какой программе? А то 2 года назад вы на этом форуме спрашивали как посмотреть атрибуты файла
Столкнулся с проблемой: Если оставлять на ночь работающий Quik, то при остановке скрипта зависает Quik. Если приложение убить через диспетчер задач, то процесс info.exe все равно висит и его тоже нужно убивать. Если запускать и отключать скрипт в тот же день проблем не возникает. Долго читал данный форум, пришел к выводу что необходимо закрывать все потоки перед выходом из main(). Какие потоки нужно закрывать кроме ds:Close() ?
Недавно перешел с Qpile на LUA. Иногда при переконнекте выскакивает ошибка в строчке: if t[0].datetime.hour == nil or t[0].datetime.min == nil then
Строчка из этого блока:
Скрытый текст
-- ========= ПОЛУЧАЕМ ВРЕМЯ ПОСЛЕДНЕЙ СВЕЧИ ИНДИКАТОРА t = getCandlesByIndex (INDRI, 0, getNumCandles(INDRI)-1, 1); if t == nil then message("OHLC RILUA ",1) break end if t[0].datetime.hour == nil or t[0].datetime.min == nil then message("OHLC RILUA ",1) break end TIMECUR = 10000*t[0].datetime.hour+100*t[0].datetime.min