← Zurück

RealTimeEmulationTrader не срабатывают события

Добрый день ,

версия 4.2.1.7 RealTimeEmulationTrader<QuikTrader>

не срабатывают события _trader.NewTrades и _trader.MarketTimeChanged причем в QuikTrader _trader.NewTrades срабатывает, а _trader.MarketTimeChanged тоже не срабатывает.

прошу проверить.

Спасибо.

War dieses Thema hilfreich?

Thema teilen

Kommentare (14)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

longtrades
longtrades Autor

Люди !!! , Ответьте кто нибудь , У кого то срабатывают эти события в версии 4.2.1.7 ?

longtrades
longtrades Autor

Тук , Тук! Есть кто ? Такое впечатление что я сам с собой общаюсь.

_trader.MarketTimeChanged начало срабатывать после обновления лицензии , _trader.NewTrades так до сих пор и не срабатывает , в чем может быть проблема ?

esper
esper

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

longtrades
longtrades Autor

Берем ваш пример SampleRealTimeTesting , переделаем его под квик , и ставим остановку на строку 125, и видим что событие _trader.NewTrades никогда не срабатывает:


namespace SampleRealTimeTesting
{
	using System;
	using System.Collections.Generic;
	using System.ComponentModel;
	using System.Diagnostics;
	using System.Linq;
	using System.Windows;

	using Ecng.Collections;
	using Ecng.Common;
	using Ecng.ComponentModel;
	using Ecng.Xaml;

	using StockSharp.Algo;
	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Indicators;
	using StockSharp.Algo.Indicators.Trend;
	using StockSharp.Algo.Reporting;
	using StockSharp.Algo.Testing;
	using StockSharp.BusinessEntities;
	using StockSharp.Logging;
	using StockSharp.Messages;
	using StockSharp.Quik;
	using StockSharp.Xaml.Charting;

	public partial class MainWindow
	{
		private bool _isConnected;
        private readonly TimeSpan _timeFrame = TimeSpan.FromMinutes(5);
		private readonly SynchronizedList<TimeFrameCandle> _historyCandles = new SynchronizedList<TimeFrameCandle>();
		private CandleManager _candleManager;
		private RealTimeEmulationTrader<QuikTrader> _trader;
		private SmaStrategy _strategy;
		private DateTime _lastHistoryCandle;
		private Security _lkoh;
		private readonly ChartArea _area;
		private ChartCandleElement _candlesElem;
		private ChartIndicatorElement _longMaElem;
		private ChartIndicatorElement _shortMaElem;

		public MainWindow()
		{
			InitializeComponent();

			_area = new ChartArea();
			_chart.Areas.Add(_area);
		}

		protected override void OnClosing(CancelEventArgs e)
		{
			if (_trader != null)
				_trader.Dispose();

			base.OnClosing(e);
		}

		private void ConnectClick(object sender, RoutedEventArgs e)
		{
			if (!_isConnected)
			{
				if (_trader == null)
				{

					// тестовый портфель
					var portfolio = new Portfolio
					{
						Name = "test account",
						BeginValue = 1000000,
					};

					// создаем шлюз
					_trader = new RealTimeEmulationTrader<QuikTrader>(new QuikTrader("D:\\QUIK\\Front"));


					// передаем первоначальное значение размера портфеля в эмулятор
					_trader.Process(new PortfolioChangeMessage
					{
						LocalTimeStamp = DateTime.Now,
						PortfolioName = portfolio.Name,
						Changes = new[]
						{
							new PositionChange(PositionChangeTypes.BeginValue, portfolio.BeginValue)
						}
					});

					// очищаем из текстового поля в целях безопасности
					Password.Clear();

					// подписываемся на событие успешного соединения
					_trader.Connected += () =>
					{
						// возводим флаг, что соединение установлено
						_isConnected = true;
                        _trader.UnderlyingTrader.StartExport();
                        _trader.StartExport();

						// разблокируем кнопку Экспорт
						this.GuiAsync(() => ChangeConnectStatus(true));

						_candleManager = new CandleManager(_trader);


						_trader.NewSecurities += securities => this.GuiAsync(() =>
						{
							// находим нужную бумагу
							var lkoh = securities.FirstOrDefault(s => s.Code == "LKOH");

							if (lkoh != null)
							{
								_lkoh = lkoh;

								this.GuiAsync(() =>
								{
									Start.IsEnabled = true;
								});
							}
						});


                        						_trader.NewTrades += trades => this.GuiAsync(() =>
						{
							var tr = trades;
                            var stop = 0;
						});

						_trader.NewMyTrades += trades => this.GuiAsync(() =>
						{
							if (_strategy != null)
							{
								// найти те сделки, которые совершила стратегия скользящей средней
								trades = trades.Where(t => _strategy.Orders.Any(o => o == t.Order));

								_trades.Trades.AddRange(trades);
							}
						});

						// подписываемся на событие о неудачной регистрации заявок
						_trader.OrdersRegisterFailed += OrdersFailed;

						_candleManager.Processing += (s, candle) =>
						{
							// выводим только те свечки, которые не были отрисованы как исторические
							if (candle.OpenTime > _lastHistoryCandle)
								ProcessCandle(candle);
						};

						_trader.StartExport();

						this.GuiAsync(() =>
						{
							ConnectBtn.IsEnabled = false;
						});
					};

					// подписываемся на событие разрыва соединения
					_trader.ConnectionError += error => this.GuiAsync(() =>
					{
						// заблокируем кнопку Экспорт (так как соединение было потеряно)
						ChangeConnectStatus(false);

						MessageBox.Show(this, error.ToString(), "Ошибка соединения");
					});

					_trader.ProcessDataError += error => this.GuiAsync(() => MessageBox.Show(this, error.ToString(), "Ошибка обработки данных"));
				}

				_trader.Connect();
			}
			else
			{
				_trader.Disconnect();
			}
		}

