public cOptimalPort(double[,] dWeights, int iPos, double dRisk, double dReturn, ISecurities cSecsCol, IErrorHandler cErrors, double Equity, double AdjCoeff, string CalcCurrency) { m_objErrorHandler = cErrors; m_iPortPos = iPos; m_dPortRisk = dRisk; m_dPortReturn = dReturn; try { cOptimalStaticCalcs op = new cOptimalStaticCalcs(); setSecuritiesCollection(cSecsCol, dWeights, Equity, AdjCoeff, CalcCurrency); m_dRateToRisk = m_dPortReturn / m_dPortRisk; m_dDiversification = op.getDiversificationValue(dWeights, cSecsCol, iPos, m_dPortRisk); double dSecValue; double dCurrCash; m_cash = 0; for (var i = 0; i < m_colSecurities.Count; i++) { dSecValue = Math.Floor(m_colSecurities[i].Quantity) * m_colSecurities[i].Price / AdjCoeff; dCurrCash = (m_colSecurities[i].Quantity - Math.Floor(m_colSecurities[i].Quantity)) * m_colSecurities[i].Price / AdjCoeff; // cash : sum - after making qty whole + cents/agorot of security value m_cash += dCurrCash + dSecValue - Math.Floor(dSecValue); } } catch (Exception ex) { m_objErrorHandler.LogInfo(ex); } }//constructor
}//calculateNewEfficientFrontier private void runEfficientFrontierModule(ISecurities cSecsCol) { // Runs the efficient frontier calculation try { // Initialize variables double[,] weightsMat; cOptimalStaticCalcs calcs = new cOptimalStaticCalcs(); // Constraints m_objConstraints.refreshConstList(); m_objConstraints.setConstraintValues(cSecsCol); // Parameters m_arrRatesVector = getRatesArrForScilab(cSecsCol); // Create rates array if ((m_arrRatesVector.Length == 0) || (m_arrCovarData == null)) { m_strEngineErrors = "Missing data"; m_objErrorHandler.LogInfo(m_strEngineErrors); return; } // Calculation List <double> colRisks = new List <double>(), colRates = new List <double>(); m_strEngineErrors = calcs.runOptimizationProcess(out colRisks, out colRates, out weightsMat, m_arrCovarData, m_arrRatesVector, m_objConstraints.DoubleUpperBound, m_objConstraints.DoubleLowerBound, m_objConstraints.DoubleEqualitySecs, m_objConstraints.DoubleEqualityValues, m_objConstraints.IntEqualityNum, m_objConstraints.Double_NonEqualitySecs, m_objConstraints.Double_NonEqualityValues, 0, cProperties.OptimalPorts); if ((m_strEngineErrors != "") || (colRisks.Count == 0) || (colRates.Count == 0)) { m_isSuccessfulCalc = false; return; } // Error in calculation // Set final variables m_dWeightsMatrix = weightsMat; setOptimalPortsCollection(cSecsCol, colRisks, colRates); setMainWeightsMatrix(weightsMat); if (m_colOptimalPorts.Count == 0) { m_isSuccessfulCalc = false; m_strEngineErrors = "Failed to calculate EF"; return; } } catch (Exception ex) { m_objErrorHandler.LogInfo(ex); } }//runEfficientFrontierModule