проскальзывание
Atom Ответить
18.03.2010


делаю так
var order = base.CreateOrder(direction,
base.Security.GetMarketPrice(direction, MarketPriceTypes.Following),
base.Volume);
// регистрируем ее (обычным способом лимитированной
заявкой)
//base.Trader.RegisterOrder(order);

// добавляем зарегистрированную заявку в стратегию
base.AddOrder(order);

// регистрируем на котирование
var strategy = new MarketQuotingStrategy(base.Trader,
order, base.Interval, false, MarketPriceTypes.Following, new Unit());
strategy.Start();
base.ChildStrategies.Add(strategy);
вылетает это

2010-03-18T14:10:16.8750000+03:00 [0] None => Quoting new order Buy
price 1720,99 volume 1
2010-03-18T14:10:17.9531250+03:00 [0] Error =>
System.ArgumentException: An item with the same key has already been
added.
at System.ThrowHelper.ThrowArgumentException(ExceptionResource
resource)
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue
value, Boolean add)
at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue
value)
at Ecng.Collections.SynchronizedDictionary`2.Add(K key, V value)
at Ecng.Trading.Algo.BasePositionManager.RegisterPosition(Order
order)
at Ecng.Trading.Algo.StrategyPositionManager.OnNewOrder(Order
order)
at System.Action`1.Invoke(T obj)
at Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T
arg)
at Ecng.Trading.Algo.Strategy.AddOrder(Order order)
at Ecng.Trading.Algo.Strategy. (Order )
at System.Action`1.Invoke(T obj)
at Ecng.Common.DelegateHelper.SafeInvoke[T](Action`1 handler, T
arg)
at Ecng.Trading.Algo.Strategy.AddOrder(Order order)
at Ecng.Trading.Algo.QuotingStrategy.OnProcess()
at Ecng.Trading.Algo.Strategy.Process()

т.е. уже есть, надо убрать выражение base.AddOrder(order);
а без него было так

https://docs.google.com/leaf?id=0Bw2gQDvf41vtOWIzZjIwM2EtMjI2ZS00ZDcwLTg0NjktZjRjN2VjMWJiNzIy&sort=name&layout=list&num=50

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

Значит надо самому корректировать через
base.SlippageManager.RegisterOrder(myOrder, newEstimatedPrice); ?

вывод проскальзывания делаю так
private void OnStrategyPropertyChanged(object sender,
PropertyChangedEventArgs e)
{
this.Sync(() =>
{
this.Status.Content = _strategy.ProcessState;
//this.PnL.Content = _strategy.PnL;
//this.Slippage.Content = _strategy.Slippage;
this.PnL.Content = _strategy.PnLManager.AbsoluteValue;
this.Slippage.Content =
_strategy.SlippageManager.Slippage;
this.Position.Content =
_strategy.PositionManager.Position;
});
}


Теги:


Спасибо:




10 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.03.2010
Ответить


Так, а если просто не вызывать AddOrder?

Спасибо:

denis

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


Уже сделано :) Ссылка в первом посте указывает на результат без
base.AddOrder(order);
т.е. проскальзывание равно нулю.

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.03.2010
Ответить


Проскальзование фиксируется по сделкам. Сделки были? И оно показывало
0?

Спасибо:

denis

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


Михал, я без претензий. Просто не понятно как оно работает.
Было несколько заявок, потом сделка купли. Все. Тут можно рассчитать
проскальзывание или нужно закрыть куплю и потом считать?

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.03.2010
Ответить


Да я тоже без претензий =) Пытаюсь выяснить все детально.

Проскальзывание работает след. образом в котировании. Регистрируется
первоначальная цена сделки (тоесть по рынку). Далее, цены послед
сделок игнорируются. Затем, когда получаются сделки по послед заявкам,
высчитывается проскальзывание с учетом цены первой заявки. Это в
теории. На практике, судя по всему не так. Как вариант,
TradeHelper.GetSlippage(MyTrade, estimatePrice); пока не разберемся.
Готовы к новой промежуточной версии? =)

Спасибо:

denis

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


Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 18.03.2010
Ответить


1. Заявки, конечно же.
2. Насчет одной сделки и нескольких заявок. Нет, не будет котировщик
считать проскальзывание правильно. Не добавил я в него данный
механизм. Доделаю, и отправлю тестовую версию.
3. Насчет первоначальной ошибки. Судя по коду, все нормально нужно
именно до котирования регистрировать заявку. Она нормально
зарегистрировалась? Можно прислать логи котировщика?

Спасибо:

denis

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


код такой:

// создаем заявку
var order = base.CreateOrder(direction,
base.Security.GetMarketPrice(direction, MarketPriceTypes.Following),
base.Volume);
// регистрируем ее (обычным способом лимитированной
заявкой)
base.Trader.RegisterOrder(order);

// добавляем зарегистрированную заявку в стратегию
base.AddOrder(order);

