Как работать с битовыми флагами?

Страницы: 1
RSS
Как работать с битовыми флагами?, Как получить бит из битогового флага?
 
Код
function CntTradesSellPosition(zCLASSCODE,zSECCODE)
cnt=0
   local TableName='trades'
   local rows_total = getNumberOf(TableName)
   for r=rows_total-1, 0, -1  do
      local table_row=getItem(TableName,r)
      --message(tostring(table_row.flags));stop()
      if table_row.class_code==zCLASSCODE and table_row.sec_code==zSECCODE and table_row.flags==36 then -- сделка продажа
         cnt=cnt+1
      end
   end
return cnt
end

Пишу как самоучка, но мне как-то сложно (невозможно) вытаскивать из битовых флагов эти нужные значения, которые там закодированы в двоичной системе.
В частности мне нужно определить только тип заявки ордера Buy или Sell.

Я так и не нашёл нигде пример алгоритма получения этих битовых значений, поэтому беру 10-тичные числа, но это кривовато, ибо по причине изменения других свойств и числа будут другие.
Вот я методом научного тыка определил коды для продаж  и второй флаг (бит) принимает разные значения:
64 = 1000000
36 = 100100
28 = 11100
1048604 = 100000000000000011100 - Продажа от стоплосса

Прошу, измените мой код, чтобы он нормально обрабатывал эти битовые флаги.
 
if bit.band(table_row.flags,0x4)~=0 then --если заявка на продажу иначе на покупку
 
Цитата
awkozlov написал:
Код
   function   CntTradesSellPosition (zCLASSCODE,zSECCODE)
cnt =  0 
    local  TableName =  'trades' 
    local  rows_total  =   getNumberOf (TableName)
    for  r = rows_total -  1 ,  0 ,  -  1    do 
       local  table_row =  getItem (TableName,r)
       --message(tostring(table_row.flags));stop() 
       if  table_row.class_code =  = zCLASSCODE  and  table_row.sec_code =  = zSECCODE  and  table_row.flags =  =  36   then   -- сделка продажа 
         cnt = cnt +  1 
       end 
    end 
 return  cnt
 end   

Пишу как самоучка, но мне как-то сложно (невозможно) вытаскивать из битовых флагов эти нужные значения, которые там закодированы в двоичной системе.
В частности мне нужно определить только тип заявки ордера Buy или Sell.

Я так и не нашёл нигде пример алгоритма получения этих битовых значений, поэтому беру 10-тичные числа, но это кривовато, ибо по причине изменения других свойств и числа будут другие.
Вот я методом научного тыка определил коды для продаж  и второй флаг (бит) принимает разные значения:
64 = 1000000
36 = 100100
28 = 11100
1048604 = 100000000000000011100 - Продажа от стоплосса

Прошу, измените мой код, чтобы он нормально обрабатывал эти битовые флаги.

В документации в скобках указано значение в 16 формате для каждого бита (до 8 это тоже самое что и в 10 формате)
если надо несколько бит то складывайте эти значения
Флаги для таблиц «Заявки», «Заявки на внебиржевые
сделки»

Флаг установленЗначение
бит 0 (0x1) Заявка активна, иначе – не активна
бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то  заявка исполнена
бит 2 (0x4) Заявка на продажу, иначе – на покупку
бит 3 (0x8) Заявка лимитированная, иначе – рыночная
бит 4 (0x10) Исполнить заявку по разным ценам
бит 5 (0x20) Исполнить заявку немедленно или снять (FILL OR KILL)
бит 6 (0x40) Заявка маркет-мейкера. Для адресных заявок – заявка отправлена контрагенту  
бит 7 (0x80) Скрытая заявка
бит 8 (0x100) Снять остаток
бит 9 (0x200) Айсберг-заявка
бит 10 (0x400) Заявка отклонена торговой системой
бит 20 (0x100000) Поле «linkedorder» заполняется номером стоп-заявки

 
Игорь Б, в документации LUA сказано:
Цитата
Библиотека bit32 стала нежелательной. Легко загрузить совместимую внешнюю библиотеку или лучше заменить её функции соответствующими битовыми операторами. (Помните, что bit32 оперирует с 32-битными целыми, а битовые операторы Lua 5.3 оперируют с целыми Lua, которые по умолчанию имеют 64 бита.)
Так что ваш вариант хоть и рабочий, но использовать его не рекомендуется.

У меня, например, проверка происходит примерно так:
Код
if(tbl['flags']>>2&1==1)then
  -- Продажа (бит 2 равен 1)
else
  -- Покупка (бит 2 равен 0)
end
 
Цитата
awkozlov написал:
Код
   function   CntTradesSellPosition (zCLASSCODE,zSECCODE)
cnt =  0 
    local  TableName =  'trades' 
    local  rows_total  =   getNumberOf (TableName)
    for  r = rows_total -  1 ,  0 ,  -  1    do 
       local  table_row =  getItem (TableName,r)
       --message(tostring(table_row.flags));stop() 
       if  table_row.class_code =  = zCLASSCODE  and  table_row.sec_code =  = zSECCODE  and  table_row.flags =  =  36   then   -- сделка продажа 
         cnt = cnt +  1 
       end 
    end 
 return  cnt
 end   

Пишу как самоучка, но мне как-то сложно (невозможно) вытаскивать из битовых флагов эти нужные значения, которые там закодированы в двоичной системе.
В частности мне нужно определить только тип заявки ордера Buy или Sell.

Я так и не нашёл нигде пример алгоритма получения этих битовых значений, поэтому беру 10-тичные числа, но это кривовато, ибо по причине изменения других свойств и числа будут другие.
Вот я методом научного тыка определил коды для продаж  и второй флаг (бит) принимает разные значения:
64 = 1000000
36 = 100100
28 = 11100
1048604 = 100000000000000011100 - Продажа от стоплосса

Прошу, измените мой код, чтобы он нормально обрабатывал эти битовые флаги.

Отвечу, если кому-то еще актуально.
Есть отдельный набор функций "Функции для работы с битовыми масками в структурах данных". В документации по QLUA, обычно идет в комплекте с терминалом.
Для проверки статуса/состояния нужного флага, используется функция "BOOLEAN bit.test(NUMBER х, NUMBER n)". И код приобретает простой вид:


function CntTradesSellPosition(zCLASSCODE,zSECCODE)cnt=0
  local TableName='trades'
  local rows_total = getNumberOf(TableName)
  for r=rows_total-1, 0, -1  do
     local table_row=getItem(TableName,r)
     --message(tostring(table_row.flags));stop()
     if table_row.class_code==zCLASSCODE and table_row.sec_code==zSECCODE and bit.test(table_row.flags, 2) then -- сделка продажа
        cnt=cnt+1
     end
  end
return cnt
end
Страницы: 1
Читают тему
Наверх