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


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

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

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

Теги:


Спасибо:


1 2 3  > >>
tmt

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


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

freelancer

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


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

Alexander

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


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

tmt

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


freelancer
Не надо MessageBox.
Почитайте про логирование: http://stocksharp.com/do...b-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 (242)
Спасибо:

hobo

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


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

OvcharenkoVI

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


tmt
freelancer
Не надо MessageBox.
Почитайте про логирование: http://stocksharp.com/do...b-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

Фотография
Дата: 08.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.У вас прям вся история стакана? В тестировании стакан генерируется сам, вот вы и задаете частоту, с какой он будет обновляться
Спасибо:
1 2 3  > >>

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

loading
clippy