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


tmt

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

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

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

Теги:


Спасибо:


< 1 2 3 4  >
tmt

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


OvcharenkoVI Перейти
1. Если не используете свечи, а по сделкам, то в принципе без разницы. Есть разница только какое StrategyRule использовать. В вашем случае MarketDepthChanged.

2.У вас прям вся история стакана? В тестировании стакан генерируется сам, вот вы и задаете частоту, с какой он будет обновляться


те var timeFrame = TimeSpan.FromMinutes(5); вовсе убрать могу

Да вроде как вся(я за сутки хочу прогнать, тк у меня нету еще истории за месяц и более)

Залил истоию + прогу. http://zalil.ru/32853166 пароль "stocksharp"
Ошибка сейчас, прикпрепил скрин
error.bmp 1 MB (187)
Спасибо:

tmt

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


Решил начать с малого, сначало просто добиться открытия позиции в 1 сторону в OnStarting()
и получился у меня вот такой код

MainWindow

Код
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;
	
	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 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.Test,
			};

			// тестовый портфель
			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)
			{
				// стакан для инструмента в истории обновляется раз в секунду
				Interval = TimeSpan.FromSeconds(1),
			};
            
			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();
				}
			};

			// устанавливаем в визуальный элемент 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");
		}
	}
}


и код стратегии

Код
namespace SampleHistoryTesting
{
	using System;

	using StockSharp.Algo;
	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Indicators;
	using StockSharp.Algo.Indicators.Trend;
	using StockSharp.Algo.Strategies;
	using StockSharp.BusinessEntities;

	class NewStrategy : Strategy
	{
		protected override void OnStarting()
		{
			sell();

			base.OnStarting();
		}

        public void sell()
		{
            var order = this.CreateOrder(OrderDirections.Sell, Security.GetMarketPrice(OrderDirections.Sell), Volume);
            RegisterOrder(order);
		}
	}
}


Ну и в общем цена не может быть равна 0 у order.. Как я понял у меня вообще ни 1 цены нету.. Скрины ниже

И кстати, это уже 4,0,21 версия (все что выше я пробовал на 20)
error1.bmp 680 KB (202) error2.bmp 871 KB (195)
Спасибо:

vader

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


Выведете, чему равна цена ,по которой ставите заявку.
Спасибо:

tmt

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


vader Перейти
Выведете, чему равна цена ,по которой ставите заявку.

из второй картинки видно же, что значение null
Спасибо:

tmt

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


Сделал вот так

Код
namespace SampleHistoryTesting
{
	using System;

	using StockSharp.Algo;
	using StockSharp.Algo.Candles;
	using StockSharp.Algo.Indicators;
	using StockSharp.Algo.Indicators.Trend;
	using StockSharp.Algo.Strategies;
	using StockSharp.BusinessEntities;

    using MessageBox = System.Windows.MessageBox;

	class NewStrategy : Strategy
	{
		protected override void OnStarting()
		{
			sell();

			base.OnStarting();
		}

        public void sell()
		{
            MessageBox.Show("цена " + Security.BestAsk.Price);
            
                // MessageBox.Show(Security.BestAsk.Price);
            /*var order = new Order
            {
                Portfolio = Portfolio,
                Price = Security.BestAsk.Price,
                Security = Security,
                Volume = 1,
                Direction = OrderDirections.Sell
            };
            RegisterOrder(order);*/
		}
	}
}


Получаю вот это (скрин внизу)

Как раз на MessageBox.Show("цена " + Security.BestAsk.Price);
error3.bmp 1 MB (174)
Спасибо:

vader

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


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

Alexander

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


Очевидно что ошибка из-за того что BestAsk = null
Спасибо:

tmt

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


Alexander Mukhanchikov Перейти
Очевидно что ошибка из-за того что BestAsk = null

ну это я понял, но что я не так делаю, что стакан получить не могу?
Спасибо:

Alexander

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


tmt Перейти
Alexander Mukhanchikov Перейти
Очевидно что ошибка из-за того что BestAsk = null

ну это я понял, но что я не так делаю, что стакан получить не могу?


Не запускаете экспорт стакана.
Читайте документацию внимательнее.
Спасибо:

tmt

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


Код
			_trader.Connect();
			_trader.StartExport();

            _trader.RegisterQuotes(security);


Вот запуск экспорта стакана, после _trader.StartExport();
Спасибо:
< 1 2 3 4  >

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

loading
clippy