// TODO: rewrite it
internal void OnFill(Fill fill, bool queued = true)
{
Fills.Add(fill);
this.framework.EventServer.OnFill(this, fill, queued);
var instrument = fill.Instrument;
bool flag = false;
var position = PositionsByInstrumentId[instrument.Id] ?? GetOrCreatePosition(instrument);
if (position.Amount == 0)
{
flag = true;
}
position.Add(fill);
Account.Add(fill, false);
if (flag)
{
Statistics.OnPositionChanged(position);
this.framework.EventServer.OnPositionChanged(this, position, queued);
Statistics.OnPositionOpened(position);
this.framework.EventServer.OnPositionOpened(this, position, queued);
}
else
{
if (fill.Qty > position.Qty && position.Amount != 0.0 && ((fill.Side == OrderSide.Buy && position.Side == PositionSide.Long) || (fill.Side == OrderSide.Sell && position.Side == PositionSide.Short)))
{
Statistics.OnPositionSideChanged(position);
}
if (position.Amount != 0.0)
{
Statistics.OnPositionChanged(position);
}
this.framework.EventServer.OnPositionChanged(this, position, queued);
if (position.Amount == 0.0)
{
Statistics.OnPositionClosed(position);
this.framework.EventServer.OnPositionClosed(this, position, queued);
}
}
if (UpdateParent)
{
Parent?.OnFill(fill, queued);
}
Statistics.OnFill(fill);
}