本文整理汇总了C#中SecurityPortfolioManager.AddTransactionRecord方法的典型用法代码示例。如果您正苦于以下问题:C# SecurityPortfolioManager.AddTransactionRecord方法的具体用法?C# SecurityPortfolioManager.AddTransactionRecord怎么用?C# SecurityPortfolioManager.AddTransactionRecord使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类SecurityPortfolioManager
的用法示例。
在下文中一共展示了SecurityPortfolioManager.AddTransactionRecord方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ProcessFill
/// <summary>
/// Performs application of an OrderEvent to the portfolio
/// </summary>
/// <param name="portfolio">The algorithm's portfolio</param>
/// <param name="security">The fill's security</param>
/// <param name="fill">The order event fill object to be applied</param>
public virtual void ProcessFill(SecurityPortfolioManager portfolio, Security security, OrderEvent fill)
{
var quoteCash = security.QuoteCurrency;
//Get the required information from the vehicle this order will affect
var isLong = security.Holdings.IsLong;
var isShort = security.Holdings.IsShort;
var closedPosition = false;
//Make local decimals to avoid any rounding errors from int multiplication
var quantityHoldings = (decimal)security.Holdings.Quantity;
var absoluteHoldingsQuantity = security.Holdings.AbsoluteQuantity;
var averageHoldingsPrice = security.Holdings.AveragePrice;
try
{
// apply sales value to holdings in the account currency
var saleValueInQuoteCurrency = fill.FillPrice * Convert.ToDecimal(fill.AbsoluteFillQuantity) * security.SymbolProperties.ContractMultiplier;
var saleValue = saleValueInQuoteCurrency * quoteCash.ConversionRate;
security.Holdings.AddNewSale(saleValue);
// subtract transaction fees from the portfolio (assumes in account currency)
var feeThisOrder = Math.Abs(fill.OrderFee);
security.Holdings.AddNewFee(feeThisOrder);
portfolio.CashBook[CashBook.AccountCurrency].AddAmount(-feeThisOrder);
// apply the funds using the current settlement model
security.SettlementModel.ApplyFunds(portfolio, security, fill.UtcTime, quoteCash.Symbol, -fill.FillQuantity * fill.FillPrice * security.SymbolProperties.ContractMultiplier);
if (security.Type == SecurityType.Forex)
{
// model forex fills as currency swaps
var forex = (Forex.Forex) security;
security.SettlementModel.ApplyFunds(portfolio, security, fill.UtcTime, forex.BaseCurrencySymbol, fill.FillQuantity);
}
// did we close or open a position further?
closedPosition = isLong && fill.Direction == OrderDirection.Sell
|| isShort && fill.Direction == OrderDirection.Buy;
// calculate the last trade profit
if (closedPosition)
{
// profit = (closed sale value - cost)*conversion to account currency
// closed sale value = quantity closed * fill price BUYs are deemed negative cash flow
// cost = quantity closed * average holdings price SELLS are deemed positive cash flow
var absoluteQuantityClosed = Math.Min(fill.AbsoluteFillQuantity, absoluteHoldingsQuantity);
var closedSaleValueInQuoteCurrency = Math.Sign(-fill.FillQuantity)*fill.FillPrice*absoluteQuantityClosed;
var closedCost = Math.Sign(-fill.FillQuantity)*absoluteQuantityClosed*averageHoldingsPrice;
var conversionFactor = security.QuoteCurrency.ConversionRate*security.SymbolProperties.ContractMultiplier;
var lastTradeProfit = (closedSaleValueInQuoteCurrency - closedCost)*conversionFactor;
//Update Vehicle Profit Tracking:
security.Holdings.AddNewProfit(lastTradeProfit);
security.Holdings.SetLastTradeProfit(lastTradeProfit);
portfolio.AddTransactionRecord(security.LocalTime.ConvertToUtc(security.Exchange.TimeZone), lastTradeProfit - 2*feeThisOrder);
}
//UPDATE HOLDINGS QUANTITY, AVG PRICE:
//Currently NO holdings. The order is ALL our holdings.
if (quantityHoldings == 0)
{
//First transaction just subtract order from cash and set our holdings:
averageHoldingsPrice = fill.FillPrice;
quantityHoldings = fill.FillQuantity;
}
else if (isLong)
{
//If we're currently LONG on the stock.
switch (fill.Direction)
{
case OrderDirection.Buy:
//Update the Holding Average Price: Total Value / Total Quantity:
averageHoldingsPrice = ((averageHoldingsPrice*quantityHoldings) + (fill.FillQuantity*fill.FillPrice))/(quantityHoldings + fill.FillQuantity);
//Add the new quantity:
quantityHoldings += fill.FillQuantity;
break;
case OrderDirection.Sell:
quantityHoldings += fill.FillQuantity; //+ a short = a subtraction
if (quantityHoldings < 0)
{
//If we've now passed through zero from selling stock: new avg price:
averageHoldingsPrice = fill.FillPrice;
}
else if (quantityHoldings == 0)
{
averageHoldingsPrice = 0;
}
break;
}
}
else if (isShort)
{
//We're currently SHORTING the stock: What is the new position now?
switch (fill.Direction)
//.........这里部分代码省略.........
示例2: ProcessFill
/// <summary>
/// Performs application of an OrderEvent to the portfolio
/// </summary>
/// <param name="portfolio">The algorithm's portfolio</param>
/// <param name="security">The fill's security</param>
/// <param name="fill">The order event fill object to be applied</param>
public override void ProcessFill(SecurityPortfolioManager portfolio, Security security, OrderEvent fill)
{
var cfd = (Cfd) security;
var quoteCurrency = cfd.QuoteCurrencySymbol;
var quoteCash = portfolio.CashBook[quoteCurrency];
//Get the required information from the vehicle this order will affect
var closedPosition = false;
var isLong = security.Holdings.IsLong;
var isShort = security.Holdings.IsShort;
//Make local decimals to avoid any rounding errors from int multiplication
var averageHoldingsPrice = security.Holdings.AveragePrice;
var quantityHoldings = (decimal)security.Holdings.Quantity;
var absoluteHoldingsQuantity = security.Holdings.AbsoluteQuantity;
var lastTradeProfit = 0m;
try
{
//Update the Vehicle approximate total sales volume.
var saleValueInQuoteCurrency = fill.FillPrice * Convert.ToDecimal(fill.AbsoluteFillQuantity) * cfd.ContractMultiplier;
var saleValue = saleValueInQuoteCurrency * quoteCash.ConversionRate;
security.Holdings.AddNewSale(saleValue);
//Get the Fee for this Order - Update the Portfolio Cash Balance: Remove Transaction Fees.
var feeThisOrder = Math.Abs(fill.OrderFee);
security.Holdings.AddNewFee(feeThisOrder);
portfolio.CashBook[CashBook.AccountCurrency].AddAmount(-feeThisOrder);
// Apply the funds using the current settlement model
security.SettlementModel.ApplyFunds(portfolio, security, fill.UtcTime, quoteCurrency, -fill.FillQuantity * fill.FillPrice * cfd.ContractMultiplier);
//Calculate & Update the Last Trade Profit;
if (isLong && fill.Direction == OrderDirection.Sell)
{
//Closing up a long position
if (quantityHoldings >= fill.AbsoluteFillQuantity)
{
//Closing up towards Zero -- this is in the quote currency
lastTradeProfit = (fill.FillPrice - averageHoldingsPrice) * fill.AbsoluteFillQuantity * cfd.ContractMultiplier;
}
else
{
//Closing up to Neg/Short Position (selling more than we have) - Only calc profit on the stock we have to sell.
lastTradeProfit = (fill.FillPrice - averageHoldingsPrice) * quantityHoldings * cfd.ContractMultiplier;
}
closedPosition = true;
}
else if (isShort && fill.Direction == OrderDirection.Buy)
{
//Closing up a short position.
if (absoluteHoldingsQuantity >= fill.FillQuantity)
{
//Reducing the stock we have, and enough stock on hand to process order.
lastTradeProfit = (averageHoldingsPrice - fill.FillPrice) * fill.AbsoluteFillQuantity * cfd.ContractMultiplier;
}
else
{
//Increasing stock holdings, short to positive through zero, but only calc profit on stock we Buy.
lastTradeProfit = (averageHoldingsPrice - fill.FillPrice) * absoluteHoldingsQuantity * cfd.ContractMultiplier;
}
closedPosition = true;
}
if (closedPosition)
{
// convert the compute profit into the account currency
lastTradeProfit *= quoteCash.ConversionRate;
//Update Vehicle Profit Tracking:
security.Holdings.AddNewProfit(lastTradeProfit);
security.Holdings.SetLastTradeProfit(lastTradeProfit);
portfolio.AddTransactionRecord(security.LocalTime.ConvertToUtc(security.Exchange.TimeZone), lastTradeProfit - 2 * feeThisOrder);
}
//UPDATE HOLDINGS QUANTITY, AVG PRICE:
//Currently NO holdings. The order is ALL our holdings.
if (quantityHoldings == 0)
{
//First transaction just subtract order from cash and set our holdings:
averageHoldingsPrice = fill.FillPrice;
quantityHoldings = fill.FillQuantity;
}
else if (isLong)
{
//If we're currently LONG on the stock.
switch (fill.Direction)
{
case OrderDirection.Buy:
//.........这里部分代码省略.........
示例3: ProcessFill
/// <summary>
/// Performs application of an OrderEvent to the portfolio
/// </summary>
/// <param name="portfolio">The algorithm's portfolio</param>
/// <param name="security">The fill's security</param>
/// <param name="fill">The order event fill object to be applied</param>
public virtual void ProcessFill(SecurityPortfolioManager portfolio, Security security, OrderEvent fill)
{
//Get the required information from the vehicle this order will affect
var isLong = security.Holdings.IsLong;
var isShort = security.Holdings.IsShort;
var closedPosition = false;
//Make local decimals to avoid any rounding errors from int multiplication
var quantityHoldings = (decimal)security.Holdings.Quantity;
var absoluteHoldingsQuantity = security.Holdings.AbsoluteQuantity;
var averageHoldingsPrice = security.Holdings.AveragePrice;
var lastTradeProfit = 0m;
try
{
//Update the Vehicle approximate total sales volume.
security.Holdings.AddNewSale(fill.FillPrice * Convert.ToDecimal(fill.AbsoluteFillQuantity));
//Get the Fee for this Order - Update the Portfolio Cash Balance: Remove Transacion Fees.
var order = new MarketOrder(security.Symbol, fill.FillQuantity, security.LocalTime.ConvertToUtc(security.Exchange.TimeZone), type: security.Type) {Price = fill.FillPrice, Status = OrderStatus.Filled};
var feeThisOrder = Math.Abs(security.TransactionModel.GetOrderFee(security, order));
security.Holdings.AddNewFee(feeThisOrder);
portfolio.CashBook[CashBook.AccountCurrency].Quantity -= feeThisOrder;
//Calculate & Update the Last Trade Profit
if (isLong && fill.Direction == OrderDirection.Sell)
{
//Closing up a long position
if (quantityHoldings >= fill.AbsoluteFillQuantity)
{
//Closing up towards Zero.
lastTradeProfit = (fill.FillPrice - averageHoldingsPrice) * fill.AbsoluteFillQuantity;
//New cash += profitLoss + costOfAsset/leverage.
portfolio.CashBook[CashBook.AccountCurrency].Quantity += lastTradeProfit + ((averageHoldingsPrice * fill.AbsoluteFillQuantity));
}
else
{
//Closing up to Neg/Short Position (selling more than we have) - Only calc profit on the stock we have to sell.
lastTradeProfit = (fill.FillPrice - averageHoldingsPrice) * quantityHoldings;
//New cash += profitLoss + costOfAsset/leverage.
portfolio.CashBook[CashBook.AccountCurrency].Quantity += lastTradeProfit + ((averageHoldingsPrice * quantityHoldings));
}
closedPosition = true;
}
else if (isShort && fill.Direction == OrderDirection.Buy)
{
//Closing up a short position.
if (absoluteHoldingsQuantity >= fill.FillQuantity)
{
//Reducing the stock we have, and enough stock on hand to process order.
lastTradeProfit = (averageHoldingsPrice - fill.FillPrice) * fill.AbsoluteFillQuantity;
//New cash += profitLoss + costOfAsset/leverage.
portfolio.CashBook[CashBook.AccountCurrency].Quantity += lastTradeProfit + ((averageHoldingsPrice * fill.AbsoluteFillQuantity));
}
else
{
//Increasing stock holdings, short to positive through zero, but only calc profit on stock we Buy.
lastTradeProfit = (averageHoldingsPrice - fill.FillPrice) * absoluteHoldingsQuantity;
//New cash += profitLoss + costOfAsset/leverage.
portfolio.CashBook[CashBook.AccountCurrency].Quantity += lastTradeProfit + ((averageHoldingsPrice * absoluteHoldingsQuantity));
}
closedPosition = true;
}
if (closedPosition)
{
//Update Vehicle Profit Tracking:
security.Holdings.AddNewProfit(lastTradeProfit);
security.Holdings.SetLastTradeProfit(lastTradeProfit);
portfolio.AddTransactionRecord(security.LocalTime.ConvertToUtc(security.Exchange.TimeZone), lastTradeProfit - 2 * feeThisOrder);
}
//UPDATE HOLDINGS QUANTITY, AVG PRICE:
//Currently NO holdings. The order is ALL our holdings.
if (quantityHoldings == 0)
{
//First transaction just subtract order from cash and set our holdings:
averageHoldingsPrice = fill.FillPrice;
quantityHoldings = fill.FillQuantity;
portfolio.CashBook[CashBook.AccountCurrency].Quantity -= (fill.FillPrice * Convert.ToDecimal(fill.AbsoluteFillQuantity));
}
else if (isLong)
{
//If we're currently LONG on the stock.
switch (fill.Direction)
{
case OrderDirection.Buy:
//Update the Holding Average Price: Total Value / Total Quantity:
averageHoldingsPrice = ((averageHoldingsPrice * quantityHoldings) + (fill.FillQuantity * fill.FillPrice)) / (quantityHoldings + (decimal)fill.FillQuantity);
//Add the new quantity:
//.........这里部分代码省略.........