Загрузка статистических данных стратегии

Загрузка статистических данных стратегии


Добрый день, уважаемая поддержка! Нужно реализовать загрузку данных стратегии при её старте. То есть историю изменения позиции, данные по эквити. В документации есть вот это - http://doc.stocksharp.ru/html/61ad1ece-8094-44a9-a558-ec664a1ab16a.htm Судя по всему статья устарела так как перегрузки метода ProcessNewOrders(IEnumerable newOrders, bool isStopOrders) уже не существует. Но и не в этом дело. Я понимаю что метод ProcessNewOrders теперь сам распознает что за ордера в него приходят. Дело в том что данное руководство не работает. Реализовать пытаюсь так:


        private IEnumerable<Order> Filter(IEnumerable<Order> orders)
        {
            if (File.Exists("Opders.txt"))
            {
                // считываем номера транзакций из файла
                var transactions = File.ReadAllLines("Opders.txt").Select(l => l.To<long>()).ToArray();
                // находим наши заявки по считанным номерам
                return orders.Where(o => transactions.Contains(o.TransactionId));
            }
            return null;
        }

        public override void RegisterOrder(Order order)
        {
            // отравляем заявку дальше на регистрацию
            base.RegisterOrder(order);
            // добавляем новый номер транзакции
            File.AppendAllLines("Opders.txt", new[] { order.TransactionId.ToString() });
        }

        protected override void OnStarted()
        {
            //ролучаем отфильтрованые ордера
            var opders = Filter(Connector.Orders);
            if(opders != null) // если они есть передаем их в ProcessNewOrders
                ProcessNewOrders(opders);
            CandleManager.Processing += ProcessCandle;
            base.OnStarted();
        }


В документации написано что после того, как заявки будут загружены в стратегию через ProcessNewOrders, загрузятся и все совершенные по ним сделки. Это будет сделано автоматически. Соответственно у меня есть несколько вопросов:

  1. Как сделать что бы ProcessNewOrders загружал в стратегию сделки и заявки?
  2. Будет ли при этом расчитываться эквити и срабатывать событие (Strategy.PnLChanged) изменения PnL?
  3. Будет ли при этом расчитываться позиция и срабатывать событие Strategy.PositionChanged изменения позиции? Если все изменилось то подскажите в какую сторону копать. Не хочется придумывать костыли.[smile]



Thanks:


1 2  >
Support

Avatar
Date: 2/4/2018
Reply


Добрый день

Текущий подход заключается в использовании StorageMessageAdapter и восстановлении истории через сообщения. Отдельно присоединения заявок не позволяет восстановить полный цикл истории. А именно значения индикаторов, расчёт позиции и прибыли.

Thanks: Константин

Константин

Avatar
Date: 2/13/2018
Reply


Здравствуйте есть пример использования StorageMessageAdapter? Или вы можете привести пример кода? Из документации мало что понятно.

Thanks:

Support

Avatar
Date: 2/15/2018
Reply


Данный пример включает режим хранилища у коннектора и подгружает данные после перезапуска https://github.com/StockSharp/StockSharp/blob/master/Samples/Common/SampleMultiConnection/

Thanks:

Константин

Avatar
Date: 2/16/2018
Reply


В примере который вы предложили я увидел только то что в конструкторе главного окна создается CsvEntityRegistry и StorageRegistry после чего все передается в конструктор коннектора.

			var entityRegistry = new CsvEntityRegistry(path);
			var storageRegistry = new StorageRegistry
			{
				DefaultDrive = new LocalMarketDataDrive(path)
			};

			ConfigManager.RegisterService<IEntityRegistry>(entityRegistry);
			ConfigManager.RegisterService<IStorageRegistry>(storageRegistry);
			// ecng.serialization invoke in several places IStorage obj
			ConfigManager.RegisterService(entityRegistry.Storage);

			Connector = new Connector(entityRegistry, storageRegistry);
			logManager.Sources.Add(Connector);

После чего происходит десиарелизация и загрузка настроек коннектора.

				if (File.Exists(_settingsFile))
					Connector.Load(new XmlSerializer<SettingsStorage>().Deserialize(_settingsFile));

И так же обратное сохранение

			if (Connector.Configure(this))
				new XmlSerializer<SettingsStorage>().Serialize(Connector.Save(), _settingsFile);

