/// K-Ratio by Lars Kestner daily
///
public double KRatio
{
get
{
if (_KRatio == 0.0)
{
if (PosList.Count == 0)
return 0.0;
if (Bars == null)
Bars = PosList[0].Bars;
_TradeDays = 0;
double sumX = 0, sumY = 0, sumXY = 0, sumXSqr = 0, dayProfit = 0;
// прибыль по дням
List
DateTime dt = DateTime.MinValue;
for (int bar = 0; bar < this.Bars.Count; bar++)
{
if (dt == this.Bars.Date[bar].Date)
continue;
dt = this.Bars.Date[bar].Date;
// считаем дневную прибыль
foreach (Position p in PosList)
dayProfit += p.NetProfitAsOfDay(dt);
_TradeDays++;
Log.Out("Profit: " + dayProfit + " day: " + dt, LogLevel.debug);
DayEquity.Add(dayProfit);
sumXY += _TradeDays * dayProfit;
sumX += _TradeDays;
sumY += dayProfit;
sumXSqr += _TradeDays * _TradeDays;
}
_KRatio_B1 = (sumXY * _TradeDays - sumX * sumY) / (sumXSqr * _TradeDays - sumX * sumX);
double b0 = (sumY / _TradeDays) - _KRatio_B1 * (sumX / _TradeDays);
double YProjected = 0, SumResidSqr = 0, StandardErrB1Denom = 0;
for (int i = 1; i <= _TradeDays; i++)
{
YProjected = b0 + _KRatio_B1 * i;
SumResidSqr += Math.Pow(DayEquity[i - 1] - YProjected, 2);
StandardErrB1Denom += Math.Pow((double)i - (double)(_TradeDays + 1) / 2, 2);
}
double SigmaRegress = Math.Sqrt(SumResidSqr / (_TradeDays - 2));
_KRatio_StdErrB1 = SigmaRegress / Math.Sqrt(StandardErrB1Denom);
_KRatio = _KRatio_B1 / (_KRatio_StdErrB1 * _TradeDays);
}
return Math.Round(_KRatio, 3);
}
}