Из функции 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 получаю информацию и о сделке, и о заявке, и о транзакции, никаких дополнительных телодвижений для этого не требуется.
Игорь М, Никак. А зачем они нужны? Если число лотов обнулилось, значит заявка исполнена, если нет - активна (прерывание же пришло), если в дальнейшем снимется по каким-то причинам, значит больше прерываний по ней не придёт, а когда будем снимать по таймеру, если на тот момент она будет ещё активна, получит 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=? Для этого случая я и писал.
Игорь М, Разумеется, "я просто сквозь призму своей задачи смотрю", поскольку перфекционист по натуре, и все хорошие решения должны непременно быть у меня.
Да, она пока что "охватывает далеко не все случаи" - новая версия должна охватить всё недостающее. Но и старая версия позволяла торговать "в режиме кентавра" - скрипт ведь знает, что сделка пришла не по его заявке, поэтому он учитывает её в своей бухгалтерии, но заявку не снимает - ему всё равно, какой там объём - он ловит только то, что реально сработало. Между прочим, в новой версии я "режим кентавра" как раз отменил. Сам я торгую через стакан дай бог раз в месяц - сервис самого скрипта даже для ручной торговли намного удобнее, но тут случилась забавная наводка: скрипт стал ловить сделки по заявкам другого скрипта, причём второй вообще работал на другой тачке. Поэтому учёт действий от "левой" торговли я ему запретил: не моё - пошли на!
Владимир написал: Да, она пока что "охватывает далеко не все случаи" - новая версия должна охватить всё недостающее.
Не охватит. Вы забываете, что народ занимается не только реализацией роботов, но и разработкой разных полуавтоматов с риск- мани-менеджментом, решений для проп-трейдинга, поддержкой групп клиентов и т.д. Вы же не собираетесь все это в свой скрипт запихивать.
Игорь М, Это я запихивать не собираюсь - мне же нужно именно лучшее, а не всё, что попало. На кой мне "полуавтоматы с риск- мани-менеджментом, решения для проп-трейдинга, поддержка групп клиентов и т.д."? Он деньги зарабатывает лучше, чем все эти "группы", включая меня, любимого.