Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Обработка результат заявки #188

Closed
IFetisov opened this issue Apr 16, 2019 · 5 comments
Closed

Обработка результат заявки #188

IFetisov opened this issue Apr 16, 2019 · 5 comments
Labels
future-qlua-plus Features outside QLUA API but nice to have

Comments

@IFetisov
Copy link

Привет коллеги.
Подскажите как правильно обрабатывать результаты исполнения заявки. В комментариях написано FilledValue - сумма исполнено, но там всегда 0
Пытался написать что то такое. Но это никак не хочет взлетать :(
не получается узнать сумму.
void OnOrderDo(Order order)
if (order.Balance != WaitOrders[order.TransID].OrderBalance)
{
ExecutedVolume += (WaitOrders[order.TransID].OrderBalance - order.Balance);
if ((order.State == QuikSharp.DataStructures.State.Completed) ||
(order.State == QuikSharp.DataStructures.State.Canceled))
{
OrderedVolume -= order.Balance;
if (CleanWaits)
WaitOrders.Remove(order.TransID);
else
WaitOrders[order.TransID].OrderBalance = 0;
ExecutedVolumeAmount += (order.FilledValue - WaitOrders[order.TransID].BalanceValue);
WaitOrders[order.TransID].BalanceValue = order.FilledValue;
}
}

@Pr0phet1c
Copy link
Collaborator

Возможно, кто-то делает иначе, но я не пытаюсь получить сведения о сделке из заявки. Наиболее точные данные, по любой заявке, можно получить из таблицы сделок.

@IFetisov
Copy link
Author

Т.е. после каждой заявки нужно выкачивать таблицу сделок? В итоге так и сделал. Т.к. OnTrade работает не надежно и может прийти уже после того как исполнение заявки зафиксировано и нужно реагировать. Приходится перекачивать сделки.
Кстати в OnTrade периодически приходят сделки у которых TransID = 0 - втыкал такой костыль чтобы обойти и узнать к какой заявке относится сделка
while (trade.TransID == 0)
{
var trds = TradeViewModel.Quik.Trading.GetTrades(trade.ClassCode, trade.SecCode).Result;
trade = trds.FirstOrDefault(x => x.TradeNum == trade.TradeNum );
}

@Pr0phet1c
Copy link
Collaborator

Ну, тут каждый сам решает какой путь ему ближе.
Я в свое время вообще отказался от использования этих колбэков внутри робота из-за того, что на одно и тоже событие колбэк может приходить три раза подряд. Разработчики квика назвали это фичей, и сказали, что так оно и останется.
Обычно, я отслеживаю статус заявки, и как только заявка перестает быть активной - лезу в таблицу сделок и вытаскиваю оттуда все сделки по этой заявке. Ну а обработка этих данных уже дело техники.

@IFetisov
Copy link
Author

IFetisov commented Apr 16, 2019

Дайте плс подсказку как доработать луа скрипт get_trades - чтобы он принимал на вход дату или время - чтобы смотреть сделки после определенного времени. А то очень жестко все тормозит :(
function qsfunctions.get_trades(msg)
Попробывал так - вроде работает с приемлимой скоростью

   function qsfunctions.get_trades_time(msg)
if msg.data ~= "" then
	local spl = split(msg.data, "|")
	class_code, sec_code = spl[1], spl[2]
	datetime = { year  = spl[3],
                         month = spl[4],
                         day   = spl[5],
                         hour  = spl[6],
                         min   = spl[7],
                         sec   = spl[8]
       };
end

local trades = {}
for i = 0, getNumberOf("trades") - 1 do
	local trade = getItem("trades", i)
	if os.time(datetime) <= os.time(trade.datetime) and  trade.class_code == class_code and trade.sec_code == sec_code then
		table.insert(trades, trade)
	end
end
msg.data = trades
return msg

end

    public async Task<List<Trade>> GetTradesTime(string classCode, string secCode, TimeSpan timeFrom)
    {
        var response = await QuikService.Send<Message<List<Trade>>>(
            (new Message<string>(
                $"{classCode}|{secCode}|{DateTime.Now.Year}|{DateTime.Now.Month}|{DateTime.Now.Day}|{timeFrom.Hours}|{timeFrom.Minutes}|{timeFrom.Seconds}",
                "get_trades_time"))).ConfigureAwait(false);
        return response.Data;
    }

@Pr0phet1c
Copy link
Collaborator

Pr0phet1c commented Apr 16, 2019

  1. Если работает так как Вам надо - используйте и не заморачивайтесь.
  2. У Вас какое количество сделок в день? Сотни или тысячи? Если нет, то тормоза скорее всего связаны НЕ со скоростью работы функции по получению таблицы сделок. (Возможно, Вы пытаетесь получать эту таблицу слишком часто, в то время, когда это не требуется).
  3. Вы уверены, что Вам каждый раз надо получать всю таблицу сделок (пусть даже и ограниченную по времени)? Не пробовали использовать вот такую функцию: "Quik.Trading.GetTrades_by_OdrerNumber(long orderNum)" ? Мои роботы обычно "знают" какие заявки (с какими номерами) они выставляли, и соответственно, им нет смысла обрабатывать данные каких-либо других заявок.

@buybackoff buybackoff mentioned this issue May 14, 2019
3 tasks
@buybackoff buybackoff added the future-qlua-plus Features outside QLUA API but nice to have label May 14, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
future-qlua-plus Features outside QLUA API but nice to have
Projects
None yet
Development

No branches or pull requests

3 participants