RealTimeEmulationTrader не срабатывают события
Atom Ответить
06.01.2014


Добрый день ,

версия 4.2.1.7 RealTimeEmulationTrader<QuikTrader>

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

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

Спасибо.



Спасибо:




14 Ответов
longtrades

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


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

longtrades

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


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

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

esper

Фотография
Программист
Дата: 09.01.2014
Ответить


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

longtrades

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


Берем ваш пример 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

Фотография
Программист
Дата: 09.01.2014
Ответить


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

longtrades

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


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


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

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

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

esper

Фотография
Программист
Дата: 09.01.2014
Ответить


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

longtrades

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


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

2014/01/09 20:42:41.131| |RealTimeEmulationTrader`1|Connect
2014/01/09 20:42:41.131|Debug |RealTimeEmulationTrader`1|BP:Portfolio,T=2014.01.09 20:42:41.173,Name=test account
2014/01/09 20:42:41.173| |RealTimeEmulationTrader`1|Создан новый портфель test account.
2014/01/09 20:42:41.173|Debug |RealTimeEmulationTrader`1|BP:PortfolioChange,T=2014.01.09 20:42:41.173P=test account,Changes=BeginValue=1000000
2014/01/09 20:42:41.173| |RealTimeEmulationTrader`1|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 |RealTimeEmulationTrader`1|BP:Connect,T=2014/01/09 20:42:41.368
2014/01/09 20:42:41.131| |RealTimeEmulationTrader`1|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 |RealTimeEmulationTrader`1|BP:Security,T=2014/01/09 20:42:42.702,SecId=S#:RIH4@FORTS, Native:
2014/01/09 20:42:42.702|Debug |RealTimeEmulationTrader`1|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 |RealTimeEmulationTrader`1|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 |RealTimeEmulationTrader`1|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 |RealTimeEmulationTrader`1|BP:Execution(Matched),T=2014/01/09 20:42:44.457,Ord=0,Fail=,Trade=828388270
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 10.01.2014
Ответить


Судя по логу
Цитата:
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

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


Инструмент есть точно и даже в RealTimeEmulationTrader.Securities он есть .
Автор топика
Спасибо:

Rebelion

Фотография
Курсы
Дата: 10.01.2014
Ответить


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


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

Gavrus

Фотография
Курсы Благотворитель
Дата: 10.01.2014
Ответить


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

esper

Фотография
Программист
Дата: 10.01.2014
Ответить


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

Примеры обновляются согласно изменениям в API, главное внимательней следить, что именно там изменилось. По описанной проблеме, попробуйте на 4.2.2, эта ошибка так и не подтвердилась, но были другие изменения.
Спасибо:

longtrades

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


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


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

loading
clippy