Объясните, пожалуйста, один момент в коде.

Страницы: 1
RSS
Объясните, пожалуйста, один момент в коде.
 
Из функции OnTrade() я хочу узнать, активна ли заявка, для этого использую эту пользовательскую функцию:
if bit_set(TABLE_trade.flags, 0)==true then
--то есть, если в бите 0 флаг установлен, значит заявка активна
end

Теперь вопрос к этой функции.
function bit_set(flags,index)
local n=1
--Вопрос 1. Не могу догнать, зачем тут сдвигают бит влево (что это дает)?
n=bit.lshift(1,index)
if bit.band(flags,n)~=0 then
return true
else
return false
end
end
 
Для простоты посмотрим на четырехбитные числа. Пусть есть сборник флагов flags = 0b0010 и нам надо проверить, установлен ли бит с индексом 1 (второй бит то есть). Мы берем единицу 0b0001, сдвигаем влево до позиции интересующего бита (в примере на 1 бит, получаем 0b0010) и выполняем побитовую операцию AND с флагами: 0b0010 AND 0b0010 = 0b0010, результат не равен нулю, то есть TRUE. А если бит 1 не установлен, а установлен другой какой-то, пусть нулевой, т.е. flags = 0b0001, наша операция даст 0b0001 AND 0b0010 = 0b0000, результат равен нулю, то есть FALSE. А при проверке нулевого бита код тот же, просто сдвиг на 0 позиций делает ничего.
 
Цитата
Айдар написал:
Из функции OnTrade() я хочу узнать, активна ли заявка, для этого использую эту пользовательскую функцию:
if bit_set(TABLE_trade.flags, 0)==true then
--то есть, если в бите 0 флаг установлен, значит заявка активна
end
Мне кажется, что вы путаете сделку и заявку. Из OnTrade(trade) вы получаете информацию о сделке. Если вы хотите узнать что-то о заявке, которая эту сделку породила, то в общем как-то так можно:  
Код
 local order = getOrderByNumber (CLASS_CODE, trade.order_num)    -- получение таблицы данных из строки таблицы заявок с указанным номером заявки из таблицы сделок
   if order then
       if order.flags & 1 == 1 then                                    -- соответствующая заявка активна (исполнена частично)

         elseif order.flags & 2 == 0 then                              -- соответствующая заявка исполнена полностью

         else                                                          -- соответствующая заявка исполнена частично и снята

       end
   end
 
Айдар, Сдвигать, разумеется, незачем - любой бит можно проверить и без него. Например, я в OnTrade узнаю, покупка это или продажа:
if bit.band(n.flags,4)~=0 then...

А активность заявки я проверяю уже в таблице 'orders'
if bit.band(s.flags,1)~=0 then...
Это уже по таймеру, если заявка не исполнена (или частично исполнена), но всё-таки зарегистрирована (есть в таблице) и активна - значит, будем снимать через KILL_ORDER.

Игорь М, Нет, я тоже именно из OnTrade получаю информацию и о сделке, и о заявке, и о транзакции, никаких дополнительных телодвижений для этого не требуется.
 
Цитата
Владимир написал:
Игорь М, Нет, я тоже именно из OnTrade получаю информацию и о сделке, и о заявке, и о транзакции, никаких дополнительных телодвижений для этого не требуется.
Как вы получаете флаги для заявки из OnTrade?
 
Игорь М, Никак. А зачем они нужны? Если число лотов обнулилось, значит заявка исполнена, если нет - активна (прерывание же пришло), если в дальнейшем снимется по каким-то причинам, значит больше прерываний по ней не придёт, а когда будем снимать по таймеру, если на тот момент она будет ещё активна, получит KILL_ORDER.
 
Состояние заявки можно получить в колбеке OnOrder или найти в таблице ордеров запись по номеру ордера order_num (индекс записи можно запомнить).

Из таблицы сделок можно (а значит и из колбека OnTrade), конечно, но это на каждую сделку придется переходить в таблицу ордеров. Если ордер большой, то это уже может быть накладно.
Колбек OnOrder прямо вернет запись таблицы ордеров.

Владимир, заявки могут быть не на закрытие всей позиции.
 
