Добрый день. Функция getParamEx() возвращает таблицу Lua. В диагностике об ошибке явно сказано, 'попробуйте сравнить два значения таблицы'. Т.е. Вам нужно сделать, например, так:
Код
priceMax = getParamEx(KodClass,InstrumentKod,"PRICEMAX").param_value
priceMin= getParamEx(KodClass,InstrumentKod,"PRICEMIN").param_value
function trade()
if(tekPrice <= priceMin) then --20 строка error
...
Почитайте внимательно описание используемых Вами функций QLua в справке.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Nikolay Pavlov написал: Добрый день. Функция getParamEx() возвращает таблицу Lua. В диагностике об ошибке явно сказано, 'попробуйте сравнить два значения таблицы'. Т.е. Вам нужно сделать, например, так:
Код
priceMax = getParamEx (KodClass,InstrumentKod,"PRICEMAX").param_value
priceMin = getParamEx (KodClass,InstrumentKod,"PRICEMIN").param_value
function trade ()
if (tekPrice < = priceMin) then --20 строка error
.. .
Почитайте внимательно описание используемых Вами функций QLua в справке.
сделал так теперь выдает другую ошибку C:\Users\KILLER\Desktop\robot_intelect\param.lua:25: attempt to compare nil with number
Код
tekPrice=getParamEx(KodClass,InstrumentKod,"LAST").param_value
priceMax = getParamEx(KodClass,InstrumentKod,"PRICEMAX").param_value
priceMin= getParamEx(KodClass,InstrumentKod,"PRICEMIN").param_value
-- tekMarzha=
function trade()
if(tonumber(tekPrice)==nil or tonumber(priceMin) == nil or tonumber(priceMax))then
SetCell(TableID,2,4,"Не удалось получить цены с графика, нет соеденения с сервером!")
WriteToEndOfFile(LogFile,"Не удалось получить цены с графика, нет соеденения с сервером!")
end
if(tonumber(tekPrice) <= tonumber(priceMin) )then --20 строка error
transaction = {
ACCOUNT=TorShet,
CLIENT_CODE=KodClient,
TYPE="M",
TRANS_ID="7",
CLASSCODE=KodClass,
SECCODE=InstrumentKod,
ACTION="NEW_ORDER",
OPERATION="B",
PRICE=tostring(tekPrice),
QUANTITY=tostring(LotUp)
}
transaction.TRANS_ID = "12345"
sendTransaction(transaction)
elseif(tonumber(tekPrice) >= tonumber(priceMax))then
transaction = {
ACCOUNT=TorShet,
CLIENT_CODE=KodClient,
TYPE="M",
TRANS_ID="8",
CLASSCODE=KodClass,
SECCODE=InstrumentKod,
ACTION="NEW_ORDER",
OPERATION="S",
PRICE=tostring(tekPrice),
QUANTITY=tostring(LotUp)
}
transaction.TRANS_ID = "12345"
sendTransaction(transaction)
end
end
возможно функция не возвращает значения, т.к. были указаны некорректный код класса или инструмента, также можно смотреть на поле getParamEx(...).result
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Nikolay Pavlov написал: возможно функция не возвращает значения, т.к. были указаны некорректный код класса или инструмента, также можно смотреть на поле getParamEx(...).result
Алексей написал: Есть еще вопрос, существует ли параметр что бы считать минимум и максимум пред идущей свечи на графике
для доступа к свечкам можно использовать функцию getCandlesByIndex Что касается минимумов и максимумов, то чтобы их найти нужно с чем-то сравнивать, не совсем понятно, с чем нужно сравнивать значения
Выведите перед проблемным местом значения tonumber(tekPrice) и tonumber(priceMin), диагностика явно говорит, что одно из значений равно nil, т.е. Вы пытаетесь сравнить nil с числом и получаете ошибку. Напишите например так, чтобы точно определить с какими значениями работает оператор if:
Код
message(tostring(tonumber(tekPrice)))
message(tostring(tonumber(priceMin)))
if (tonumber(tekPrice) < tonumber(priceMin) ) then -- 25 строка
....
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Nikolay Pavlov написал: Выведите перед проблемным местом значения tonumber(tekPrice) и tonumber(priceMin), диагностика явно говорит, что одно из значений равно nil, т.е. Вы пытаетесь сравнить nil с числом и получаете ошибку. Напишите например так, чтобы точно определить с какими значениями работает оператор if:
Код
message (tostring(tonumber(tekPrice)))
message (tostring(tonumber(priceMin)))
if (tonumber(tekPrice) < tonumber(priceMin) ) then -- 25 строка
.. ..
Вы правы, Не получает цену последней сделки, возвращает nil, только не понятно почему
Нашел ошибку, исправил, спасибо за помощь, есть еще вопрос каким параметром можно получить "текущая чистая позиция" и вариационная маржа, и есть ли команда для закрытия всех сделок?
Алексей написал: Нашел ошибку, исправил, спасибо за помощь, есть еще вопрос каким параметром можно получить "текущая чистая позиция" и вариационная маржа, и есть ли команда для закрытия всех сделок?
Для получения Текущей чистой позиции и Вариационной маржи на срочном рынке используйте функцию getFuturesHolding() (формат использования смотрите в официальной справке). Что имеется ввиду под закрытием всех сделок, закрытие позиции?
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Алексей написал: Нашел ошибку, исправил, спасибо за помощь, есть еще вопрос каким параметром можно получить "текущая чистая позиция" и вариационная маржа, и есть ли команда для закрытия всех сделок?
текущая чистая позиция из позиции по клиенским счетам на срочном рынке
Алексей написал: Нашел ошибку, исправил, спасибо за помощь, есть еще вопрос каким параметром можно получить "текущая чистая позиция" и вариационная маржа, и есть ли команда для закрытия всех сделок?
Для получения Текущей чистой позиции и Вариационной маржи на срочном рынке используйте функцию getFuturesHolding() (формат использования смотрите в официальной справке). Что имеется ввиду под закрытием всех сделок, закрытие позиции?
Насколько мне известно, отдельной транзакции по закрытию позиции срочный рынок FORTS не предоставляет (если конечно имеется ввиду рынок FORTS). Но зная свою длинную/короткую позицию легко сформировать транзакцию на продажу/покупку по рыночной цене, что приведет к закрытию позиции.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
В скрипте не видно входных параметров. Проверяйте фирму, торговый счет, код инструмента. Наличие текущей чистой позиции в таблице позиций по клиентским счетам.
В скрипте не видно входных параметров. Проверяйте фирму, торговый счет, код инструмента. Наличие текущей чистой позиции в таблице позиций по клиентским счетам.
InstrumentKod = "SiZ7" -- код инструмента(бумаги) sec_code TorShet = "00000A" ---Торговый счет KodClient = "400000" --- Код клиента KodClass = "SPBFUT" --код класса firmid = "MC01300000" -- id фирмы (можно посмотреть в ограничение по клиенским счетам 'фирма') LotUp = 1 -- количество контрактов для покупки LotDown = 1 -- количество контрактов на продажу trailingSize = 100 -- размер трейлинг стопа
функция getFuturesHolding вызывается внутри функции obnov(), которая нигде в коде не используется. Либо в этом и есть причина, либо Вы опять привели не полный код скрипта. И Вы так и не представили скриншот таблицы позиций по клиентским счетам, на котором видно что данные которые Вы запрашиваете, действительно существуют.
функция getFuturesHolding вызывается внутри функции obnov(), которая нигде в коде не используется. Либо в этом и есть причина, либо Вы опять привели не полный код скрипта. И Вы так и не представили скриншот таблицы позиций по клиентским счетам, на котором видно что данные которые Вы запрашиваете, действительно существуют.
dofile(getScriptPath().."\\param.lua")
is_run = true ---переменная для повторения цикла LogFile = getScriptPath().."\\LogFile.txt"
function OnInit() -- выполняетя 1 раз перез запуском доп потока CreateTable() WriteToEndOfFile(LogFile,"Робот Запущен!") test()
end
function main()
while (is_run== true) do
DataTable() Time() obnov() --trade()
--ОСновные вычисления
end
end
function OnTrade(TradeX)
-----------ДЕЙСТВИЯ ПРИ ПОЯВЛЕНИИ НОВОЙ СДЕЛКИ
end
function OnOrder(OrderX) -----действия при появлении новой заявки end
function OnStopOrder()
---Действия при появлении стоп заявки. end
function OnStop()
message('Робот остановлен, все позиции по контрактам закрыты!') ----Действия При нажатии кновки ОСТАНОВИТЬ,(Закрытие всех сделок выход в лот 0) WriteToEndOfFile(LogFile,"Робот остановлен, все позиции по контрактам закрыты!") DestroyTable(TableID)
end
файл param.lua
dofile(getScriptPath().."\\Options.lua")
id_trans = 777 trans_id = id_trans + 1
function obnov() priceMax = getParamEx(KodClass,InstrumentKod,"PRICEMAX").param_value tekPrice = getParamEx(KodClass,InstrumentKod,"LAST").param_value priceMin= getParamEx(KodClass,InstrumentKod,"PRICEMIN").param_value --Lot= getFuturesHolding(firmid,TorShet,InstrumentKod,0).totalnet -- tekMarzha= end
function test()
local Transaction={
['TRANS_ID'] = tostring(trans_id), -- Номер транзакции ['ACCOUNT'] = TorShet, -- Код счета ['CLASSCODE'] = KodClass, -- Код класса ['SECCODE'] = InstrumentKod, -- Код инструмента ['ACTION'] = 'NEW_ORDER', -- Тип транзакции ('NEW_ORDER' - новая заявка) ['OPERATION'] = 'B', -- Операция ('B' - buy, или 'S' - sell) ['TYPE'] = 'L', -- Тип ('L' - лимитированная, 'M' - рыночная) ['QUANTITY'] = '1', -- Количество ['PRICE'] = tostring(tekPrice) -- Цена }
local Res = sendTransaction(Transaction)
end
-- function trade()
-- if(tonumber(tekPrice)==nil or tonumber(priceMin) == nil or tonumber(priceMax)==nil)then
-- SetCell(TableID,2,4,"Не удалось получить цены с графика, нет соеденения с сервером!") -- WriteToEndOfFile(LogFile,"Не удалось получить цены с графика, нет соеденения с сервером!")
function PutDataToTableInit() Clear(TableID) SetWindowCaption(TableID,"Робот ИНТЕЛЕКТ! Автор: Алексей Егоров.") SetWindowPos(TableID,100,200,888,100) -- Крдинаты 100,200,ширина и высота 888,100 InsertRow(TableID,1) -- вставка строки в таблицу InsertRow(TableID,2) InsertRow(TableID,3) SetColor(TableID,2,QTABLE_NO_INDEX,RGB(255,255,0),RGB(0,0,0),RGB(0,220,220),RGB(0,0,0)) SetColor(TableID,3,QTABLE_NO_INDEX,RGB(255,255,0),RGB(0,0,0),RGB(0,220,220),RGB(0,0,0)) end
function WriteToEndOfFile(sFile,sDataString) -- запись лог файла
local serverTime= GetInfoParam("SERVERTIME") local serverDate= GetInfoParam("TRADEDATE") sDataString = serverDate..":"..serverTime..":"..sDataString.."\n" local f = io.open(sFile,"r+") if(f==nil)then f = io.open(sFile,"w") end
if(f~=nil)then f:seek("end",0) f:write(sDataString) f:flush() f:close() end
InstrumentKod = "SiZ7" -- код инструмента(бумаги) sec_code TorShet = "SPBFUT00877" ---Торговый счет KodClient = "10632" --- Код клиента KodClass = "SPBFUT" --код класса firmid = "SPBFUT000000" -- id фирмы (можно посмотреть в ограничение по клиенским счетам 'фирма') LotUp = 1 -- количество контрактов для покупки LotDown = 1 -- количество контрактов на продажу trailingSize = 100 -- размер трейлинг стопа
Видим, что идет обращение к переменной Lot: SetCell(TableID,1,3,Lot) в то время, как сама переменная закомментирована: --Lot= getFuturesHolding(firmid,TorShet,InstrumentKod,0).totalnet
И рекомендуем переменную задать глобально, а не внутри функции, например вначале скрипта.