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


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


tmt

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

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

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

Tags:


Thanks:


1 2 3  > >>
tmt

Avatar
Date: 3/5/2012
Reply


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

freelancer

Avatar
Date: 3/5/2012
Reply


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

Alexander

Avatar
Date: 3/5/2012
Reply


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

tmt

Avatar
Date: 3/6/2012
Reply


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

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

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

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() вовсе не вызыватся.

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

Code
        protected override void OnStarting()
        {
            shortPos();
        }

и у меня огромная ошибка
1.bmp 1 MB (198)
Thanks:

hobo

Avatar
Date: 3/7/2012
Reply


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

OvcharenkoVI

Avatar
Date: 3/7/2012
Reply


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

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

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

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() вовсе не вызыватся.

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

Code
        protected override void OnStarting()
        {
            shortPos();
        }

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


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

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

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

tmt

Avatar
Date: 3/7/2012
Reply


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

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

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

tmt

Avatar
Date: 3/7/2012
Reply


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

Всем спасибо, ошибка была в том, что я не начал получать стакан "Trader.RegisterQuotes(Security)"[smile]
Thanks:

tmt

Avatar
Date: 3/8/2012
Reply


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

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

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;

	
	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ое что я заметил, так это
Code
var timeFrame = TimeSpan.FromMinutes(5);
что мне туда писать, если я собираюсь по стаканам тестировать?

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

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

Подскажите пожалуйста)))
Thanks:

OvcharenkoVI

Avatar
Date: 3/11/2012
Reply


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

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

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

loading
clippy