Cześć, dopiero się ucze stąd z góry prośba o wyrozumiałość i o pomoc.

Postawiłem sobie małe zadanie, prosty przelicznik cen ze sprzedaży i kupna BTC - który bierze pod uwagę prowizje na giełdach.

[ZAKUP]
Podajesz mu cene na giełdzie,
podajesz mu za jaką kwotę chcesz kupić BTC,
podajesz mu prowizję,
wypluwa Ci ile kupisz BTC.

[SPRZEDAZ]
Podajesz mu cene na giełdzie,
podajesz mu ile chcesz sprzedać BTC
podajesz mu prowizję,
wypluwa Ci ile zyskujesz PLN

Sam temat wydaje się być bardzo prosty, ale robie to całkowicie sam i pomyślałem, że pomożecie w tych dwóch tematach.
A więc do dzieła, najpierw ZAKUP. Ubzdurałem sobie, że wszystkie wartości trzymam z dokładnością do 8 miejsca po przecinku, zatem zarówno PLNy jak i BTC mnoże i dziele przez 100000000. Doczytałem już, że do tych celów powinienem używać bcmath, stąd też tak wygląda moja implementacja.

Tam gdzie wartosc podaje jako integer, stosuje przedrostek 'i', tam gdzie spodziewam sie floata przedrostkiem jest litera 'f'
  1. <?
  2. function ConvertSatoshiToBTC($iSatoshi)
  3. {
  4. return bcdiv($iSatoshi, '100000000', 8);
  5. }
  6. function ConvertBTCToSatoshi($fBitcoins)
  7. {
  8. $fValue = bcmul($fBitcoins, '100000000', 10);
  9. $iValue = round($fValue,8);
  10. return $iValue;
  11. }
  12. function ConvertPLNToGrosze($fPLN)
  13. {
  14. $fValue = bcmul($fPLN, '100000000', 8);
  15. return bcmul($fValue, '1', 0);
  16. }
  17. function ConvertGroszeToPLN($iGrosze)
  18. {
  19. $fValue = bcdiv($iGrosze, '100000000', 10);
  20. $fValue = round($fValue,8);
  21. return $fValue;
  22. }
  23.  
  24. // Wylicza ile kupimy BTC za podana kwote
  25. // Dzielimy ilosc groszy, ktore wplaca uzytkownik przez cene w groszach na gieldzie
  26. function CalculateOrderQty($iMarketPrice, $iUserPrice)
  27. {
  28. $fOrderQty = 0;
  29. $fOrderQty = bcdiv($iUserPrice, $iMarketPrice, 8);
  30. return ConvertBTCToSatoshi($fOrderQty);
  31. }
  32. // Tutaj liczymy ile tak na prawde kosztuje nas zlecenie zakupu na taka ilosc BTC
  33. function CalculateOrderCost($iMarketPrice, $iUserCost)
  34. {
  35. $iOrderQty = CalculateOrderQty($iMarketPrice, $iUserCost);
  36. $iOrderCost = 0;
  37. $iOrderCost = bcmul($iOrderQty, $iMarketPrice, 10);
  38. $iOrderCost = bcdiv($iOrderCost, 100000000,10);
  39. $iOrderCost = round($iOrderCost, 0);
  40. return $iOrderCost;
  41. }
  42. // Zwraca ilosc ktora tak naprawde dostaje uzytkownik, potracona o prowizje
  43. function CalculateOrderQtyWithFee($iOrderQty, $fFee)
  44. {
  45. $fOrderQtyWithFee = bcmul($iOrderQty, $fFee, 10);
  46. $fOrderQtyWithFee = bcsub($iOrderQty, $fOrderQtyWithFee,10);
  47. $iOrderQtyWithFee = round($fOrderQtyWithFee,0);
  48. return $iOrderQtyWithFee;
  49. }
  50. // Zwraca kwote za ktora sprzedamy podana przez uzytkownika ilosc BTC po podanej cenie na Gieldzie
  51. function CalculateSellOrder($iMarketPrice, $iUserSatoshi)
  52. {
  53. $iOrder = bcmul($iUserSatoshi, $iMarketPrice, 10);
  54. $iOrder = bcdiv($iOrder, 100000000,10);
  55. $iOrder = round($iOrder, 0);
  56. return $iOrder;
  57. }
  58. // Zwraca ilosc w groszach potracona o prowizje
  59. function CalculateSellOrderWithFee($iOrderPrice, $fFee)
  60. {
  61. $fOrderQtyWithFee = bcmul($iOrderPrice, $fFee, 10);
  62. $fOrderQtyWithFee = bcsub($iOrderPrice, $fOrderQtyWithFee,10);
  63. $iOrderQtyWithFee = round($fOrderQtyWithFee,0);
  64. return $iOrderQtyWithFee;
  65.  
  66. }
  67.  
  68.  
  69.  
  70.  
  71. // Buy Test
  72. //2015-11-14 13:22:30 Kupno: 1343.9998 × 0.01041666 BTC = 14.0000 PLN
  73. $MarketPrice = 134399980000;
  74. $MarketFee = 0.0022;
  75. $UserPrice = 1400000000;
  76.  
  77. echo "<B>BUY TEST</B><BR>";
  78. echo "CENA GIELDY: ".$MarketPrice."<BR>";
  79. echo "TWOJA WPLATA: ".$UserPrice."<BR>";
  80. echo "ILOSC W ZLECENIU: ".CalculateOrderQty($MarketPrice, $UserPrice)."<BR>";
  81. echo "KWOTA ZA ILOSC W ZLECENIU: ".CalculateOrderCost($MarketPrice, $UserPrice)." (TYLE ZAPLACISZ)<BR>";
  82. echo "PROWIZJA: ".$MarketFee."<BR>";
  83. echo "TWOJA ILOSC PO PROWIZJI: ".CalculateOrderQtyWithFee(CalculateOrderQty($MarketPrice, $UserPrice),$MarketFee)."<BR>";
  84.  
  85. echo "<HR>";
  86.  
  87. // Sell test
  88. //2015-11-14 12:22:40 Sprzedaż: 1342.0100 × 0.01035522 BTC = 13.8968 PLN
  89. $MarketPrice = 134201000000;
  90. $MarketFee = 0.0022;
  91. $UserBitcoins = 0.01035522;
  92.  
  93. echo "<B>SELL TEST</B><BR>";
  94. echo "CENA GIELDY: ".$MarketPrice."<BR>";
  95. echo "TWOJE BTC: ".$UserBitcoins." (TYLE SPRZEDAJESZ)<BR>";
  96. echo "SPRZEDASZ ZA: ".CalculateSellOrder($MarketPrice, ConvertBTCToSatoshi($UserBitcoins))." (PRZED PROWIZJA)<BR>";
  97. echo "PO PROWIZJI: ".CalculateSellOrderWithFee(CalculateSellOrder($MarketPrice, ConvertBTCToSatoshi($UserBitcoins)), $MarketFee)."<BR>";
  98.  
  99.  
  100.  
  101. ?>

Wynik

Cytat
BUY TEST
CENA GIELDY: 134399980000
TWOJA WPLATA: 1400000000
ILOSC W ZLECENIU: 1041666
KWOTA ZA ILOSC W ZLECENIU: 1399998896 (TYLE ZAPLACISZ)
PROWIZJA: 0.0022
TWOJA ILOSC PO PROWIZJI: 1039374


SELL TEST
CENA GIELDY: 134201000000
TWOJE BTC: 0.01035522 (TYLE SPRZEDAJESZ)
SPRZEDASZ ZA: 1389680879 (PRZED PROWIZJA)
PO PROWIZJI: 1386623581


Pozwole sobie aktualizować wątek w miare rozwoju programu.