Добрый день. Снятая заявка имеет параметр flags=30 Исполненная заявка имеет параметр flags=28
Как узнать флаги других состояний заявки? Например частично снятая? Из мануала ничего не понятно.
Второй вопрос. У снятой заявки запись такая withdraw_datetime={week_day=4;hour=11;ms=507;mcs=507000;day=2;month=11;sec=8;year=2017;min=58;} У заявки, которая не снималась, эта запись такая: withdraw_datetime={week_day=1;hour=0;ms=0;mcs=0;day=1;month=1;sec=0;year=1601;min=0;}
является ли это исчерпывающей характеристикой снятости-неснятости? ну например если hour==0, то заявка НЕ снятая, а если hour>0, то она снята? Спасибо.
Добрый день. Когда-то для себя писал вот такую функцию, думаю этот пример поможет Вам разобраться как работать с битами (описание функции bit.test смотрите в документации, раздел 'Функции для работы с битовыми масками в структурах данных'):
Код
function Flags2Table(flags, qtableName)
local t={}
if qtableName == "orders" or qtableName == "trades" or qtableName == "neg_deals" or qtableName == "neg_trades" or qtableName == "neg_deal_reports" then
if bit.test(flags, 0) then
t["sate"] = "Активна"
elseif bit.test(flags, 1) then
t["sate"] = "Снята"
else
t["sate"] = "Исполнена"
end
if bit.test(flags, 2) then
t["operation"] = "Продажа"
t["operationBS"] = "S"
else
t["operation"] = "Купля"
t["operationBS"] = "B"
end
if bit.test(flags, 3) then
t["type"] = "Лимитированная"
t["typeLM"] = "L"
else
t["type"] = "Рыночная"
t["typeLM"] = "M"
end
if bit.test(flags, 5) then
t["FILL_OR_KILL"] = 1
else
t["FILL_OR_KILL"] = 0
end
if bit.test(flags, 8) then
t["KILL_BALANCE"] = 1
else
t["KILL_BALANCE"] = 0
end
if bit.test(flags, 9) then
t["iceberg"] = 1
else
t["iceberg"] = 0
end
elseif qtableName == "all_trades" then
if bit.test(flags, 0) then
t["operation"] = "Продажа"
elseif bit.test(flags, 1) then
t["operation"] = "Купля"
else
t["operation"] = ""
end
elseif qtableName == "stop_orders" then
if bit.test(flags, 0) then
t["sate"] = "Активна"
elseif bit.test(flags, 1) then
t["sate"] = "Снята"
else
t["sate"] = "Исполнена"
end
if bit.test(flags, 2) then
t["operation"] = "Продажа"
t["operationBS"] = "S"
else
t["operation"] = "Купля"
t["operationBS"] = "B"
end
if bit.test(flags, 3) then
t["type"] = "Лимитированная"
t["typeLM"] = "L"
else
t["type"] = "Рыночная"
t["typeLM"] = "M"
end
else
return nil
end
return t
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Let_it_go написал: Снятая заявка имеет параметр flags=30 Исполненная заявка имеет параметр flags=28
некорректно проверять флаги в десятичном виде, проверять следует в шестнадцатеричном. Для этого есть функции bit Например как указано выше
Цитата
Let_it_go написал: является ли это исчерпывающей характеристикой снятости-неснятости? ну например если hour==0, то заявка НЕ снятая, а если hour>0, то она снята? Спасибо.
нет т.к. заявка может быть снята в полночь. правильней проверять флаги
Sergey Gorokhov написал: некорректно проверять флаги в десятичном виде, проверять следует в шестнадцатеричном.
Немного поправлю, чтобы человек окончательно не запутался. flags=30 это значение в десятичной системе счисления, а флаги это значение бита в определенной позиции числа в двоичной системе счисления, так, например, если число 30 в двоичной системе счисления будет иметь вид 00011110, значения чисел в соответствующей позиции и смотрим (справа на лева, нумерация с 0). Собственно функция bit.test и дает возможность легко проверить значение бита в позиции: bit.test(30, 0)=False bit.test(30, 1)=True bit.test(30, 2)=True bit.test(30, 3)=True bit.test(30, 4)=True bit.test(30, 5)=False bit.test(30, 6)=False bit.test(30, 7)=False
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Let_it_go написал: Николай, расскажите о вашей функции подробнее. Как ею пользоваться.
Код
table_flags = Flags2Table(30, 'orders')
в переменную table_flags запишется Lua таблица {typeLM<L> type<Лимитированная> KILL_BALANCE<0> FILL_OR_KILL<0> operation<Продажа> operationBS<S> iceberg<0> sate<Снята>}, как работать с таблицей Lua думая знаете...
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Let_it_go написал: Есть заявка с номером 28342011321 Как мне узнать, она активная, снятая или исполненная?
В какой момент Вы хотите проверять состояние заявки? В момент ее получения (т.е. при вызове onOrder()) или просто когда Вы ее достаете из хранилища функцией getItem()?
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
В какой момент Вы хотите проверять состояние заявки? В момент ее получения (т.е. при вызове onOrder()) или просто когда Вы ее достаете из хранилища функцией getItem()?
30 это значение поля flags на заявке. Так будет понятней?
Код
order = getItem('orders', 1)
flags_as_table = Flags2Table(order.flags, 'orders')
if flags_as_table.sate == "Снята" then
message("Заявка " .. tostring(order.order_num) .. " снята")
elseif lags_as_table.sate == "Активна" then
message("Заявка " .. tostring(order.order_num) .. " активна")
else
message("Заявка " .. tostring(order.order_num) .. " исполнена")
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Добрый день. При работе с частично исполненной заявкой помимо флагов нужно еще учитывать поле balance на заявке, сравнивая с полем qty на заявке, если order.balance < order.qty, значит заявка частично исполнена, но частично исполненная заявка может быть как активной (т.е. нулевой бит флага = 1), так и снятой (т.е. первый бит флага = 1). При полностью исполненной заявке нулевой бит флага = 0, первый бит флага = 0. Подведем итог:
Код
if bit.test(order.flags,0) == true AND order.balance ~= 0 AND order.balance < order.qty then message('Заявка активна и частично исполнена') end
if bit.test(order.flags,1) == true AND order.balance ~= 0 AND order.balance < order.qty then message('Заявка снята и частично исполнена') end
if bit.test(order.flags,0) == true and bit.test(order.flags,1) == true then message('Заявка полностью исполнена') end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
if bit.test(order.flags,0) == true AND order.balance ~= 0 AND order.balance < order.qty then message('Заявка активна и частично исполнена') end
if bit.test(order.flags,1) == true AND order.balance ~= 0 AND order.balance < order.qty then message('Заявка снята и частично исполнена') end
if bit.test(order.flags,0) == false AND bit.test(order.flags,1) == false then message('Заявка полностью исполнена') end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Nikolay Pavlov написал: Добрый день. Когда-то для себя писал вот такую функцию, думаю этот пример поможет Вам разобраться как работать с битами (описание функции bit.test смотрите в документации, раздел 'Функции для работы с битовыми масками в структурах данных'):