Загрузка статистических данных стратегии
Atom Ответить
03.02.2018


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

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

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

Если все изменилось то подскажите в какую сторону копать. Не хочется придумывать костыли.Smile



Спасибо:




17 Ответов
Support

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


Добрый день

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

Константин

Фотография
Благотворитель
Дата: 13.02.2018
Ответить


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

Support

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


Данный пример включает режим хранилища у коннектора и подгружает данные после перезапуска https://github.com/Stock...n/SampleMultiConnection/
Спасибо:

Константин

Фотография
Благотворитель
Дата: 16.02.2018
Ответить


В примере который вы предложили я увидел только то что в конструкторе главного окна создается 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, по какому ключу?
Автор топика
Спасибо:

Константин

Фотография
Благотворитель
Дата: 01.03.2018
Ответить


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

Support

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


Добрый день.

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

Константин

Фотография
Благотворитель
Дата: 31.07.2018
Ответить


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

Код

//Создаю хранилище при получении инструмента так
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();
}

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

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 и никаких расчетов не происходит. Что я делаю не так? Пожалуйста помогите разобраться в данной теме.
Автор топика
Спасибо:

Support

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


Добрый день

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

Константин

Фотография
Благотворитель
Дата: 01.08.2018
Ответить


Здравствуйте. методы стратегии не перегружал.
В примере который вы мне посоветовали посмотреть в качестве примера (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), но так как исходников нет, то мне не понятно что там происходит.
Автор топика
Спасибо:

Support

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


Добрый день

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

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

Константин

Фотография
Благотворитель
Дата: 02.08.2018
Ответить


А нет исходного кода ConnectorWindow? Хочу посмотреть процесс создания подключения.
Автор топика
Спасибо:

Support

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


Добрый день

К сожалению доступ к закрытым исходным кодам есть только у разработчиков.
Спасибо:

Константин

Фотография
Благотворитель
Дата: 05.08.2018
Ответить


Здравствуйте! А можно какой нибудь простой пример инициализации класса Connector?
Автор топика
Спасибо:

Support

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


Добрый день

Например как в нашем примере SampleMultiConnection https://github.com/Stock...n/MainWindow.xaml.cs#L86
Спасибо:

Константин

Фотография
Благотворитель
Дата: 05.08.2018
Ответить


Код
Connector = new Connector(entityRegistry, storageRegistry, snapshotRegistry);

Я имел в виду не создание экземпляра, а инициализацию свойств. На пример как проинициализировать Connector так, что бы он мог подключиться к квику?
Автор топика
Спасибо:

Support

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


Добрый день

Код
var connector = new Connector();

var luaFix = new LuaFixMarketDataMessageAdapter(connector.TransactionIdGenerator);

/* здесь идет инициализация свойство luaFix*/

connector.Adapter.InnerAdapters.Add(luaFix);


Список всех доступных адаптером можно увидеть здесь https://github.com/Stock...ation/Extensions.cs#L176
Спасибо: Константин

Константин

Фотография
Благотворитель
Дата: 07.08.2018
Ответить


Спасибо. Буду пробовать.
Автор топика
Спасибо:


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

loading
clippy