Задержка при тестировании

Задержка при тестировании
Atom
2/11/2019
eSKon


1. Как правильно получать информацию об исполненной заявке? Попытался сначала просто реализовать метод OnOrderChanged - событие никогда не срабатывает.
Подцепил его явно в конструкторе стратегии с Connector - стало приходить, но при этом цена исполнения 0. Понятно, что заявка была рыночная, но как мне узнать цену исполнения?
Реализовал метод OnNewMyTrade, вроде оттуда можно вытащить и цену исполнения и исходный ордер с состоянием правильным, но при этом при тестировании на истории на часовиках заявка исполняется через 4-5 свечек после размещения. Понятно, что за 5 часов ситуация меняется кардинально, и там в очереди уже другие заявки появляются. Может в предыдущей попытке тоже была эта проблема, когда OnOrderChanged делал, просто тогда не обратил внимание на это.
2. Немного непонятно с терминологией и наименованием полей. Мне нужно получить:
- количество свободных денег в портфеле
- количество бумаг в портфеле
- размер лота для конкретной бумаги (для истории очевидно это нужно устанавливать при создании Security, но какое поле?)
Откуда это всё брать и как оно называется?



Thanks: Fibo


1 2  >
eSKon

Avatar
Date: 2/12/2019
Reply


С данным вопросом частично разобрался, оказывается заявки не выполнялись потому-что я для Security установил VolumeStep, а заявки подавал некратные. Поэтому вопрос уже другой:
1. Я вообще правильно делаю устанавливая VolumeStep и подразумевая размер лота?
2. Если так, то почему у меня после исполнения нескольких заявок Position (это количество бумаг, правильно?) оказывается некратным - я ведь размер лота установил для бумаги, как неполный лот выполняется?
Thanks:

eSKon

Avatar
Date: 2/12/2019
Reply


Я уже и так наплодил тем, поэтому сюда же вопрос добавлю.
По какой причине заявка при тестировании на истории может быть отменена? Заявка по рынку, объём небольшой, но в какой-то момент заявка отменяется. В чём может быть дело?
Thanks:

eSKon

Avatar
Date: 2/13/2019
Reply


Тут поискал по форуму и нагел ответ, что заявка может быть отменена по причине отсутствия ликвидности. Но мне этот ответ ничего не говорит. Что это значит? В истории на свече полтора милиона объём торгов, как на заявку на объём 300, может не найтись продавца по рыночной цене? При этом после отмены отмены заявки, позиция показывает только исполненную часть (60), а денег не остается совсем, как будто заявка выполнена целиком. Возможно я не так смотрю деньги, но на вопросы как смотреть мне так никто и не ответил.
Thanks:

Support

Avatar
Date: 2/13/2019
Reply


Добрый день

Заявка может быть отвергнута системой, но не отменена. Отмена идёт только пользовательским кодом.
Thanks:

eSKon

Avatar
Date: 2/13/2019
Reply


