calc_utils.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package arbitrage
  2. import (
  3. "fmt"
  4. "github.com/shopspring/decimal"
  5. )
  6. func SimulationLevel2Path(path Path) {
  7. if path.Level != 2 {
  8. HistoryError(fmt.Sprintf("Level error. Need %v, but got %v.", 2, path.Level))
  9. return
  10. }
  11. fm0 := path.FmList[0]
  12. fm1 := path.FmList[1]
  13. // fee0, fee1
  14. fee0 := decimal.NewFromInt(fm0.Fee)
  15. fee1 := decimal.NewFromInt(fm1.Fee)
  16. decimalNumber1 := decimal.NewFromInt(1)
  17. decimalNumber1e6 := decimal.NewFromInt(1).Pow(decimal.NewFromInt(6))
  18. // F0 = 1 - fee0/1e6
  19. F0 := decimalNumber1.Sub(fee0.Div(decimalNumber1e6))
  20. // F1 = 1 - fee1/1e6
  21. F1 := decimalNumber1.Sub(fee1.Div(decimalNumber1e6))
  22. // B0, S0
  23. B0, _ := decimal.NewFromString(fm0.InReserve.String())
  24. S0, _ := decimal.NewFromString(fm0.OutReserve.String())
  25. // B1, S1
  26. B1, _ := decimal.NewFromString(fm1.InReserve.String())
  27. S1, _ := decimal.NewFromString(fm1.OutReserve.String())
  28. // F0 * F1 * S0
  29. part00 := F0.Mul(F1.Mul(S0))
  30. // B1 * F0
  31. part01 := B1.Mul(F0)
  32. // F0 * F1 * S0 + B1 * F0
  33. part0 := part00.Add(part01)
  34. // if F0*F1*S0 + B1*F0 == 0
  35. if part0.IntPart() == 0 {
  36. HistoryError(fmt.Sprintf("Is error part0. F0=%v, F1=%v, S0=%v, B1=%v, F0=%v.", F0, F1, S0, B1, F0))
  37. return
  38. }
  39. // B0 * B1
  40. part10 := B0.Mul(B1)
  41. // F0 * F1
  42. part11 := F0.Mul(F1)
  43. // S0 * S1
  44. part12 := S0.Mul(S1)
  45. // B0 * B1 * F0 * F1 * S0 * S1 ** 0.5
  46. part1 := part10.Mul(part11.Mul(part12)).Pow(decimal.NewFromFloat(0.5)).Sub(part10)
  47. // best input number
  48. I := part1.Div(part0)
  49. HistoryInfo(fmt.Sprintf("part0=%v, part1=%v, I=%v.", part0, part1, I))
  50. }