public static void Main()
var inputBaseAmount = 3000000;
var inputBaseCurrency = "GBP";
var interbankRate = 0.91691;
var eurAccountBalance = 21411.46;
var executionDate = new DateTimeOffset(2020, 12, 21, 23, 59, 59, TimeSpan.Zero);
var valueDate = new DateTimeOffset(2020, 12, 30, 23, 59, 59, TimeSpan.Zero);
var inputCurrencyBucket = "A";
var percentage = 1.0/100;
Console.WriteLine("!!!!Double check that you got from static table the percentage for currency bucket " + inputCurrencyBucket +
" and tenor of: " + CalculateTenor(executionDate, valueDate)+ " month(s)");
Console.WriteLine("**********");
var initialBalance = CalculateInitialMargin(inputBaseAmount, percentage, interbankRate);
Console.WriteLine("Initial Margin of " + inputBaseAmount + inputBaseCurrency + " is: " +
var amountToFund = CalculateAmountToFund(initialBalance, eurAccountBalance);
Console.WriteLine("Initial Balance Amount to fund is: " + amountToFund + "EUR");
private static double CalculateAmountToFund (double initialBalance, double balance)
return Math.Abs(Math.Round(balance-initialBalance,2));
private static double CalculateInitialMargin (double amount, double percentage, double interbankRate)
return CheckForMinimum(Math.Round(amount*percentage/interbankRate,2));
private static double CheckForMinimum(double initialMargin)
if(initialMargin<=5.0) return 5.0;
else return initialMargin;
private static int CalculateTenor(DateTimeOffset executionDate, DateTimeOffset valueDate)
var deltaExecutionDateValueDate = Math.Abs((executionDate - valueDate).TotalDays);
if(deltaExecutionDateValueDate<=30) {return 1;}
else if(deltaExecutionDateValueDate>30 && deltaExecutionDateValueDate<=90) {return 3;}
else if(deltaExecutionDateValueDate>90 && deltaExecutionDateValueDate<=180) {return 6;}
else if(deltaExecutionDateValueDate>180 && deltaExecutionDateValueDate<=360) {return 12;}