Активные-снятые заявки

Страницы: 1
RSS
Активные-снятые заявки
 
Добрый день.
Снятая заявка имеет параметр 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, то она снята?
Спасибо.

нет т.к. заявка может быть снята в полночь.
правильней проверять флаги
 
Сергей, а какие проблемы могут возникнуть при такой проверке:
Код
if t.flags==30 then
считать заявку снятой
end 
 
чтобы избежать ошибок при проверке в полночь можно брать год
year=1601
такое бывает только у неснятых заявок
 
Николай, расскажите о вашей функции подробнее. Как ею пользоваться.
 
Цитата
Let_it_go написал:
Сергей, а какие проблемы могут возникнуть при такой проверке:
Код
   if  t.flags =  =  30   then 
считать заявку снятой
 end    

Могут быть такие что у разных снятых заявок десятичное представление будет разным и проверка не сработает
 
Цитата
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
 
Господа, если можно проще.
Есть заявка с номером 28342011321
Как мне узнать, она активная, снятая или исполненная?
 
Цитата
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
 
что делает цифра 30?
Это номер заявки из таблицы "orders"?
 
Цитата
Nikolay Pavlov написал:
Цитата
В какой момент Вы хотите проверять состояние заявки? В момент ее получения (т.е. при вызове onOrder()) или просто когда Вы ее достаете из хранилища функцией getItem()?
getItem() из таблицы заявок
 
Цитата
Let_it_go написал:
что делает цифра 30?
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
 
Спасибо. Разобрался.
Надеюсь, это сложно потому что так надо, а не потому что не смогли сделать проще.
 
В догонку к https://forum.quik.ru/messages/forum10/message27311/topic996/#message27311 ,

полскажите, какие флаги активны у частично исполненной заявки? Флаг 0 имеет значение 1 ?
 
Добрый день.
При работе с частично исполненной заявкой помимо флагов нужно еще учитывать поле 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 смотрите в документации, раздел 'Функции для работы с битовыми масками в структурах данных'):
Спасибо большое! Очень удобная функция.
Страницы: 1
Читают тему
Наверх