Помогите разобраться с TakeProfitStrategy...
Atom
23.11.2011


Сделал как в примерах...

Цитата:

private void OnNewMyTrades(IEnumerable<MyTrade> trades)
{
// фильтруем сделки, чтобы найти те, которые произошли для заявки MyOrder
trades = trades.Where(t => t.Order == MyOrder);
// если не найдена ни одна сделка для заявки MyOrder
if (trades.Count() == 0)
return;
// сама пакетная стратегия так же является параллельной, чтобы она не блокирована основной код робота
var Basket = new BasketStrategy(BasketStrategyFinishModes.All);
// для каждой сделки добавляем для защиты по пакетной стратегии
Basket.ChildStrategies.AddRange(trades.Select(CreateBasket).Cast<Strategy>());
base.ChildStrategies.Add(Basket);
}

BasketStrategy CreateBasket(MyTrade t)
{
var s = new BasketStrategy(BasketStrategyFinishModes.First);
// выставляет тейк-профит в 45 пунктов
var takeProfit = new TakeProfitStrategy(t, 45);
s.ChildStrategies.Add(takeProfit);
return s;
}

Лог такой:

Цитата:

16:33:51.023 | | OS | Стратегия запущена.
16:34:41.639 | | OS | Новая Buy сделка 458108237 по цене 140960 на 1 заявки 59619294.
16:34:41.665 | | BS | Стратегия запущена.
16:34:41.666 | | BS | Стратегия запущена.
16:34:41.666 | | TPS | Стратегия запущена.
16:35:48.452 | | TPS | Регистрация новой заявки на Sell с ценой 141005 и объемом 1.
16:35:48.455 | | TPS | Заявка 59619295 на Sell отправлена с ценой 141005 объемом 1.
16:35:48.489 | Warning | TPS | Заявка 59619295 не имеет состояния.
16:35:51.464 | | OS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295.
16:35:51.465 | | TPS | Позиция изменилась на -1.
16:35:51.465 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0.
16:35:51.465 | | BS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295.
16:35:51.465 | | BS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295.
16:35:51.465 | | TPS | Новая Sell сделка 458109666 по цене 141005 на 1 заявки 59619295.
16:35:51.466 | | BS | Стратегия останавливается.
16:35:51.467 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0.
16:35:51.467 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0.
16:35:51.469 | | BS | Стратегия останавливается.
16:35:51.470 | | TPS | Стратегия останавливается.
16:35:51.470 | | TPS | Заканчиваем котирование с неисполненным объемом равный 0.
16:35:51.473 | | BS | Стратегия остановлена.



Никак не разберусь, что делает TPS целую минуту от момента запуска до регистрации заявки. Сколько пробовал запускать - наименьший интервал был 6 секунд.

Теги:


Спасибо:


< 1 2 3 4  >
frontman

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


Ну могу вам сказать что это правило я сам лично использую и оно 100% верно. Ищите ошибку в логике программы самой.
Спасибо:

profts

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


Ну собственно вот вся логика:

Цитата:




protected override void OnStarting()
{
this
.When(base.Security.Changed())
.Do(raschet);
base.OnStarting();
}

private void raschet()
{
...
//расчет условия на сделку
...
if (position == 0)
{
if (условие на сделку)
{
position = 1;
order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1);
this.RegisterOrder(order_buy1);
};
};

if (position == 1)
{
this
.When(order_buy1.NewTrades())
.Do(Takeprofit1);
}
}

private void Takeprofit1()
{
order_takeprofit1 = this.CreateOrder(OrderDirections.Sell, order_buy1.Price + 45, 1);
this.RegisterOrder(order_takeprofit1);
position = 2;
}


Спасибо:

frontman

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


Давай те вы так сделаете : В методе OnStarting()
Оставите только
this.AddInfoLog("Создаю");
order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1);
this
.When(order_buy1.NewTrades())
.Do(() => this.AddInfoLog("Новая сделка"));
this.AddInfoLog("Регистрирую");
this.RegisterOrder(order_buy1);

И выложите здесь полученные в результате логи.
Спасибо:

profts

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


Сделал...


Цитата:

15:27:53.484 | | OS | Стратегия запущена.
15:27:53.493 | | OS | Создаю
15:27:53.501 | | OS | Регистрирую
15:27:54.061 | | OS | Новая Buy сделка 459004723 по цене 140345 на 1 заявки 55665883.
15:27:54.074 | | OS | Новая сделка
Спасибо:

profts

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


А вообще может быть, что событие
.When(base.Security.Changed())
.Do(raschet);

возникает очень часто и вызывается одновременно в нескольких потоках и из разных потоков выставляется тэйк?
Спасибо:

profts

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


и еще добавил логи след. образом:

Цитата:

if (position == 0)
{
if (условие на сделку)
{
position = 1;
order_buy1 = this.CreateOrder(OrderDirections.Buy, base.Security.GetMarketPrice(OrderDirections.Buy), 1);
this.RegisterOrder(order_buy1);
};
};

if (position == 1)
{
this.AddInfoLog("pos = 1");
this
.When(order_buy1.NewTrades())
.Do(Takeprofit1);
}
}

private void Takeprofit1()
{
this.AddInfoLog("создается тэйк");
order_takeprofit1 = this.CreateOrder(OrderDirections.Sell, order_buy1.Price + 45, 1);
this.RegisterOrder(order_takeprofit1);
position = 2;
this.AddInfoLog("pos=2");
}


В итоге получаю следующий лог:

Цитата:

15:36:36.917 | | OS | Стратегия запущена.
15:37:05.590 | | OS | pos = 1
15:37:05.917 | | OS | pos = 1
15:37:06.686 | | OS | pos = 1
15:37:06.794 | | OS | pos = 1
15:37:07.224 | | OS | pos = 1
15:37:08.215 | | OS | pos = 1
15:37:08.242 | | OS | Новая Buy сделка 459012183 по цене 140190 на 1 заявки 56189139.
15:37:08.254 | | OS | pos = 1
15:37:08.255 | | OS | создается тэйк
15:37:08.255 | | OS | pos=2
15:37:08.255 | | OS | создается тэйк
15:37:08.255 | | OS | pos=2
15:37:08.255 | | OS | создается тэйк
15:37:08.256 | | OS | pos=2
15:37:08.256 | | OS | создается тэйк
15:37:08.256 | | OS | pos=2
15:37:08.256 | | OS | создается тэйк
15:37:08.256 | | OS | pos=2
15:37:08.256 | | OS | создается тэйк
15:37:08.256 | | OS | pos=2
15:37:10.644 | | OS | Новая Sell сделка 459012259 по цене 140235 на 1 заявки 56189140.
15:37:10.645 | | OS | Новая Sell сделка 459012260 по цене 140235 на 1 заявки 56189141.
15:37:10.645 | | OS | Новая Sell сделка 459012261 по цене 140235 на 1 заявки 56189142.
15:37:10.645 | | OS | Новая Sell сделка 459012262 по цене 140235 на 1 заявки 56189143.
15:37:10.878 | | OS | Новая Sell сделка 459012268 по цене 140235 на 1 заявки 56189144.
15:37:10.878 | | OS | Новая Sell сделка 459012269 по цене 140235 на 1 заявки 56189145.

Спасибо:

kenota

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


profts: Ваш метод raschet() откуда вызывается? :)
Спасибо:

profts

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


Цитата:

Ваш метод raschet() откуда вызывается? :)


protected override void OnStarting()
{
this
.When(base.Security.Changed())
.Do(raschet);
base.OnStarting();
}
Спасибо:

kenota

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


Может быть в этом проблема, два потока могут одновременно зайти и оба прочитать что position = 0 и поставить ордер.

Что же касается вызовов метода NewTrades несколько раз, попробуйте вместо него использовать событие ордера Matched. Т.е. this.When(order_buy1.Matched()).Do(TakeProfit1);
Спасибо:

frontman

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


profts Перейти
Сделал...


Цитата:

15:27:53.484 | | OS | Стратегия запущена.
15:27:53.493 | | OS | Создаю
15:27:53.501 | | OS | Регистрирую
15:27:54.061 | | OS | Новая Buy сделка 459004723 по цене 140345 на 1 заявки 55665883.
15:27:54.074 | | OS | Новая сделка

Это говорит о том что событие не генерируются несколько раз...
Спасибо:
< 1 2 3 4  >

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

loading
clippy