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

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


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

В документации написано что после того, как заявки будут загружены в стратегию через 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/Stock...n/SampleMultiConnection/
Thanks:

Константин

Avatar
Date: 2/16/2018
Reply


В примере который вы предложили я увидел только то что в конструкторе главного окна создается CsvEntityRegistry и StorageRegistry после чего все передается в конструктор коннектора.
Code
            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);

После чего происходит десиарелизация и загрузка настроек коннектора.
Code
                if (File.Exists(_settingsFile))
                    Connector.Load(new XmlSerializer<SettingsStorage>().Deserialize(_settingsFile));

И так же обратное сохранение
Code
            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


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

Code

//Создаю хранилище при получении инструмента так
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<ExecutionMessage> _tradesMessages;
public override void Load(SettingsStorage storage)
{
base.Load(storage);
_tradesMessages = TransactionStorage.Load().ToArray();
}
.......
//Далее в методе Strategy.OnStarted() вызываю ProcessNewOrders(IEnumerable<order> orders) и передаю в него ордера полученные из сообщений сделок:
protected sealed override void OnStarted()
{
var ord = _tradesMessages.Select(t => t.ToOrder(Security)).ToArray();
ProcessNewOrders(ord);
base.OnStarted();
}

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

private List<MyTrade> _trades = new List<MyTrade>();

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

Когда загружаю сообщения своих сделок из хранилища (_trades = TransactionStorage.Load().ToArray()) то получаю сообщения с такими данными:

Когда из этих сообщений получаю ордера то данные в них такие:

Причем видно что в ордерах Volume == 0 и никаких расчетов не происходит. Что я делаю не так? Пожалуйста помогите разобраться в данной теме.
Thanks:

Support

Avatar
Date: 8/1/2018
Reply


Добрый день

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

Константин

Avatar
Date: 8/1/2018
Reply


Здравствуйте. методы стратегии не перегружал.
В примере который вы мне посоветовали посмотреть в качестве примера (SampleMultiConnection) используется поле типа Connector.
Создается который так:
Code
            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/Stock...tion/Extensions.cs#L264 Там идёт вызов окна настроек с последующим сохранением настроек в локальный файл.
Thanks:
1 2  >

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

loading
clippy