Nikolay, Лично я пользоваться OnOrder не собираюсь - хватает того, что OnTrade приходят пачками на одно событие! И в таблицу ордеров заглядываю только для снятия несработавших заявок.

При чём тут вообще "закрытие всей позиции"? Я подаю заявки на то количество лотов, которое я в данный момент хочу купить или продать.
 
Цитата
Anton написал:
Для простоты посмотрим на четырехбитные числа. Пусть есть сборник флагов flags = 0b0010 и нам надо проверить, установлен ли бит с индексом 1 (второй бит то есть). Мы берем единицу 0b0001, сдвигаем влево до позиции интересующего бита (в примере на 1 бит, получаем 0b0010) и выполняем побитовую операцию AND с флагами: 0b0010 AND 0b0010 = 0b0010, результат не равен нулю, то есть TRUE. А если бит 1 не установлен, а установлен другой какой-то, пусть нулевой, т.е. flags = 0b0001, наша операция даст 0b0001 AND 0b0010 = 0b0000, результат равен нулю, то есть FALSE. А при проверке нулевого бита код тот же, просто сдвиг на 0 позиций делает  ничего .
Вот теперь понял, спасибо  
 
Цитата
Владимир написал: Никак. А зачем они нужны?
Для определения статуса заявки. Эти флаги для этого и сделаны.
Цитата
Владимир написал: Если число лотов обнулилось
Что вы имеете в виду?
 
Игорь М, То и имею в виду: статус заявки практически однозначно определяется информацией от сделки. Если я заказал 10 лотов, и у меня сделка на 10, то заявка исполнена. А если там, допустим, 8, то она активна, и будет исполнена, если уже в следующей сделке придут остальные 2 или две сделки по единичке. Или вообще больше ничего не придёт, заявка останется частично исполненной.
 
Цитата
Владимир написал:
Игорь М, То и имею в виду: статус заявки практически однозначно определяется информацией от сделки. Если я заказал 10 лотов, и у меня сделка на 10, то заявка исполнена. А если там, допустим, 8, то она активна, и будет исполнена, если уже в следующей сделке придут остальные 2 или две сделки по единичке. Или вообще больше ничего не придёт, заявка останется частично исполненной.
Я так и понял, но решил уточнить. Вы просто сквозь призму своей задачи смотрите, которая охватывает далеко не все случаи. Не всегда известен первоначальный объем выставленной заявки, её же и руками могут выставить, поэтому x-8=? Для этого случая я и писал.
 
Игорь М, Разумеется, "я просто сквозь призму своей задачи смотрю", поскольку перфекционист по натуре, и все хорошие решения должны непременно быть у меня. :smile:

Да, она пока что "охватывает далеко не все случаи" - новая версия должна охватить всё недостающее. Но и старая версия позволяла торговать "в режиме кентавра" - скрипт ведь знает, что сделка пришла не по его заявке, поэтому он учитывает её в своей бухгалтерии, но заявку не снимает - ему всё равно, какой там объём - он ловит только то, что реально сработало. Между прочим, в новой версии я "режим кентавра" как раз отменил. Сам я торгую через стакан дай бог раз в месяц - сервис самого скрипта даже для ручной торговли намного удобнее, но тут случилась забавная наводка: скрипт стал ловить сделки по заявкам другого скрипта, причём второй вообще работал на другой тачке. Поэтому учёт действий от "левой" торговли я ему запретил: не моё - пошли на!
 
Цитата
Владимир написал:
Да, она пока что "охватывает далеко не все случаи" - новая версия должна охватить всё недостающее.
Не охватит. Вы забываете, что народ занимается не только реализацией роботов, но и разработкой разных полуавтоматов с риск- мани-менеджментом, решений для проп-трейдинга, поддержкой групп клиентов и т.д. Вы же не собираетесь все это в свой скрипт запихивать.
 
Игорь М, Это я запихивать не собираюсь - мне же нужно именно лучшее, а не всё, что попало. На кой мне "полуавтоматы с риск- мани-менеджментом, решения для проп-трейдинга, поддержка групп клиентов и т.д."? Он деньги зарабатывает лучше, чем все эти "группы", включая меня, любимого.  :smile:  
Страницы: 1
Читают тему
Наверх