		private void OrdersFailed(IEnumerable<OrderFail> fails)
		{
			this.GuiAsync(() =>
			{
				foreach (var fail in fails)
					MessageBox.Show(this, fail.Error.ToString(), "Ошибка регистрации заявки");
			});
		}

		private void ChangeConnectStatus(bool isConnected)
		{
			_isConnected = isConnected;
			ConnectBtn.Content = isConnected ? "Отключиться" : "Подключиться";
		}

		private void OnLog(LogMessage message)
		{
			// если стратегия вывела не просто сообщение, то вывести на экран.
			if (message.Level != LogLevels.Info && message.Level != LogLevels.Debug)
				this.GuiAsync(() => MessageBox.Show(this, message.Message));
		}

		private void OnStrategyPropertyChanged(object sender, PropertyChangedEventArgs e)
		{
			this.GuiAsync(() =>
			{
				Status.Content = _strategy.ProcessState;
				PnL.Content = _strategy.PnL;
				Slippage.Content = _strategy.Slippage;
				Position.Content = _strategy.Position;
				Latency.Content = _strategy.Latency;
			});
		}

		private void StartClick(object sender, RoutedEventArgs e)
		{
			// если были получены и инструмент, и портфель
			if (_strategy == null)
			{
				// создаем скользящие средние, на 80 5-минуток и 10 5-минуток
				var longSma = new SimpleMovingAverage { Length = 80 };
				var shortSma = new SimpleMovingAverage { Length = 10 };
				
				// регистрируем наш тайм-фрейм
				var series = new CandleSeries(typeof(TimeFrameCandle), _lkoh, _timeFrame);
				// создаем торговую стратегию
				_strategy = new SmaStrategy(series, longSma, shortSma)
				{
					Volume = 1,
					Security = _lkoh,
					Portfolio = _trader.Portfolios.First(),
					Trader = _trader,
				};
				_strategy.Log += OnLog;
				_strategy.PropertyChanged += OnStrategyPropertyChanged;

				_candlesElem = new ChartCandleElement();
				_area.Elements.Add(_candlesElem);

				_longMaElem = new ChartIndicatorElement
				{
					Title = "Длинная",
					Indicator = _strategy.LongSma,
				};
				_area.Elements.Add(_longMaElem);

				_shortMaElem = new ChartIndicatorElement
				{
					Title = "Короткая",
					Indicator = _strategy.ShortSma,
				};
				_area.Elements.Add(_shortMaElem);

				// начинаем получать текущие сделки (для построения свечек реального времени)
				_trader.RegisterTrades(_lkoh);


				Report.IsEnabled = true;
			}

			if (_strategy.ProcessState == ProcessStates.Stopped)
			{
				// запускаем процесс получения стакана, необходимый для работы алгоритма котирования
				_trader.RegisterMarketDepth(_strategy.Security);
				_strategy.Start();
				Start.Content = "Стоп";
			}
			else
			{
				_trader.UnRegisterMarketDepth(_strategy.Security);
				_strategy.Stop();
				Start.Content = "Старт";
			}
		}

		private void ProcessCandle(Candle candle)
		{
			var longValue = candle.State == CandleStates.Finished ? new ChartIndicatorValue(_strategy.LongSma, _strategy.LongSma.Process(candle)) : null;
			var shortValue = candle.State == CandleStates.Finished ? new ChartIndicatorValue(_strategy.ShortSma, _strategy.ShortSma.Process(candle)) : null;

			_chart.ProcessValues(candle.OpenTime, new Dictionary<IChartElement, object>
			{
				{ _candlesElem, candle },
				{ _longMaElem, longValue },
				{ _shortMaElem, shortValue },
			});
		}

		private void ReportClick(object sender, RoutedEventArgs e)
		{
			// сгерерировать отчет по прошедшему тестированию
			new ExcelStrategyReport(_strategy, "sma.xls").Generate();

			// открыть отчет
			Process.Start("sma.xls");
		}
	}
}

esper
esper

Ваш код вставленный в пример 4.2.1.7 работает без ошибок.

longtrades
longtrades Autor

esper: Ваш код вставленный в пример 4.2.1.7 работает без ошибок.

