Вопрос по выставлению заявок
Atom
15.03.2012


Ситуация простая - хочу купить/продать по рынку и прикрыть позицию стопом. Для примера использую акции сбера.

Вариант №1
Покупаю по рынку обычным способом (с помощью маркет-заявки или лимитной заявки с большим отступом по цене), все ок. Тут же подписываюсь на событие исполнения заявки. Хочу получать событие один единственный раз, когда заявка исполнилась полностью.
Код

this.When(this.mainOrder.Matched().Do(OnMainOrderMatched).Once());

Все хорошо, заявка попала в систему, исполнилась, попадаем в OnMainOrderMatched. Здесь я хочу получить среднюю цену исполнения заявки, чтобы от этого уровня поставить стоп-лосс.
Код

decimal averagePrice = this.mainOrder.GetAveragePrice();

К сожалению, averagePrice остается всегда равной нулю. В КВИКе аналогичный подход дает правильный результат, averagePrice равен цене исполнения заявки.

Ок, раз так не получается, можно проверить, когда заявка исполнилась и все ее поля стали заполнены. Подписываюсь на правило, отслеживающее появление новых сделок по заявке
Код

this.When(mainOrder.NewTrades()).Do(OnNewOrderTrades).Once();

далее в OnNewOrderTrades
Код

if ((this.mainOrder != null) && (this.mainOrder.Id == myTrades.Last().Order.Id))
{
	OnMainOrderMatched();
}

Тогда в OnMainOrderMatched уже имеем averagePrice соответствующую действительности.

Но данный подход меня смущает тем, что ловить событие Once не правильно, поскольку заявка может исполниться частями. А Periodical - тогда надо городить сложную логику для стопов с учетом исполнения заявки по частям.


Переходим к Варианту №2
Благодаря разработчикам S# существует более простой способ выставления заявок и прикрытия их стопами, через котирование и дочерние стратегии. Но сразу же наталкиваюсь на проблему с выставлением рыночной заявки через котирование - у заявки отбрасывается дробная часть и заявка появляется в системе по 101.00 или по 102.00, хотя реальная цена колеблется в этом промежутке с сотыми долями.
Это происходит и у меня, и в проекте-примере.


Возникает вопрос - кто как справляется с данной задачей в СмартКОМе?

Теги:


Спасибо:


1 2  >
Mikhail Sukhov

Фотография
Дата: 15.03.2012
Ответить


Daenur Перейти
А Periodical - тогда надо городить сложную логику для стопов с учетом исполнения заявки по частям.


А в чем сложность?

Daenur Перейти

у заявки отбрасывается дробная часть и заявка появляется в системе по 101.00 или по 102.00, хотя реальная цена колеблется в этом промежутке с сотыми долями.


Сбер? Нужно больше информации. С какими параметрами запускается котирование и какое именно.
Спасибо:

Daenur

Фотография
Дата: 15.03.2012
Ответить


Сложность в учете уже исполнившегося объема и переставлении стопов под новый объем. Чем больше действий - тем больше вероятность ошибки. Проще и надежней поставить один стоп на весь объем заявки сразу по ее исполнению.


Котирование - как в примере SampleSmartSMA
Код

_trader.NewSecurities += securities => this.GuiAsync(() =>
{
// находим нужную бумагу
var lkoh = securities.FirstOrDefault(s => s.Id == "Сбербанк России ОАО ао@EQBR");

if (lkoh != null)
{
	_lkoh = lkoh;
	this.GuiAsync(() =>
	{
		Start.IsEnabled = true;
	});
}
});

...

// создаем торговую стратегию
_strategy = new SmaStrategy(_candleManager, longSma, shortSma, _timeFrame)
{
	Volume = 1,
	Security = _lkoh,
	Portfolio = Portfolios.SelectedPortfolio,
	Trader = _trader,
};

...

// запускаем процесс получения стакана, необходимый для работы алгоритма котирования
_trader.RegisterQuotes(_strategy.Security);
Спасибо:

Mikhail Sukhov

Фотография
Дата: 15.03.2012
Ответить


Это у нас такие идентификаторы в Смарте? Можно как-то лог привести работы котирования?
Спасибо:

Daenur

Фотография
Дата: 15.03.2012
Ответить


Ага. Конечно, если взять (lkoh.ExtensionInfo)).Items[0] можно получить нормальный идентификатор {[SecuritySmartId, SBER]}


Сразу после создания подписался на событие
Код

_trader.Log += new Action<LogMessage>(_trader_Log);

Но после начала котирования логи по этому событию не пишутся. Если подскажете какой лог и как привести - сделаю.

Собственно стакан получается нормально, данные идут.

upd. Сейчас прикручу logManager, посмотрю, что в него идет...
log.txt 16 KB (211)
Спасибо:

Mikhail Sukhov

Фотография
Дата: 15.03.2012
Ответить


Daenur Перейти
Если подскажете какой лог и как привести - сделаю.


Тот участок, который покажет, что не так с ценами. ГОСТ-а нет.[biggrin]
Спасибо:

Daenur

Фотография
Дата: 15.03.2012
Ответить


Прикрутил
Код

_logManager.Sources.Add(_strategy);
_logManager.Sources.Add(_trader);

сразу после создания объектов. Собствено файл с логом прикрепил к предыдущему своему сообщению. Увы, не вижу там строки о том, почему цена неверно рассчитывается. [blush]
Спасибо:

Mikhail Sukhov

Фотография
Дата: 15.03.2012
Ответить


А чему равен Security.MinStepSize + Decimals? Особенно интересна ситуация с идентификаторами, которые у нас, кстати, правильные, тоесть SBER@EQBR. Думаю, все данные по инструментам поехали. Может у вас смарт ком старый?
Спасибо:

Daenur

Фотография
Дата: 15.03.2012
Ответить


Security.MinStepPrice = 1
Security.MinStepSize = 2
Security.Decimals = 0

SmartCOM последний, с их сайта, недавно обновился. На предпоследней версии та же самая фигня была.
Спасибо:

Alexander

Фотография
Дата: 15.03.2012
Ответить


а версия S#?
Спасибо:

Daenur

Фотография
Дата: 15.03.2012
Ответить


StockSharp 4.0.22

Михаил, может, есть возможность дать мне исходники всего проекта? Так бы я мог разбираться с проблемами, не обращаясь к Вам по пустякам. А то и я не могу понять в чем дело, и Вас напрягаю. Какая-то "угадайка" получается сильно растянутая по времени...
Спасибо:
1 2  >

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy