Проблемы со стратегией
Atom
05.03.2012
tmt


Вот пытаюсь переписать код грамотно, создать отдельный Stratagy.cs, где будет сама стратегия, но не получается.. Вызывал, вызывал эту стратегию, проверял все ли данные получаю (портфель, инструмент, стакан и тп..) все нормально слава Богу))

Подскажите пожалуйста, как из другого класса вызвать окошко с ошибкой
Код
MessageBox.Show(this, "тра та та");
чтоб узнать, вызывается тот класс со стратегией вообще или нет, пробовал по всякому + ссылки добавлял, но писал ошибки!

И посмотрите пожалуйста кто нить, в чем же ошибка может быть, там всего путь поменять, да счет)) версия последняя 4.0.20 и терменал квик
robot.rar 31 KB (239)

Теги:


Спасибо:


< 1 2 3 4  >
Alexander

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


А экспорт успевает запуститься?
Может стоит хотя бы проверку вставить да, к примеру, каждый вызов OnProcess в TimeFrame стратегии проверять стакан?
Спасибо:

tmt

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


Alexander Mukhanchikov
А экспорт успевает запуститься?
Может стоит хотя бы проверку вставить да, к примеру, каждый вызов OnProcess в TimeFrame стратегии проверять стакан?

А как проверить, успевает или нет?
Спасибо:

Alexander

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


У вас не успевает, могу вам сразу сказать.
Раз бид = null

Я вам всячески рекомендую либо записаться к нам на курсы, либо воспользоваться услугой поддержки.
А то так можно очень долго выяснять подобные мелочи, и в итоге на каком-то шаге сдаться, потратив слишком много времени и сил впустую.
Спасибо:

tmt

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


Alexander Mukhanchikov
У вас не успевает, могу вам сразу сказать.
Раз бид = null

Я вам всячески рекомендую либо записаться к нам на курсы, либо воспользоваться услугой поддержки.
А то так можно очень долго выяснять подобные мелочи, и в итоге на каком-то шаге сдаться, потратив слишком много времени и сил впустую.

А сколько экспорт стакана запускается? может задержку сделать после запуска. Я бы с радостью заплатить за поддержку, но в бюджете брешь на данный момент[biggrin]
Спасибо:

Alexander

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


Вариант как сделать я вам написал выше.
Выше дело принимать его или делать по-своему.
Спасибо:

tmt

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


Экспорт стакана надо запустить перед запуском эмуляции или после?
И если перед, то проверку перед запуском проводить? а после уже запускать.. или как?

Ответьте пожалуйста, спасибо
Спасибо:

tmt

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


