Update SecurityMarginModel virtual fields to methods
This commit is contained in:
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user