Вот кусок лога:
2010/01/14 14:00:02.000| |MFS_SBERP@TQBR_test account|MONEY: 25323,460000000000000000000000, SECS: 0
2010/01/14 14:00:02.000| |MFS_SBERP@TQBR_test account|Регистрация новой Market (0x23B1E22) заявки на Buy с ценой 0 и объемом 340.
2010/01/14 14:00:02.000| |HistoryEmulationConnector|RegisterOrder: 0/ SBERP@TQBR test account Покупка Цена=0 Объем=340 Сост=None Бал=0 Сост=Market
2010/01/14 14:00:02.000| |HistoryEmulationConnector|New order: 12/ SBERP@TQBR test account Покупка Цена=0 Объем=340 Сост=Pending Бал=340 Сост=Market
2019/02/13 03:42:31.382| |SecurityMarketEmulator|Заявка 12 зарегистрирована.
2019/02/13 03:42:31.382| |SecurityMarketEmulator|Заявка 12. Исполнение объема 60 по цене 73,55.
2019/02/13 03:42:31.383| |SecurityMarketEmulator|Заявка 12 отменяется, так как является рыночной с неисполненным объемом 280.
2019/02/13 03:42:31.383| |SecurityMarketEmulator|Сделка 7 заявки 12 P=73,55 V=60.
2010/01/14 14:00:02.000| |HistoryEmulationConnector|Order changed: 12/5 SBERP@TQBR test account Покупка Цена=0 Объем=340 Сост=Done Бал=280 Сост=Market
2010/01/14 14:00:02.000| |MFS_SBERP@TQBR_test account|Новая позиция: (S#:SBERP@TQBR, Native:,Type:, test account)=60.
2010/01/14 14:00:02.000| |MFS_SBERP@TQBR_test account|Заявка 12 (0x23B1E22) больше не активна.
2010/01/14 14:00:02.000| |HistoryEmulationConnector|New own trade: 14.01.2010 14:00:02 +03:00 7 73,55 60 от заявки 12/5 SBERP@TQBR test account Покупка Цена=0 Объем=340 Сост=Done Бал=280 Сост=Market
2010/01/14 14:00:02.000| |MFS_SBERP@TQBR_test account|Trade: Done, Buy, 60
2010/01/14 14:00:02.000| |MFS_SBERP@TQBR_test account|Новая Buy сделка 7 по цене 73,55 на 60 заявки 12.
2010/01/14 15:00:05.000| |MFS_SBERP@TQBR_test account|MONEY: 322,020000000000000000000000, SECS: 60

строки вида "Trade: Done, Buy, 60" это мой лог из OnNewMyTrade
строки вида "MONEY: 322,020000000000000000000000, SECS: 60" это мой лог из CandleManager_Processing, код такой:

this.AddInfoLog("MONEY: {0}, SECS: {1}",
Portfolio.CurrentValue.GetValueOrDefault(0) - Portfolio.BlockedValue.GetValueOrDefault(0),
Position);


Во-первых откройте уже секрет - я правильно беру эти значения или нет?

Во-вторых по логам видно, что заявка таки отменена, но деньги при этом не вернулись. Как так?
Thanks:

eSKon

Avatar
Date: 2/13/2019
Reply


Попытался явно отменять заявку в такой ситуации - деньги всё равно не возвращаются. Что я не так делаю?
Thanks:

eSKon

Avatar
Date: 2/13/2019
Reply


Если никого не смущает, что я разговариваю сам с собой, то продолжу.
Сообщение об отмене заявки приходит из MarketEmulator.cs:

switch (order.TimeInForce)
{
case null:
case TimeInForce.PutInQueue:
{
order.Balance = leftBalance;

if (executions.Count > 0)
{
if (leftBalance == 0)
{
order.OrderState = OrderStates.Done;
this.AddInfoLog(LocalizedStrings.Str1164Params, order.TransactionId);
}

result.Add(ToOrder(time, order));
}

if (order.OrderType == OrderTypes.Market)
{
if (leftBalance > 0)
{
this.AddInfoLog(LocalizedStrings.Str1165Params, order.TransactionId, leftBalance);

order.OrderState = OrderStates.Done;
result.Add(ToOrder(time, order));
}
}

break;
}

сообщение 1165 из локализации
order.OrderState = OrderStates.Done; - это не отмена разве?
Ну пусть отмена, но где деньги? Почему они так и висят в блокированных?
Thanks:

Support

Avatar
Date: 2/14/2019
Reply


Пожалуйста, уточните, что подразумевается под фразой возврата? Вы имеете ввиду разблокировку денежных средств?
Thanks:

eSKon

Avatar
Date: 2/14/2019
Reply


Для начала хотелось бы получить ответы на вопросы, заданные уже раз 10:
Мне нужно получить:
- количество свободных денег в портфеле
- количество бумаг в портфеле
- размер лота для конкретной бумаги (для истории очевидно это нужно устанавливать при создании Security, но какое поле?)

Откуда взять это?

Далее:
почему не срабатывает OnOrderChanged?

Ну и наконец последний вопрос:
(зависит от того правильно ли я получаю количество свободных денег)
Поскольку получаю я это количество как
Portfolio.CurrentValue.GetValueOrDefault(0) - Portfolio.BlockedValue.GetValueOrDefault(0)
То очевидно именно разблокировка мне нужна, почему она не происходит при отмене заявки?
Thanks:

eSKon

Avatar
Date: 2/14/2019
Reply


Складывается ощущение, что я какие-то неприличные вопросы задаю, на которые цивилизованные люди не отвечают :)
Попробую поприличней сформулировать:
1. Как узнать сколько у меня свободных денег? Неблокированных, непотраченных, только тех, что в портфеле, без заёмных.
2. Как узнать сколько в портфеле купленных бумаг?
3. Как установить/получить размер лота? Как называется поле?
4. В каких случаях должен срабатывать OnOrderChanged и почему он у меня никогда не срабатывает? (тестировал только на истории)
5. Поможет ли мне решить проблему с отмененными заявками явное разбиение заявки на несколько?
Thanks:
1 2  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy