Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Наследники singleton'а (EntityFactory) не корректны #48

Closed
deme3us opened this issue Apr 17, 2015 · 2 comments
Closed

Comments

@deme3us
Copy link

deme3us commented Apr 17, 2015

EntityFactory определена как singleton:
static EntityFactory()
{
Instance = new EntityFactory();
}
public static EntityFactory Instance { get; private set; }

Определен наследник от него:
private sealed class EmulationEntityFactory : EntityFactory
у которого перегружен метод:
public override Portfolio CreatePortfolio(string name)
{
return _portfolios.TryGetValue(name) ?? base.CreatePortfolio(name);
}

Есть EntityCache, который использует синглетон:
private IEntityFactory _entityFactory = Algo.EntityFactory.Instance;
public IEntityFactory EntityFactory
{
get { return _entityFactory; }
.... cuted ....
}

    public Tuple<Portfolio, bool, bool> ProcessPortfolio(string name, Func<Portfolio, bool> changePortfolio = null)
    {

... cuted ...
var portfolio = _portfolios.SafeAdd(name, key =>
{
var p = EntityFactory.CreatePortfolio(key);
... cuted ...

  1. В результате:
    а. Перегруженный метод (override Portfolio CreatePortfolio) никогда не сработает
    б. В коннекторе на истори создается клон портфеля, а не тот, что был передан в стратегию и в коннектор.

PS: А сам EntityCache в Connector приватный

@mikasoukhov
Copy link
Contributor

Я мало что понял. О какой проблеме (если это проблема) идет речь?

@deme3us
Copy link
Author

deme3us commented Apr 19, 2015

Я про проблему, что после окончания работы портфель у стратегии отличается от портфеля коннектора (HistoryEmulationConnector), хотя на вход обоим подается один и тот же объект.

Вкратце:
var portfolio = new Portfolio() { Name = "n", BeginValue = 1000000, };
var connector = new HistoryEmulationConnector( new[] { oneSecurity }, new[] { portfolio } ) { ... };
var strategy = new MyStrategy( oneSeries ) { Portfolio = portfolio, ... };
connector.Start( startTime, stopTime );

После окончания работы стратегии:
connector.Portfolios.FirstOrDefault() будет содержать актуальные данные (CurrentValue, RealizedPnL и т.п.)
А strategy.Portfolio не будет содержать актуальных данных (т.е. останется таким же пустым, каким был при создании).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants