/// <summary> /// 如果当前节点Tick结束,就继续下一个节点 /// </summary> public override BtResult Tick() { if (m_curActiveChild == null) { m_curActiveChild = m_children[0]; m_curActiveIndex = 0; } BtResult result = m_curActiveChild.Tick(); if (result == BtResult.Ended) { m_curActiveIndex++; if (m_curActiveIndex >= m_children.Count) { m_curActiveChild.Clear(); m_curActiveChild = null; m_curActiveIndex = -1; } else { m_curActiveChild.Clear(); m_curActiveChild = m_children[m_curActiveIndex]; result = BtResult.Running; } } return(result); }
public BtResult CalculateBtK0(double K) { BtResult bt = new BtResult(); bt.Result.Value = K; return(bt); }
public BtResult CalculateBtK1(double r, double sigma, double t, double K, double S, int n, double T) { BtResult bt = new BtResult(); bt.IntegralPointD1 = _integralPoints.CalculateIntegralPointD1(K, K, r, sigma, t); bt.IntegralPointD2 = _integralPoints.CalculateIntegralPointD2(bt.IntegralPointD1, sigma, t); bt.Distribution = _distribution.CumulativeDistribution(bt.IntegralPointD1.Result.Value); bt.a = CalculateAValue(sigma, t); bt.Result.Value = CalculateBtK1(sigma, K, r, t, bt); return(bt); }
public async Task <BtResult> CalculateBtKAsync(double r, double sigma, double t, double K, double S, int n, double T, double BtK_1) { BtResult bt = new BtResult(); bt.IntegralPointD1 = _integralPoints.CalculateIntegralPointD1(BtK_1, K, r, sigma, t); bt.IntegralPointD2 = _integralPoints.CalculateIntegralPointD2(bt.IntegralPointD1, sigma, t); bt.Distribution = _distribution.CumulativeDistribution(bt.IntegralPointD1.Result.Value); bt.a = CalculateAValue(sigma, t); bt.IntegralFunction = await _btIntegralFunction.CalculateAsync(n, T, r, sigma, t, bt.IntegralPointD2); bt.Result.Value = CalculateBtValue(sigma, K, r, t, bt); return(bt); }
/// <summary> /// 如果当前节点tick完成就清除 /// </summary> public override BtResult Tick() { if (m_curActiveChild == null) { return(BtResult.Ended); } BtResult result = m_curActiveChild.Tick(); if (result == BtResult.Ended) { m_curActiveChild.Clear(); m_curActiveChild = null; } return(result); }
public override BtResult Tick() { BtResult result = BtResult.Ended; if (m_state == BtActionState.Ready) { Enter(); m_state = BtActionState.Running; } if (m_state == BtActionState.Running) { result = Execute(); if (result != BtResult.Running) { Exit(); m_state = BtActionState.Ready; } } return(result); }
private static double CalculateBtValue(double sigma, double K, double r, double t, BtResult Bt) { return((1 / (Bt.Distribution + Bt.a * Math.Exp(-0.5 * Math.Pow(Bt.IntegralPointD1.Result.Value, 2)))) * (Bt.a * K * Math.Exp(-((r * t) + (0.5 * Math.Pow(Bt.IntegralPointD2.Result.Value, 2))))) + (r * K * Bt.IntegralFunction.Result.Value)); }
private static double CalculateBtK1(double sigma, double K, double r, double t, BtResult Bt) { return((K * (1 / (Bt.Distribution + Bt.a * Math.Exp(-0.5 * Math.Pow(Bt.IntegralPointD1.Result.Value, 2))))) * (Bt.a * Math.Exp(-((r * t) + (0.5 * Math.Pow(Bt.IntegralPointD2.Result.Value, 2))))) + (((2 * sigma * r) / ((2 * r) + (Math.Pow(sigma, 2))) * (2 * Bt.Distribution) - 1))); }
public async Task <PutResult> CalculateAsync(double K, double S, double r, double t, double sigma, int n, double T, BtResult Btksi) { PutResult put = new PutResult(); put.EuropeanPut = _europeanPut.Calculate(K, S, r, t, sigma); put.PutIntegralFunction = await _putIntegralFunction.CalculateAsync(n, T, r, sigma, t, S, K, Btksi); put.Result.Value = put.EuropeanPut.Result.Value + put.PutIntegralFunction.Result.Value; return(put); }
public async Task <IntegralFunction> CalculateAsync(int n, double T, double r, double sigma, double t, double S, double K, BtResult Btksi) { IntegralFunction integralFunction = new IntegralFunction(); UnderIntegral[] underIntegral = new UnderIntegral[n]; for (int i = 0; i < n; i++) { UnderIntegral ui = new UnderIntegral(); ui.h = (T / n); ui.ksi = i * ui.h; ui.IntegralPointD1 = _integralPoints.CalculateIntegralPointD1(S, Btksi.Result.Value, r, sigma, t - ui.ksi); ui.IntegralPointD2 = _integralPoints.CalculateIntegralPointD2(ui.IntegralPointD1, sigma, t - ui.ksi); ui.Distribution = _distribution.CumulativeDistribution(-ui.IntegralPointD2.Result.Value); ui.Result.Value = CalculateUnderIntegral(r, K, t, ui.ksi, ui.Distribution) * ui.h; underIntegral[i] = ui; integralFunction.Result.Value += ui.Result.Value; } integralFunction.UnderIntegral = underIntegral; return(integralFunction); }