Update SecurityMarginModel virtual fields to methods

This commit is contained in:
Michael Handschuh
2016-02-12 11:23:28 -05:00
parent 10ce1e61c1
commit 7c20419367
+10 -12
View File
@@ -29,19 +29,17 @@ namespace QuantConnect.Securities
/// <summary>
/// The percentage of an order's absolute cost that must be held in free cash in order to place the order
/// </summary>
protected virtual decimal InitialMarginRequirement
protected virtual decimal GetInitialMarginRequirement(Security security)
{
get { return _initialMarginRequirement; }
set { _initialMarginRequirement = value; }
return _initialMarginRequirement;
}
/// <summary>
/// The percentage of the holding's absolute cost that must be held in free cash in order to avoid a margin call
/// </summary>
protected virtual decimal MaintenanceMarginRequirement
protected virtual decimal GetMaintenanceMarginRequirement(Security security)
{
get { return _maintenanceMarginRequirement; }
set { _maintenanceMarginRequirement = value; }
return _maintenanceMarginRequirement;
}
/// <summary>
@@ -89,7 +87,7 @@ namespace QuantConnect.Securities
/// <returns>The current leverage in the security</returns>
public virtual decimal GetLeverage(Security security)
{
return 1/MaintenanceMarginRequirement;
return 1/GetMaintenanceMarginRequirement(security);
}
/// <summary>
@@ -108,8 +106,8 @@ namespace QuantConnect.Securities
}
decimal margin = 1/leverage;
InitialMarginRequirement = margin;
MaintenanceMarginRequirement = margin;
_initialMarginRequirement = margin;
_maintenanceMarginRequirement = margin;
}
/// <summary>
@@ -124,7 +122,7 @@ namespace QuantConnect.Securities
//Market order is approximated from the current security price and set in the MarketOrder Method in QCAlgorithm.
var orderFees = security.FeeModel.GetOrderFee(security, order);
return order.GetValue(security)*InitialMarginRequirement + orderFees;
return order.GetValue(security)*GetInitialMarginRequirement(security) + orderFees;
}
/// <summary>
@@ -134,7 +132,7 @@ namespace QuantConnect.Securities
/// <returns>The maintenance margin required for the </returns>
public virtual decimal GetMaintenanceMargin(Security security)
{
return security.Holdings.AbsoluteHoldingsCost*MaintenanceMarginRequirement;
return security.Holdings.AbsoluteHoldingsCost*GetMaintenanceMarginRequirement(security);
}
/// <summary>
@@ -207,7 +205,7 @@ namespace QuantConnect.Securities
decimal delta = totalMargin - netLiquidationValue;
// compute the number of shares required for the order, rounding up
int quantity = (int) (Math.Round(delta/security.Price, MidpointRounding.AwayFromZero) / MaintenanceMarginRequirement);
int quantity = (int) (Math.Round(delta/security.Price, MidpointRounding.AwayFromZero) / GetMaintenanceMarginRequirement(security));
// don't try and liquidate more share than we currently hold, minimum value of 1, maximum value for absolute quantity
quantity = Math.Max(1, Math.Min((int)security.Holdings.AbsoluteQuantity, quantity));