Но как это применить к сохранению статистики стратегии я не понимаю. Как сохранить изменение PnL, Position и т.д. для того что бы потом загрузить и расчитать эти параметры? Если сериализовать в xml то как записать в SettingsStorage, по какому ключу?

Thanks:

Константин

Avatar
Date: 3/1/2018
Reply


Добрый день. Для чего в стратегии свойство StatisticManager и его методы AddPnL, AddPosition, AddNewOrder и остальные аналогичные методы?

Thanks:

Support

Avatar
Date: 3/22/2018
Reply


Добрый день.

Для расчёта статистики. Например количество прибыльных сделок.

Thanks:

Константин

Avatar
Date: 7/31/2018
Reply


Здравствуйте! Вроде бы начал догонять данную тему, но не до конца.

   ```

//Создаю хранилище при получении инструмента так public override Security Security { get => base.Security; set { base.Security = value; StorageRegistry = new StorageRegistry() { DefaultDrive = new LocalMarketDataDrive(StrategyPath + "/Storage") }; TransactionStorage = StorageRegistry.GetTransactionStorage(value); } } .... //Далее в методе Strategy.Load() загружаю сохраненные сделки private IEnumerable _tradesMessages; public override void Load(SettingsStorage storage) { base.Load(storage); _tradesMessages = TransactionStorage.Load().ToArray(); } ....... //Далее в методе Strategy.OnStarted() вызываю ProcessNewOrders(IEnumerable orders) и передаю в него ордера полученные из сообщений сделок: protected sealed override void OnStarted() { var ord = _tradesMessages.Select(t => t.ToOrder(Security)).ToArray(); ProcessNewOrders(ord); base.OnStarted(); }

Сохраняю сделки так:

private List _trades = new List();

//Подписываюсь на новые свои сделки WhenNewMyTrade().Do(MyTrade).Apply(this); ..... public void MyTrade(MyTrade myTrade) { _trades.Add(myTrade); TransactionStorage.Save(_trades.Select(t=>t.ToMessage())); }

Когда загружаю сообщения своих сделок из хранилища (_trades = TransactionStorage.Load().ToArray()) то получаю сообщения с такими данными:
![](https://pp.userapi.com/c846520/v846520040/b18c4/oSyqx6u4-bo.jpg)
Когда из этих сообщений получаю ордера то данные в них такие:
![](https://pp.userapi.com/c846520/v846520040/b18cc/DGJvdc3_QFM.jpg)
Причем видно что в ордерах Volume == 0 и никаких расчетов не происходит. Что я делаю не так? Пожалуйста помогите разобраться в данной теме.
Thanks:

Support

Avatar
Date: 8/1/2018
Reply


Добрый день

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

Thanks:

Константин

Avatar
Date: 8/1/2018
Reply


Здравствуйте. методы стратегии не перегружал. В примере который вы мне посоветовали посмотреть в качестве примера (SampleMultiConnection) используется поле типа Connector. Создается который так:

			var entityRegistry = new CsvEntityRegistry(path);
			var storageRegistry = new StorageRegistry
			{
				DefaultDrive = new LocalMarketDataDrive(path)
			};

			ConfigManager.RegisterService<IEntityRegistry>(entityRegistry);
			ConfigManager.RegisterService<IStorageRegistry>(storageRegistry);
			// ecng.serialization invoke in several places IStorage obj
			ConfigManager.RegisterService(entityRegistry.Storage);

			var snapshotRegistry = new SnapshotRegistry(Path.Combine(path, "Snapshots"));

			Connector = new Connector(entityRegistry, storageRegistry, snapshotRegistry);

А если я использую QuikTrader у которого нет такого конструктора, как быть в таком случае? Какие то свойства нужно проинициализировать в созданном экземпляре типа QuikTrader? Если да, то какие? Как я понял все происходит тут: Connector.Configure(this), но так как исходников нет, то мне не понятно что там происходит.

Thanks:

Support

Avatar
Date: 8/2/2018
Reply


Добрый день

Коннектор сам умеет сохранять все данные через хранилище, которое может быть настроено у него. Пример показан в примере SampleMultiConnection. Использование производных классов от Connector являются устаревшим подходом, и не рекомендуется это делать в больших приложениях.

Метод расширения доступен с исходными кодами https://github.com/StockSharp/StockSharp/blob/master/Configuration/Extensions.cs#L264 Там идёт вызов окна настроек с последующим сохранением настроек в локальный файл.

Thanks:
1 2  >

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

loading
clippy