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

Проблемы со стратегией
Atom
3/5/2012
tmt


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

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

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

Tags:


Thanks:


< 1 2 3 4  >
Alexander

Avatar
Date: 3/13/2012
Reply


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

tmt

Avatar
Date: 3/13/2012
Reply


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

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

Alexander

Avatar
Date: 3/13/2012
Reply


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

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

tmt

Avatar
Date: 3/13/2012
Reply


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

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

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

Alexander

Avatar
Date: 3/13/2012
Reply


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

tmt

Avatar
Date: 3/13/2012
Reply


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

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

tmt

Avatar
Date: 3/14/2012
Reply


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

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

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

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


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

Code
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");
		}
	}
}
Thanks:

tmt

Avatar
Date: 3/19/2012
Reply


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

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

Alexander

Avatar
Date: 3/19/2012
Reply


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

Moadip

Avatar
Date: 3/19/2012
Reply


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


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

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

// создаем тестовый инструмент, на котором будет производится тестирование
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]
Code

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


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

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

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


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

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

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy