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


tmt

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

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

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

Теги:


Спасибо:




31 Ответов
1 2  >
tmt

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


кстати, 4.0.20 выходит не последняя версия)) надо 4.1 попробовать
Автор топика
Спасибо:

freelancer

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


Не надо MessageBox.
Почитайте про логирование: https://stocksharp.ru/do...eb-b756-d913af0f4f8e.htm
Оно вам всё равно понадобится
Спасибо:

Alexander

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


4.0.20 - последняя final версия. 4.1 в процессе разработки находится, там прилично изменений. Лучше работайте с 4.0.20, на 4.1 у вас ещё больше вопросов возникнет.
Спасибо:

tmt

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


freelancer Перейти
Не надо MessageBox.
Почитайте про логирование: https://stocksharp.ru/do...eb-b756-d913af0f4f8e.htm
Оно вам всё равно понадобится

Мнеб пример с логированием стратегии, но думаю сначало бы разобраться с этой проблемой.

Тыкал тыкал я и натыкал вот такой код
Код

namespace Sample
{
    class NewStrategy : Strategy
    {
        private static MarketDepth _marketDepth;
        private static Position _position;

        protected override void OnStarting()
        {
            this
                .When(Security.MarketDepthChanged())
                .Do(str);

            base.OnStarting();
        }

        public void str()
        {
            shortPos();
            longPos();
            
        }
        
        public void longPos()
        {
            // создаем заявку для открытия длинной позиции
            var longPos = new Order
            {
                Portfolio = Portfolio,
                Price = Security.ShrinkPrice(Security.BestBid.Price),
                Security = Security,
                Volume = 1,
                Direction = OrderDirections.Buy,
            };

            // регистрируем правило, отслеживающее появление новых сделок по заявке
            this
            .When(longPos.NewTrades())
            .Do(OnNewOrderTrades)
            .Periodical(() => longPos.IsMatched());

            // отправляем заявку на регистрацию
            RegisterOrder(longPos);
        }

        public void shortPos()
        {
            // создаем заявку для открытия длинной позиции
            var shortPos = new Order
            {
                Portfolio = Portfolio,
                Price = Security.ShrinkPrice(Security.BestAsk.Price),
                Security = Security,
                Volume = 1,
                Direction = OrderDirections.Sell,
            };

            // регистрируем правило, отслеживающее появление новых сделок по заявке
            this
            .When(shortPos.NewTrades())
            .Do(OnNewOrderTrades)
            .Periodical(() => shortPos.IsMatched());

            // отправляем заявку на регистрацию
            RegisterOrder(shortPos);
        }

        private void OnNewOrderTrades(IEnumerable<MyTrade> trades)
        {
            // для каждой сделки добавляем для защитную пару стратегии
            var protectiveStrategies = trades.Select(t =>
            {
                // выставляет тейк-профит в 100 пунктов
                var takeProfit = new TakeProfitStrategy(t, 100);

                // выставляет стоп-лосс в 50 пунктов
                var stopLoss = new StopLossStrategy(t, 50);

                return new TakeProfitStopLossStrategy(takeProfit, stopLoss);
            });

            ChildStrategies.AddRange(protectiveStrategies);
        }
        
    }
}


ничего не происходило => проблемы со стаканом, он не обновляется.. и функция str() вовсе не вызыватся.

после чего я сделал вот так

Код
        protected override void OnStarting()
        {
            shortPos();
        }

и у меня огромная ошибка
1.bmp 1 MB (0)
Автор топика
Спасибо:

hobo

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


Начните с самого простого варианта: оставьте только OnStarting, посмотрите что у вас с Security, вызовите из этого же метода стакан,..
Еще рекомендую поискать на форуме, куча рабочих вариантов основ стратегий
Спасибо:

OvcharenkoVI

Фотография
Автор статей
Дата: 07.03.2012
Ответить


tmt Перейти
freelancer Перейти
Не надо MessageBox.
Почитайте про логирование: https://stocksharp.ru/do...eb-b756-d913af0f4f8e.htm
Оно вам всё равно понадобится

Мнеб пример с логированием стратегии, но думаю сначало бы разобраться с этой проблемой.

Тыкал тыкал я и натыкал вот такой код
Код

namespace Sample
{
    class NewStrategy : Strategy
    {
        private static MarketDepth _marketDepth;
        private static Position _position;

        protected override void OnStarting()
        {
            this
                .When(Security.MarketDepthChanged())
                .Do(str);

            base.OnStarting();
        }

        public void str()
        {
            shortPos();
            longPos();
            
        }
        
        public void longPos()
        {
            // создаем заявку для открытия длинной позиции
            var longPos = new Order
            {
                Portfolio = Portfolio,
                Price = Security.ShrinkPrice(Security.BestBid.Price),
                Security = Security,
                Volume = 1,
                Direction = OrderDirections.Buy,
            };

            // регистрируем правило, отслеживающее появление новых сделок по заявке
            this
            .When(longPos.NewTrades())
            .Do(OnNewOrderTrades)
            .Periodical(() => longPos.IsMatched());

            // отправляем заявку на регистрацию
            RegisterOrder(longPos);
        }

        public void shortPos()
        {
            // создаем заявку для открытия длинной позиции
            var shortPos = new Order
            {
                Portfolio = Portfolio,
                Price = Security.ShrinkPrice(Security.BestAsk.Price),
                Security = Security,
                Volume = 1,
                Direction = OrderDirections.Sell,
            };

            // регистрируем правило, отслеживающее появление новых сделок по заявке
            this
            .When(shortPos.NewTrades())
            .Do(OnNewOrderTrades)
            .Periodical(() => shortPos.IsMatched());

            // отправляем заявку на регистрацию
            RegisterOrder(shortPos);
        }

        private void OnNewOrderTrades(IEnumerable<MyTrade> trades)
        {
            // для каждой сделки добавляем для защитную пару стратегии
            var protectiveStrategies = trades.Select(t =>
            {
                // выставляет тейк-профит в 100 пунктов
                var takeProfit = new TakeProfitStrategy(t, 100);

                // выставляет стоп-лосс в 50 пунктов
                var stopLoss = new StopLossStrategy(t, 50);

                return new TakeProfitStopLossStrategy(takeProfit, stopLoss);
            });

            ChildStrategies.AddRange(protectiveStrategies);
        }
        
    }
}


ничего не происходило => проблемы со стаканом, он не обновляется.. и функция str() вовсе не вызыватся.

после чего я сделал вот так

Код
        protected override void OnStarting()
        {
            shortPos();
        }

и у меня огромная ошибка


1.Где вызывается стакан? Не видно метода Trader.RegisterQuotes(Security) или Trader.GetMarketDepth(security). Странно, что ошибка в 90 строке файла strategy, а у вас всего их 86) Посмотрите, что у вас с Security, как вы создаете стратегию, вообще передаете Security из главного окна в стратегию.

Желательно выложить весь проект, тогда будет видно что откуда берется.

P.S.Не работал с квиком никогда, может быть проблема в настройках таблиц? Из за этого допустим стакан не получаете.
Спасибо: tmt

tmt

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


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

А про примеры, там все примеры с машками, а мне со стаканом надо бы, вот и пытаюсь сделать.

Спасибо, за ответы, буду дальше делать
Автор топика
Спасибо:

tmt

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


OvcharenkoVI Перейти
Не видно метода Trader.RegisterQuotes(Security) или Trader.GetMarketDepth(security).

Всем спасибо, ошибка была в том, что я не начал получать стакан "Trader.RegisterQuotes(Security)"Smile
Автор топика
Спасибо:

tmt

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


Вот одно дело я сделал))) получил вроде как грамотный код, те уже более понятный для гуру. Теперь я попытался его перенести в пример тестирования по истории! Но у меня ничего не вышло, помогите пожалуйста разобраться. Саму стратегию думаю нету смысла выкладывать, тк она явно рабочая.

а вот это файлик MainWondow

Код
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;

	
	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 static Position _position;

        public static int pos = 2; // 0 - buy; 1 - sell
        public static decimal posPrice = 0;
        public static long posId;
        public static int i;

		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 _instrument = new Security
			{
				Id = "RIH2@RTS", // по идентификатору инструмента будет искаться папка с историческими маркет данными
                Code = "RIH2",
				Name = "RTS-3.12",
				MinStepSize = 5,
				MinStepPrice = 2,
				Exchange = Exchange.Test,
			};

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

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

			var timeFrame = TimeSpan.FromMinutes(5);

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

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

            _trader.DepthGenerators[_instrument] = new TrendMarketDepthGenerator(_instrument)
			{
				// стакан для инструмента в истории обновляется раз в секунду
				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;

            candleManager.RegisterTimeFrameCandles(_instrument, timeFrame);

			// создаем торговую стратегию, скользящие средние на 80 5-минуток и 10 5-минуток
            _strategy = new NewStrategy()
			{
				Volume = 1,
				Portfolio = _portfolio,
                Security = _instrument,
				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();

            /*------------------------------------------------------------*/
            _trader.RegisterQuotes(_instrument);

            _trader.QuotesChanged += depths =>
            {
                _marketDepth = depths.FirstOrDefault(d => d.Security == _instrument);
            };
            _trader.NewPositions += positions =>
            {
                if (_position == null)
                {
                    _position = positions.FirstOrDefault();
                }
            };

            _trader.NewOrders += myTrades =>
            {
                foreach (var myTrade in myTrades)
                {
                    var trade = myTrade;
                    int _pos = (int)trade.Direction;
                    if (posPrice == trade.Price && pos == _pos)
                    {
                        posId = trade.Id;
                    }
                }
            };
            /*------------------------------------------------------------*/

			// запускаем эмуляцию, задавая период тестирования (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");
		}
	}
}


1ое что я заметил, так это
Код
var timeFrame = TimeSpan.FromMinutes(5);
что мне туда писать, если я собираюсь по стаканам тестировать?

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

как соб-но стакан в истории может обновляться раз в сек, если у меня история стаканов...

Подскажите пожалуйста)))
Автор топика
Спасибо:

OvcharenkoVI

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


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

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

tmt

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


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

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


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

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

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

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 (0) error2.bmp 871 KB (0)
Автор топика
Спасибо:

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 (0)
Автор топика
Спасибо:

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();
Автор топика
Спасибо:

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
Ответить


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

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

loading
clippy