// регистрируем на котирование
var strategy = new MarketQuotingStrategy(base.Trader,
order, base.Interval, false, MarketPriceTypes.Following, new Unit());
strategy.Start();
base.ChildStrategies.Add(strategy);

логи:

2010-03-19T10:47:33.4531250+03:00 [0] None => Quoting renewing order
Buy with id 956757318 price 1712,02 volume 1 transaction 1
2010-03-19T10:47:34.2031250+03:00 [0] None => Quoting renewed order
Buy with id 956757441 price 1712,06 volume 1 transaction 2
2010-03-19T10:47:35.0781250+03:00 [0] None => Quoting renewing order
Buy with id 956757441 price 1712,06 volume 1 transaction 2
2010-03-19T10:47:36.4531250+03:00 [0] None => Quoting renewed order
Buy with id 956757686 price 1712,08 volume 1 transaction 3
2010-03-19T10:47:36.9062500+03:00 [0] None => Quoting renewing order
Buy with id 956757686 price 1712,08 volume 1 transaction 3
2010-03-19T10:47:38.2500000+03:00 [0] None => Quoting renewed order
Buy with id 956757857 price 1712,14 volume 1 transaction 4
2010-03-19T10:47:43.9375000+03:00 [0] None => Quoting renewing order
Buy with id 956757857 price 1712,14 volume 1 transaction 4
2010-03-19T10:47:44.7812500+03:00 [0] None => Quoting renewed order
Buy with id 956758519 price 1712,79 volume 1 transaction 5
2010-03-19T10:47:45.0937500+03:00 [0] None => Quoting renewing order
Buy with id 956758519 price 1712,79 volume 1 transaction 5
2010-03-19T10:47:45.1718750+03:00 [0] Error =>
System.ArgumentException: Заявка по транзакции 'CLASSCODE=EQBR;
SECCODE=LKOH; TRANS_ID=5; ACTION=KILL_ORDER; ORDER_KEY=956758519' не
была зарегистрирована. Причина 'Вы не можете снять данную заявку'.
Parameter name: transactionTxt
at . (String , OrderStatus& , Int32& , Double& , String& )
at Ecng.Trading.Quik.QuikTrader. (Order , String , Boolean ,
Boolean )
at Ecng.Trading.Quik.QuikTrader.CancelOrder(Order order)
at Ecng.Trading.Algo.TraderHelper.GuarantyCancelOrder(ITrader
trader, Order order)
at Ecng.Trading.Algo.TraderHelper.ReRegisterOrder(ITrader trader,
Order oldOrder, Func`1 getNewPrice, Boolean isForts)
at Ecng.Trading.Algo.QuotingStrategy.OnProcess()
at Ecng.Trading.Algo.Strategy.Process()
2010-03-19T10:47:45.1718750+03:00 [0] None => MarketQuotingStrategy
stopping
2010-03-19T10:47:45.4843750+03:00 [0] None => Quoting finishing by
956758519
2010-03-19T10:47:45.4843750+03:00 [0] None => Quoting cancelling
order by 956758519
2010-03-19T10:47:46.3437500+03:00 [0] None => MarketQuotingStrategy
stopped
2010-03-19T10:47:47.1406250+03:00 [0] None => Quoting renewing order
Buy with id 956758695 price 1712,14 volume 1 transaction 6
2010-03-19T10:47:48.3593750+03:00 [0] None => Quoting renewed order
Buy with id 956758871 price 1712,8 volume 1 transaction 7
2010-03-19T10:47:48.6718750+03:00 [0] None => Quoting renewing order
Buy with id 956758871 price 1712,8 volume 1 transaction 7
2010-03-19T10:47:49.0312500+03:00 [0] Error =>
System.ArgumentException: Заявка по транзакции 'CLASSCODE=EQBR;
SECCODE=LKOH; TRANS_ID=7; ACTION=KILL_ORDER; ORDER_KEY=956758871' не
была зарегистрирована. Причина 'Вы не можете снять данную заявку'.
Parameter name: transactionTxt
at . (String , OrderStatus& , Int32& , Double& , String& )
at Ecng.Trading.Quik.QuikTrader. (Order , String , Boolean ,
Boolean )
at Ecng.Trading.Quik.QuikTrader.CancelOrder(Order order)
at Ecng.Trading.Algo.TraderHelper.GuarantyCancelOrder(ITrader
trader, Order order)
at Ecng.Trading.Algo.TraderHelper.ReRegisterOrder(ITrader trader,
Order oldOrder, Func`1 getNewPrice, Boolean isForts)
at Ecng.Trading.Algo.QuotingStrategy.OnProcess()
at Ecng.Trading.Algo.Strategy.Process()
2010-03-19T10:47:49.0312500+03:00 [0] None => MarketQuotingStrategy
stopping
2010-03-19T10:47:49.3437500+03:00 [0] None => Quoting finishing by
956758871
2010-03-19T10:47:49.3437500+03:00 [0] None => Quoting cancelling
order by 956758871
2010-03-19T10:47:50.4531250+03:00 [0] None => MarketQuotingStrategy
stopped
2010-03-19T10:47:51.3593750+03:00 [0] None => Quoting renewing order
Buy with id 956759112 price 1712,14 volume 1 transaction 8
2010-03-19T10:47:52.1718750+03:00 range error: {0}
System.ArgumentOutOfRangeException: Specified argument was out of the
range of valid values.
Parameter name: min
at Ecng.ComponentModel.Range`1.ValidateBounds(T min, T max)
at Ecng.ComponentModel.Range`1.Init(T min, T max)
at Ecng.ComponentModel.Range`1..ctor(T min, T max)
at SampleSMA.MainWindow.DrawSma() in D:\trade\bot\code\stockSharp
\SampleSMA\MainWindow.xaml.cs:line 243
Первый этап обработки исключения типа
"System.ArgumentOutOfRangeException" в приложении
Ecng.ComponentModel.dll
2010-03-19T10:47:52.7343750+03:00 [0] None => Quoting renewed order
Buy with id 956759254 price 1712,98 volume 1 transaction 9
2010-03-19T10:48:02.6718750+03:00 [0] None => Quoting renewing order
Buy with id 956759254 price 1712,98 volume 1 transaction 9
2010-03-19T10:48:03.8125000+03:00 [0] None => Quoting renewed order
Buy with id 956760263 price 1712,99 volume 1 transaction 10
2010-03-19T10:48:07.4218750+03:00 [0] None => Quoting order 956760263
matched
2010-03-19T10:48:07.4218750+03:00 [0] None => MarketQuotingStrategy
stopping
2010-03-19T10:48:07.8593750+03:00 [0] None => Quoting finishing by
956760263
2010-03-19T10:48:07.8593750+03:00 [0] None => MarketQuotingStrategy
stopped

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

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 19.03.2010
Ответить


Пойдем по шагам:

1. Какой интервал котирования? Судя по этому:

2010-03-19T10:47:44.7812500+03:00 [0] None => Quoting renewed order
Buy with id 956758519 price 1712,79 volume 1 transaction 5
2010-03-19T10:47:45.0937500+03:00 [0] None => Quoting renewing order
Buy with id 956758519 price 1712,79 volume 1 transaction 5

У тебя прошло около четверти секунды. Я, конечно, писал в пункте 4

http://stockmarketdotnet.blogspot.com/2010/02/s-17.html, что нужна
минимальная задержка, но не настолько же =)

2. System.ArgumentOutOfRangeException я уже писал, в чем причина. Не
пофиксил в алго?

3. А где вот это? System.ArgumentException: An item with the same key
has already been added. Мои догадки - заявка была не зарегистрирована.
У незарегистрированных заявок одинаковый номер 0. Но нужно проверить.
Жду логи. Еще по хорошему было бы залогировать состояние заявки перед
отправкой на котирование, чтоб уж точно.

4. Проскальзывание для котировщика в процессе. Я так заточил под
обычные стратегии, при придется чуть поломать архитектуру. =(

Спасибо:

denis

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


1. Было 0,3 сек. Теперь 1 сек.

2. это возникает на последней строке
private void DrawSma()
{
var bounds = _timeFrame.GetCandleBounds(_trader);

if (_lastCandleTime < bounds.Min)
{
try
{
var endOffset = TimeSpan.FromSeconds(1);
bounds = new Range<DateTime>(_lastCandleTime +
_timeFrame, bounds.Min - endOffset); // line 243

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

3. Верно. Когда заявка не была зарегистрирована, то возникала такая
ошибка. Сейчас создаю, регаю и включаю котировщика. Все путем.
делаю так
base.Trader.RegisterOrder(order);

// добавляем зарегистрированную заявку в стратегию
base.AddOrder(order);
AddLog(StrategyErrorStates.None, "new order at " +
order.Price + " status " + order.Status + " state " + order.State);
потом идет котировщик
логи

2010-03-19T13:55:01.8750000+03:00 [0] None => new order at 1698,21
status Done state Active
2010-03-19T13:55:09.6250000+03:00 [0] None => Quoting renewing order
Buy with id 957686090 price 1698,21 volume 1 transaction 1
2010-03-19T13:55:11.5468750+03:00 [0] None => Quoting renewed order
Buy with id 957686670 price 1698,99 volume 1 transaction 2
2010-03-19T13:55:12.5781250+03:00 [0] None => Quoting order 957686670
matched
2010-03-19T13:55:12.5781250+03:00 [0] None => MarketQuotingStrategy
stopping
2010-03-19T13:55:13.8750000+03:00 [0] None => Quoting finishing by
957686670
2010-03-19T13:55:13.8906250+03:00 [0] None => MarketQuotingStrategy
stopped

4. Не надо ничего ломать. Потом как-нибудь, когда время будет.

Автор топика
Спасибо:


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

loading
clippy