Добрый день, уважаемая поддержка! Нужно реализовать загрузку данных стратегии при её старте. То есть историю изменения позиции, данные по эквити. В документации есть вот это - http://doc.stocksharp.ru/html/61ad1ece-8094-44a9-a558-ec664a1ab16a.htm Судя по всему статья устарела так как перегрузки метода ProcessNewOrders(IEnumerable<Order> 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, загрузятся и все совершенные по ним сделки. Это будет сделано автоматически. Соответственно у меня есть несколько вопросов:
- Как сделать что бы ProcessNewOrders загружал в стратегию сделки и заявки?
- Будет ли при этом расчитываться эквити и срабатывать событие (Strategy.PnLChanged) изменения PnL?
- Будет ли при этом расчитываться позиция и срабатывать событие Strategy.PositionChanged изменения позиции? Если все изменилось то подскажите в какую сторону копать. Не хочется придумывать костыли.🙂
评论 (17)
登录 或 创建账户, 登录或注册以发表评论
Добрый день
Текущий подход заключается в использовании StorageMessageAdapter и восстановлении истории через сообщения. Отдельно присоединения заявок не позволяет восстановить полный цикл истории. А именно значения индикаторов, расчёт позиции и прибыли.
Здравствуйте есть пример использования StorageMessageAdapter? Или вы можете привести пример кода? Из документации мало что понятно.
Данный пример включает режим хранилища у коннектора и подгружает данные после перезапуска https://github.com/StockSharp/StockSharp/blob/master/Samples/Common/SampleMultiConnection/
В примере который вы предложили я увидел только то что в конструкторе главного окна создается CsvEntityRegistry и StorageRegistry после чего все передается в конструктор коннектора.
После чего происходит десиарелизация и загрузка настроек коннектора.
И так же обратное сохранение
Но как это применить к сохранению статистики стратегии я не понимаю. Как сохранить изменение PnL, Position и т.д. для того что бы потом загрузить и расчитать эти параметры? Если сериализовать в xml то как записать в SettingsStorage, по какому ключу?
Добрый день. Для чего в стратегии свойство StatisticManager и его методы AddPnL, AddPosition, AddNewOrder и остальные аналогичные методы?
Добрый день.
Для расчёта статистики. Например количество прибыльных сделок.
Здравствуйте! Вроде бы начал догонять данную тему, но не до конца.
//Создаю хранилище при получении инструмента так 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())); }
Добрый день
Вы делаете перегрузку методов у стратегии? Если да, то это неверное решение. Всю работу по сохранению и восстановлению заявок и сделок должен делать только коннектор.
Здравствуйте. методы стратегии не перегружал. В примере который вы мне посоветовали посмотреть в качестве примера (SampleMultiConnection) используется поле типа Connector. Создается который так:
А если я использую QuikTrader у которого нет такого конструктора, как быть в таком случае? Какие то свойства нужно проинициализировать в созданном экземпляре типа QuikTrader? Если да, то какие? Как я понял все происходит тут: Connector.Configure(this), но так как исходников нет, то мне не понятно что там происходит.
Добрый день
Коннектор сам умеет сохранять все данные через хранилище, которое может быть настроено у него. Пример показан в примере SampleMultiConnection. Использование производных классов от Connector являются устаревшим подходом, и не рекомендуется это делать в больших приложениях.
Метод расширения доступен с исходными кодами https://github.com/StockSharp/StockSharp/blob/master/Configuration/Extensions.cs#L264 Там идёт вызов окна настроек с последующим сохранением настроек в локальный файл.
А нет исходного кода ConnectorWindow? Хочу посмотреть процесс создания подключения.
Добрый день
К сожалению доступ к закрытым исходным кодам есть только у разработчиков.
Здравствуйте! А можно какой нибудь простой пример инициализации класса Connector?
Добрый день
Например как в нашем примере SampleMultiConnection https://github.com/StockSharp/StockSharp/blob/master/Samples/Common/SampleMultiConnection/MainWindow.xaml.cs#L86
Я имел в виду не создание экземпляра, а инициализацию свойств. На пример как проинициализировать Connector так, что бы он мог подключиться к квику?
Добрый день
Список всех доступных адаптером можно увидеть здесь https://github.com/StockSharp/StockSharp/blob/master/Configuration/Extensions.cs#L176
Спасибо. Буду пробовать.