В примере SampleConsoleесть такой кусок кода:
while (true)
{
var mid = _lkoh.BestPair.SpreadPrice / 2;
// если спред вышел за пределы нашего диапазона
if (
((firstMid + firstMid * delta) <= mid) ||
((firstMid - firstMid * delta) >= mid)
)
{
var order = new Order
{
Portfolio = _portfolio,
Price = _lkoh.ShrinkPrice(_lkoh.BestBid.Price + mid),
Security = _lkoh,
Volume = 1,
Direction = OrderDirections.Buy,
};
trader.RegisterOrder(order);
Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
break;
}
else
Console.WriteLine("Текущее значение середины спреда {0:0.##}", _lkoh.BestBid.Price + mid);
// ждем 1 секунду
Thread.Sleep(1000);
}
Если посмотреть в документаци Тейк-профит и Стоп-лосс
public class MyStrategy : Strategy
{
public void OpenPosition()
{
// создаем заявку для открытия длинной позиции
var longPos = this.BuyAtMarket();
// регистрируем правило, отслеживающее появление новых сделок по заявке
longPos
.WhenNewTrades()
.Do(OnNewOrderTrades)
.Apply(this);
// отправляем заявку на регистрацию
RegisterOrder(longPos);
}
}
То видно, что для вновь созданной заявки используется правило WhenNewTrades при срабатывании которого выполняется метод OnNewOrderTrades
Делаем по аналогии, только вместо именованного метода будет использоватся лямбда выражение.
while (true)
{
var mid = _lkoh.BestPair.SpreadPrice / 2;
// если спред вышел за пределы нашего диапазона
if (
((firstMid + firstMid * delta) <= mid) ||
((firstMid - firstMid * delta) >= mid)
)
{
var order = new Order
{
Portfolio = _portfolio,
Price = _lkoh.ShrinkPrice(_lkoh.BestBid.Price + mid),
Security = _lkoh,
Volume = 1,
Direction = OrderDirections.Buy,
};
order
.WhenNewTrades()
.Do(trades =>
{
...
})
.Apply();
trader.RegisterOrder(order);
Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
break;
}
else
Console.WriteLine("Текущее значение середины спреда {0:0.##}", _lkoh.BestBid.Price + mid);
// ждем 1 секунду
Thread.Sleep(1000);
}
Теперь "наполним" его логикой.[smile]
while (true)
{
var mid = _lkoh.BestPair.SpreadPrice / 2;
// если спред вышел за пределы нашего диапазона
if (
((firstMid + firstMid * delta) <= mid) ||
((firstMid - firstMid * delta) >= mid)
)
{
var order = new Order
{
Portfolio = _portfolio,
Price = _lkoh.ShrinkPrice(_lkoh.BestBid.Price + mid),
Security = _lkoh,
Volume = 1,
Direction = OrderDirections.Buy,
};
order
.WhenNewTrades()
.Do(trades =>
{
// для каждой сделки добавляем защитную пару стратегии
var protectiveStrategies = trades.Select(t =>
{
// выставляет тейк-профит в 40 пунктов
var takeProfit = new TakeProfitStrategy(t, 40);
// выставляет стоп-лосс в 20 пунктов
var stopLoss = new StopLossStrategy(t, 20);
return new TakeProfitStopLossStrategy(takeProfit, stopLoss) { Trader = trader, Portfolio = _portfolio, Security = _lkoh };
});
// запускаем каждую стратегию
protectiveStrategies.ForEach(strategy => strategy.Start());
})
.Apply();
trader.RegisterOrder(order);
Console.WriteLine("Заявка {0} зарегистрирована.", order.Id);
break;
}
else
Console.WriteLine("Текущее значение середины спреда {0:0.##}", _lkoh.BestBid.Price + mid);
// ждем 1 секунду
Thread.Sleep(1000);
}
В примере, который в документации, protectiveStrategiesдобавляется в качестве дочерней. Поэтому каждую отдельную стратегию не надо инициализировать(передавать шлюз, портфель, инструмент, и т.д.) - все берется из родительской. И запускать через метод Start().
ChildStrategies.AddRange(protectiveStrategies);
В нашем случае, родительской нет(protectiveStrategiesсама ей является). Поэтому инициализируем и запускаем.
TakeProfitStopLossStrategy(takeProfit, stopLoss) { Trader = trader, Portfolio = _portfolio, Security = _lkoh };
...
strategy.Start()
Как то так. Вроде должно работать.[biggrin]