Можно сохранять все что нужно в xml файл вот так.
В вашей стратегии создаем пару свойств
Код
private bool _firstStart = true;
public SettingsStorage SettingsStorage;
В конструкторе стратегии создаем файл
Код
if (!Name) throw new ArgumentNullException("Strategy Name");
if (File.Exists(Name + "_settings.xml"))
{
SettingsStorage = new XmlSerializer<SettingsStorage>().Deserialize(Name + "_settings.xml");
}
else
{
SettingsStorage = new Ecng.Serialization.SettingsStorage();
}
В метод "на старте" стратегии добавляем код
Код
base.OnStarted();
if (_firstStart)
{
LoadState(SettingsStorage);
_firstStart = false;
}
Хотя в в расширениях для стратегий, кажется есть такой метод, делаем свой, или как хотите)
В моем есть немного мусора, плюс то что нужно мне. Вам стоит обратить внимание на "OrderByTransactionIds".
Код
protected virtual void LoadState(SettingsStorage storage)
{
if (storage == null)
throw new ArgumentNullException("storage");
var settings = storage.GetValue<SettingsStorage>("Settings");
if (settings != null && settings.Count != 0)
{
/* if (settings.Contains("security"))
Security = Trader.Securities.FirstOrDefault(s => s.Id == settings.GetValue<string>("security"));
if (settings.Contains("portfolio"))
Portfolio = Trader.Portfolios.FirstOrDefault(p => p.Name == settings.GetValue<string>("portfolio"));
var id = Id;
if (Id != id)
throw new InvalidOperationException();
* */
}
else
{
settings = new SettingsStorage();
settings.SetValue("PortfolioCurrentMinValue", _defaultCurrentMinValue);
settings.SetValue("MaxPositionValue", _defaultMaxPositionValue);
settings.SetValue("MinPnL", _defaultMinPnL);
settings.SetValue(TradeSize, _defaultSize);
settings.SetValue(IsTradeAllowed, _defaultIsTradeAllowed);
storage.SetValue("Settings", settings);
}
Load(storage);
var statistics = storage.GetValue<SettingsStorage>("Statistics");
if (statistics != null)
{
foreach (var parameter in StatisticManager.Parameters.Where(parameter => statistics.ContainsKey(parameter.Name)))
{
parameter.Load(statistics.GetValue<SettingsStorage>(parameter.Name));
}
}
var orderTransactionIds = storage.GetValue<Dictionary<long, Order>>("OrderByTransactionIds");
if (orderTransactionIds != null)
{
foreach (var transactionId in orderTransactionIds.Keys)
{
var order = Trader.Orders.First(o => o.TransactionId == transactionId);
if (order != null) AttachOrder(order, order.GetTrades());
}
}
}
Ну и переопределяем метод сохранения.
Код
public override void Save(SettingsStorage storage)
{
var ordersToWrite = new Dictionary<long, Order>();
foreach (var order in Orders)
{
ordersToWrite.Add(order.TransactionId, order);
}
if (storage.ContainsKey("OrderByTransactionIds")) storage["OrderByTransactionIds"] = ordersToWrite;
else storage.Add("OrderByTransactionIds", ordersToWrite);
var xmlSerializer = new XmlSerializer<SettingsStorage>();
xmlSerializer.Serialize(storage, Name + "_settings.xml");
base.Save(storage);
}
Так стратегия будет восстанавливать orders, trades, positions,pnl и т.д. Но только в том случае, если из шлюза приходят зарегестрированные ранее заявки,сделки и т.д.
Если нет, то нужно наследоваться от шлюза Trader и нечто похожее на то, что делалось для стратегии проделать и там, сохраняя сделки, ордера, портфели, инструменты.
В стокшарпе есть как бы ORM для этого - EntityStorage. Но у меня ее как бы не особо получается заставить работать.
После добавления недостающих полей в БД, без которых, естественно, ничего никуда не сохраняется, можно с горем пополам сохранять ордера, сделки, инструменты, портфели.
Но отношения между таблицами нихрена не работают, подозреваю, что в Ecng.Data какая-то жопа.
Почему бы не мигрировать S# на EntityFramework и не сделать прекрасную модель данных для всего, что только можно. Понятно, что будут возникать проблемы при обновлении версий, но они ж и так возникают=))
И даже, видимо, не обязательно ковырять и перенаследовать все сущности, благодаря first code with POCO.