private static decimal CalclateNecessaryWhenExistsVolumeNecessaryDetails(this Settings.VolumeNecessary volumeNecessary, decimal netLot, decimal tradePolicyMargin, bool isNight) { decimal necessary = 0m; int detailCount = volumeNecessary.VolumeNecessaryDetails.Count; int i = 0; while (i < volumeNecessary.VolumeNecessaryDetails.Count) { var volumeNecessaryDetail = volumeNecessary.VolumeNecessaryDetails[i]; if (i == 0) { necessary = Math.Min(netLot, volumeNecessaryDetail.From) * tradePolicyMargin; } ++i; if (netLot > volumeNecessaryDetail.From) { decimal margin = volumeNecessaryDetail.GetMargin(isNight); if (i < detailCount) { var nextDetail = volumeNecessary.VolumeNecessaryDetails[i]; decimal lot1 = netLot - volumeNecessaryDetail.From; decimal lot2 = nextDetail.From - volumeNecessaryDetail.From; decimal lot = Math.Min(lot1, lot2); necessary += lot * margin; } else { necessary += (netLot - volumeNecessaryDetail.From) * margin; } } } return(necessary); }
private static decimal CalculateNecessaryForFlat(this Settings.VolumeNecessary volumeNecessary, decimal netLot, decimal tradePolicyMargin, bool isNight) { var detail = volumeNecessary.GetMaxFromDetail(netLot); if (detail == null) { return(netLot * tradePolicyMargin); } else { return(netLot * detail.GetMargin(isNight)); } }
private static Settings.VolumeNecessaryDetail GetMaxFromDetail(this Settings.VolumeNecessary volumeNecessary, decimal netLot) { if (volumeNecessary.VolumeNecessaryDetails.Count == 0) { return(null); } Settings.VolumeNecessaryDetail result = null; decimal maxFrom = decimal.MinValue; foreach (var eachDetail in volumeNecessary.VolumeNecessaryDetails) { if (eachDetail.From < netLot && maxFrom < eachDetail.From) { maxFrom = eachDetail.From; result = eachDetail; } } return(result); }