Сделал вот так.. Все равно не получается, стакан не появляется ((((

Добавил событие появления новых инструментов и выяснил что они появляются сразу, без запуска эмуляции
Код
            _trader.NewSecurities += sec =>
            {
                _trader.GetMarketDepth(security);
            };

+ добавил событие изменения стакана.. По которому и стартуется стратегия, но вот это событие не срабатывает...
Код
bool str = false;

            _trader.QuotesChanged += depths =>
            {
                if (str == false)
				{
                    str = true;
                    _strategy.Start();
                }
                _marketDepth = depths.FirstOrDefault(d => d.Security == security);
            };


Может где баг какой?

Код
namespace SampleHistoryTesting
{
	using System;
	using System.Collections.Generic;
	using System.Diagnostics;
	using System.IO;
	using System.Windows;
	using System.Windows.Forms;
	using System.Windows.Media;
	using MessageBox = System.Windows.MessageBox;

	using Ecng.Common;
	using Ecng.Serialization;
	using Ecng.Xaml;
	using Ecng.Collections;

	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Reporting;
	using StockSharp.Algo.Storages;
	using StockSharp.Algo.Strategies;
	using StockSharp.Algo.Testing;
	using StockSharp.Algo.Logging;
	using StockSharp.Algo.Equity;
	using StockSharp.Algo.Indicators.Trend;
	using StockSharp.BusinessEntities;

    using System.Linq;

    using System.Threading;
	
	public partial class MainWindow
	{
		private Strategy _strategy;

		private ICollection<EquityData> _curveItems;
		private EmulationTrader _trader;

		private readonly LogManager _logManager = new LogManager();

		private DateTime _lastUpdateDate;
		private DateTime _startEmulationTime;
        public static MarketDepth _marketDepth;
        //public Security security;

		public MainWindow()
		{
			InitializeComponent();

			_logManager.Listeners.Add(new FileLogListener("log.txt"));
		}

		private void FindPath_Click(object sender, RoutedEventArgs e)
		{
			var dlg = new FolderBrowserDialog();

			if (!HistoryPath.Text.IsEmpty())
				dlg.SelectedPath = HistoryPath.Text;

			if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				HistoryPath.Text = dlg.SelectedPath;
			}
		}

		private void StartBtn_Click(object sender, RoutedEventArgs e)
		{
			// если процесс был запущен, то его останавливаем
			if (_trader != null && _trader.State != EmulationStates.Stopped)
			{
				StartBtn.IsEnabled = false;

				_strategy.Stop();
				_trader.Stop();
				_logManager.Sources.Clear();

				return;
			}

			if (HistoryPath.Text.IsEmpty() || !Directory.Exists(HistoryPath.Text))
			{
				MessageBox.Show(this, "Неправильный путь.");
				return;
			}

			// создаем тестовый инструмент, на котором будет производится тестирование
            var security = new Security
			{
				Id = "RIH2@RTS", // по идентификатору инструмента будет искаться папка с историческими маркет данными
                Code = "RIH2",
				Name = "RTS-3.12",
				MinStepSize = 5,
				MinStepPrice = 3,
				Exchange = Exchange.Rts,
			};

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

			// хранилище, через которое будет производиться доступ к тиковой и котировочной базе
			var storage = new TradingStorage(new InMemoryStorage())
			{
				BasePath = HistoryPath.Text
			};

			// в реальности период может быть другим, и это зависит от объема данных,
			// хранящихся по пути HistoryPath, 
            var startTime = new DateTime(2012, 2, 26);
            var stopTime = new DateTime(2012, 2, 27);
	
			_trader = new EmulationTrader(
				new[] { security },
				new[] { portfolio })
			{
				Storage = storage,
				WorkingTime = Exchange.Rts.WorkingTime,

				// параметр влияет на занимаемую память.
				// в случае достаточно количества памяти на компьютере рекомендуется его увеличить
				DaysInMemory = 6,
			};

            _trader.DepthGenerators[security] = new TrendMarketDepthGenerator(security);
            
			var candleManager = new CandleManager();
			var builder = new CandleBuilder(new TradeCandleBuilderSource(_trader) { IsSyncProcess = true });
			candleManager.Sources.Add(builder);

			// в целях оптимизации расходования памяти храним не более 100 последних свечек и 100000 последних сделок
			((CandleContainer)candleManager.Container).MaxCandleCount = 100;
			((CandleBuilderContainer)builder.Container).MaxCandleCount = 100;
			((CandleBuilderContainer)builder.Container).MaxValueCount = 100000;

			// создаем торговую стратегию, скользящие средние на 80 5-минуток и 10 5-минуток
			_strategy = new NewStrategy()
			{
				Volume = 1,
				Portfolio = portfolio,
				Security = security,
				Trader = _trader
			};

			// копируем параметры на визуальную панель
			ParametersPanel.Parameters.Clear();
			ParametersPanel.Parameters.AddRange(_strategy.EquityManager.Parameters);

			if (_curveItems == null)
				_curveItems = Curve.CreateCurve(_strategy.Name, Colors.DarkGreen);
			else
				_curveItems.Clear();

			_strategy.EquityManager.NewEquityData += data => this.GuiAsync(() => _curveItems.Add(data));

			_logManager.Sources.Add(_strategy);

			// и подписываемся на событие изменения времени, чтобы обновить ProgressBar
			_trader.MarketTimeChanged += () =>
			{
				// в целях оптимизации обновляем ProgressBar только при начале нового дня
				if (_trader.MarketTime.Date != _lastUpdateDate || _trader.MarketTime >= stopTime)
				{
					_lastUpdateDate = _trader.MarketTime.Date;
					this.GuiAsync(() => TestingProcess.Value = (_trader.MarketTime - startTime).Ticks);
				}
			};

			_trader.StateChanged += () =>
			{
				if (_trader.State == EmulationStates.Stopped)
				{
					this.GuiAsync(() =>
					{
						StartBtn.IsEnabled = true;

						if (TestingProcess.Value == TestingProcess.Maximum)
							MessageBox.Show("Закончено за " + (DateTime.Now - _startEmulationTime));
						else
							MessageBox.Show("Отменено");
					});
				}
				else if (_trader.State == EmulationStates.Started)
				{
					// запускаем стратегию когда эмулятор запустился
                    //_strategy.Start();
				}
			};

            bool str = false;

            _trader.QuotesChanged += depths =>
            {
                if (str == false)
				{
                    str = true;
                    _strategy.Start();
                }
                _marketDepth = depths.FirstOrDefault(d => d.Security == security);
            };

            _trader.NewSecurities += sec =>
            {
                _trader.GetMarketDepth(security);
            };

			// устанавливаем в визуальный элемент ProgressBar максимальное количество итераций)
			TestingProcess.Maximum = (stopTime - startTime).Ticks;
			TestingProcess.Value = 0;
			Report.IsEnabled = true;

			_startEmulationTime = DateTime.Now;

			// соединяемся с трейдером и запускаем экспорт,
			// чтобы инициализировать переданными инструментами и портфелями необходимые свойства EmulationTrader
			_trader.Connect();
			_trader.StartExport();

            

			// запускаем эмуляцию, задавая период тестирования (startTime, stopTime).
			_trader.Start(startTime, stopTime);
		}

		private void Report_Click(object sender, RoutedEventArgs e)
		{
			// сгерерировать отчет по прошедшему тестированию
			// Внимание! сделок и заявок может быть большое количество,
			// поэтому Excel отчет может тормозить
			new ExcelStrategyReport(_strategy, "sma.xls").Generate();

			// открыть отчет
			Process.Start("sma.xls");
		}
	}
}
Спасибо:

tmt

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


_trader.QuotesChanged ни разу не срабатывает.. Стратегия даже не запускается и следовательно стакан = null.. Попробую на какой нить старой версии, может заработает

Увы, но с QuotesChanged тоже самое на 3.1, похоже у меня руки кривые [biggrin] выложите кто нибудь рабочий пример со стаканом пожалуйста[blink]
Спасибо:

Alexander

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


Смотрите примеры из архива
Спасибо:

Moadip

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


Цитата:
выложите кто нибудь рабочий пример со стаканом пожалуйста


Взял оригинальный SampleHistoryTesting, заменил в нем SmaStrategy на вашу стратегию - NewStrategy

Поменял инструмент и дату тестирования
Код

// создаем тестовый инструмент, на котором будет производится тестирование
var security = new Security
{
	Id = "RIM2@RTS", // по идентификатору инструмента будет искаться папка с историческими маркет данными
	Code = "RIM2",
	Name = "RTS-6.12",
	MinStepSize = 5,
	MinStepPrice = 2,
	Exchange = Exchange.Test,
};

 ...

var startTime = new DateTime(2012, 3, 16);
var stopTime = new DateTime(2012, 3, 17);



Поставил обновление стакана раз в 10 сек. т.к. при 1 сек. тестер перешел в пошаговый режим.[biggrin]
Код

_trader.DepthGenerators[security] = new TrendMarketDepthGenerator(security)
{
	// стакан для инструмента в истории обновляется раз в секунду
	Interval = TimeSpan.FromSeconds(10),
};


Подправил создание стратегии
Код

// создаем торговую стратегию, скользящие средние на 80 5-минуток и 10 5-минуток
_strategy = new NewStrategy()
{
	Volume = 1,
	Portfolio = portfolio,
	Security = security,
	Trader = _trader
};

Больше ничего не менял.
Пуск!


До конца теста ждать не стал.

Полный код на на всякий случай
Спасибо:
< 1 2 3 4  >

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

loading
clippy