Тоесь вы говорите что событие _trader.NewTrades срабатывает ?

Но как такое может быть , у меня не сработало на разу ? пример взят из 4.2.1.7 никаких изменений кроме выложеных не делалось , может нужны какие то специфичные настройки квика для 4.2.1.7 , хотя если ловить события у КвикТрейдера то все работает.

Настройки квика я тоже подгрузил из 4.2.1.7

esper
esper

У меня стандартные настройки квика. Смотрите что пишется в логе.

longtrades
longtrades Autor

Вот лог , можете что-то сказать ?

2014/01/09 20:42:41.131| |RealTimeEmulationTrader1|Connect 2014/01/09 20:42:41.131|Debug |RealTimeEmulationTrader1|BP:Portfolio,T=2014.01.09 20:42:41.173,Name=test account 2014/01/09 20:42:41.173| |RealTimeEmulationTrader1|Создан новый портфель test account. 2014/01/09 20:42:41.173|Debug |RealTimeEmulationTrader1|BP:PortfolioChange,T=2014.01.09 20:42:41.173P=test account,Changes=BeginValue=1000000 2014/01/09 20:42:41.173| |RealTimeEmulationTrader1|RCM: Connecting PrevState = -1 CurrState = -1. 2014/01/09 20:42:41.131| |QuikTrader|Connect 2014/01/09 20:42:41.131|Warning|QuikTrader|Невозможно выполнить подключение, так как соединение находится в состоянии Connecting. 2014/01/09 20:42:41.131|Debug |RealTimeEmulationTrader1|BP:Connect,T=2014/01/09 20:42:41.368 2014/01/09 20:42:41.131| |RealTimeEmulationTrader1|RCM: Trader ConnectionState = Connected CurrState = Connected PrevState = -1 2014/01/09 20:42:42.482| |QuikTrader|StartExport 2014/01/09 20:42:42.482| |QuikTrader|RCM: Trader ConnectionState = Connected CurrState = Connected PrevState = -1 2014/01/09 20:42:42.734|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Security,T=2014/01/09 20:42:42.702,SecId=S#:RIH4@FORTS, Native: 2014/01/09 20:42:42.482|Debug |RealTimeEmulationTrader1|BP:Security,T=2014/01/09 20:42:42.702,SecId=S#:RIH4@FORTS, Native: 2014/01/09 20:42:42.702|Debug |RealTimeEmulationTrader1|BP:Level1,T=2014/01/09 20:42:42.702Sec=S#:RIH4@FORTS, Native:,Changes=State=Trading,StepPrice=10,MinPrice=10 2014/01/09 20:42:44.458|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388268 2014/01/09 20:42:44.462|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.495|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.496|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| <-- Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388268 2014/01/09 20:42:44.113|Debug |RealTimeEmulationTrader1|BP:Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388268 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388269 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| <-- Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388269 2014/01/09 20:42:44.457|Debug |RealTimeEmulationTrader1|BP:Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388269 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388270 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| --> Execution(Registered),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=0 2014/01/09 20:42:44.497|Debug |#=q$TVAZv2WzY1qGjz80r1CIY92Hu5bfXHMYoAarEBZe7E=| <-- Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388270 2014/01/09 20:42:44.457|Debug |RealTimeEmulationTrader1|BP:Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388270

esper
esper

Судя по логу

2014/01/09 20:42:44.113|Debug |RealTimeEmulationTrader`1|BP:Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388268 сделки должны идти. Возможно в таблице инструментов нет инструмента по этим сделкам.

longtrades
longtrades Autor

Инструмент есть точно и даже в RealTimeEmulationTrader.Securities он есть .

Rebelion
Rebelion

longtrades: Инструмент есть точно и даже в RealTimeEmulationTrader.Securities он есть .

Тестани этот же код в 4.1.19.1. Если пашет - проблема в 4.2.1.x У меня один и тот же код в 4.2.1.x падал в бесконечный цикл перевыставления заявки на любом тесте с рандомного места, а этот же код (с малыми перепилками) в 4.1.19.1 работает нормально, тесты проходят.

Gavrus
Gavrus

В примерах из обучения, в уроке восемь, там как раз используются библиотеки версии 4.1.19.1, все работает. Просьба к разработчикам S#. Не могли бы и примеры из обучения тоже периодически обновлять? А то проку от него особого нет, т.к. в новых версиях библиотек иначе реализована работа.

esper
esper

Gavrus: В примерах из обучения, в уроке восемь, там как раз используются библиотеки версии 4.1.19.1, все работает. Просьба к разработчикам S#. Не могли бы и примеры из обучения тоже периодически обновлять? А то проку от него особого нет, т.к. в новых версиях библиотек иначе реализована работа. Примеры обновляются согласно изменениям в API, главное внимательней следить, что именно там изменилось. По описанной проблеме, попробуйте на 4.2.2, эта ошибка так и не подтвердилась, но были другие изменения.

longtrades
longtrades Autor

4.2.2 события уже срабатывают , спасибо .