В RealTimeEmulationTrader не происходят сделки
Специально для проверки StopLossStrategy кидаю лимитки близко к спреду. Но сделки, судя по логу, не происходят.
Что-то делаю не так?
Лог файл
Code
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:59:00.104 | | Правило 'Интервал 00:01:00 (0x1C4D180)'. Активация.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:54:53.440 | | Переход из состояния Stopped в Started.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:54:53.442 | | Стратегия запущена. [0,-1]. Позиция при старте 0.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:56:00.039 | | Правило 'Интервал 00:01:00 (0x1C4D180)'. Активация.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:56:00.064 | | Регистрация новой Limit (0x31AE540) заявки на Buy с ценой 9847 и объемом 1.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:56:00.112 | | Правило 'Полное исполнение 60886354/0 (0x36B20B7)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:56:00.113 | | Правило 'Отмена заявки 60886354/0 (0x283D6C)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:56:00.113 | | Правило 'Ошибка регистрации заявки 60886354/0 (0x271D65F)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:57:00.062 | | Правило 'Интервал 00:01:00 (0x1C4D180)'. Активация.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:57:00.063 | | Регистрация новой Limit (0xEB7DE3) заявки на Buy с ценой 9841 и объемом 1.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:57:00.064 | | Правило 'Полное исполнение 60886355/0 (0x4D82E1)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:57:00.064 | | Правило 'Отмена заявки 60886355/0 (0x86693B)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:57:00.064 | | Правило 'Ошибка регистрации заявки 60886355/0 (0x2874BB6)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:58:00.085 | | Правило 'Интервал 00:01:00 (0x1C4D180)'. Активация.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:58:00.085 | | Регистрация новой Limit (0x3F13BE6) заявки на Buy с ценой 9845 и объемом 1.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:58:00.085 | | Правило 'Полное исполнение 60886356/0 (0xCEF4B6)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:58:00.085 | | Правило 'Отмена заявки 60886356/0 (0x17B6DE0)'. Подписалось на события.
RS_SRM3@RTS_SPBFUT007r0 | 25.03.2013 16:58:00.085 | | Правило 'Ошибка регистрации заявки 60886356/0 (0xDC417)'. Подписалось на события.
Код стратегии
Code
using System;
using System.Globalization;
using System.Windows;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Ecng.Collections;
using Ecng.Xaml;
using StockSharp.Algo;
using StockSharp.Algo.Strategies;
using StockSharp.Algo.Candles;
using System.Threading;
using StockSharp.BusinessEntities;
namespace Spikes_Test_it
{
internal class RobotStrategy : TimeFrameStrategy
{
private readonly CandleManager _candleManager; //Менеджер свечей
private readonly CandleSeries _candleSeries; //Свечи
private DateTime _nextTime;
private decimal _delta;
private readonly decimal _deltaPercent;
private decimal _stopLoss;
private readonly decimal _stopLossPercent;
public RobotStrategy(CandleManager candleManager, CandleSeries candleSeries, decimal deltaPercent, decimal stopLossPercent, TimeSpan timeFrame)
: base(timeFrame)
{
_candleManager = candleManager;
_candleSeries = candleSeries;
_deltaPercent = deltaPercent;
_stopLossPercent = stopLossPercent;
}
/// <summary>
/// Метод вызывается тогда, когда вызвался метод <see cref="M:StockSharp.Algo.Strategies.Strategy.Start"/>, и состояние <see cref="P:StockSharp.Algo.Strategies.Strategy.ProcessState"/> перешло в значение <see cref="F:StockSharp.Algo.ProcessStates.Started"/>.
/// </summary>
protected override void OnStarted()
{
//Вычисляем время окончания текущей свечки
_nextTime = Interval.GetCandleBounds(base.Trader.GetMarketTime(Exchange.Me)).Max;
Thread.Sleep(_nextTime - base.Trader.GetMarketTime(Exchange.Me));
base.OnStarted();
}
protected override ProcessResults OnProcess()
{
//Если наша стратегия в процессе остановки
if (base.ProcessState == ProcessStates.Stopping)
{
//Отменяем активные заявки
CancelActiveOrders();
//Так как все активные заявки гарантированно были отменены, то возвращаем ProcessResults.Stop
return ProcessResults.Stop;
}
//Событие обработки торговой стратегии вызвалось в первый раз, что раньше, чем окончания текущей свечки
if (Trader.GetMarketTime(Exchange.Me) < _nextTime)
{
//Возвращаем ProcessResults.Continue, так как наш алгоритм еще не закончил свою работу, а просто ожидает следующего вызова.
return ProcessResults.Continue;
}
//Получаем сформированную свечку
var candle = _candleSeries.GetTimeFrameCandle(_nextTime-TimeFrame);
//если свечки не существует (не было ни одной сделке в тайм-фрейме), то ждем окончания следующей свечки.
if (candle == null)
{
// если прошло больше 10 секунд с момента окончания свечки, а она так и не появилась,
// значит сделок в прошедшей 5-минутке не было, и переходим на следующую свечку
if ((this.GetMarketTime() - _nextTime) > TimeSpan.FromSeconds(10))
_nextTime = TimeFrame.GetCandleBounds(Trader.GetMarketTime(Exchange.Me)).Max;
return ProcessResults.Continue;
}
_nextTime += TimeFrame;
//Создаем заявку
var order = this.CreateOrder(OrderDirections.Buy, candle.ClosePrice - 3, Volume);
//Регистрируем правило, отслеживающее появление новых сделок, осуществленных трейдером
Trader
.WhenNewMyTrades()
.Do(OnNewMyTrades)
.Apply(this);
RegisterOrder(order);
return ProcessResults.Continue;
}
protected override void OnNewMyTrades(IEnumerable<MyTrade> trades)
{
//Для каждой сделки добавляем защитную стоп-лосс стратегию
var protectiveStrategies = trades.Select(t =>
{
MessageBox.Show("Идентификатор сделки: " +
t.Trade.Id.ToString(
CultureInfo.InvariantCulture));
_stopLoss = t.Trade.Price * _stopLossPercent/100;
//Выставляем стоп-лосс 2% от цены входа
var stopLossStrategy = new AutoProtectiveStrategy
{
StopLossLevel = _stopLoss,
//TakeProfitTimeOut = TimeSpan.FromMinutes(TimeFrame.Minutes*2)
TakeProfitTimeOut = TimeSpan.FromSeconds((_nextTime+TimeFrame+TimeFrame).Second-t.Trade.Time.Second)
};
MessageBox.Show(stopLossStrategy.TakeProfitTimeOut.ToString());
return stopLossStrategy;
});
ChildStrategies.AddRange(protectiveStrategies);
base.OnNewMyTrades(trades);
}
}
}