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.
Zacznijmy od wyliczenia, ilości BTC które kupie bez prowizji. Zakładam że to jest podstawa do wyliczania reszty, zatem prośba o sprawdzenie czy faktycznie dobrze to robie
Kod: Zaznacz cały
<?
function ConvertSatoshiToBTC($iSatoshi)
{
return bcdiv($iSatoshi, '100000000', 8);
}
function ConvertBTCToSatoshi($fBitcoins)
{
$fValue = bcmul($fBitcoins, '100000000', 10);
$iValue = round($fValue,8);
return $iValue;
}
function ConvertPLNToGrosze($fPLN)
{
$fValue = bcmul($fPLN, '100000000', 8);
return bcmul($fValue, '1', 0);
}
function ConvertGroszeToPLN($iGrosze)
{
$fValue = bcdiv($iGrosze, '100000000', 10);
$fValue = round($fValue,8);
return $fValue;
}
// Wylicza ile kupimy BTC za podana kwote
// Dzielimy ilosc groszy, ktore wplaca uzytkownik przez cene w groszach na gieldzie
function CalculateOrderQty($iMarketPrice, $iUserPrice)
{
$fOrderQty = 0;
$fOrderQty = bcdiv($iUserPrice, $iMarketPrice, 8);
return ConvertBTCToSatoshi($fOrderQty);
}
// Tutaj liczymy ile tak na prawde kosztuje nas zlecenie zakupu na taka ilosc BTC
function CalculateOrderCost($iMarketPrice, $iOrderQty)
{
$fQtyInBTC = ConvertSatoshiToBTC($iOrderQty);
tyWithFee = bcsub($iOrderPrice, $fOrderQtyWithFee,10);
$iOrderQtyWithFee = round($fOrderQtyWithFee,0);
return $iOrderQtyWithFee;
}
// Buy Test
//2015-11-14 13:22:30 Kupno: 1343.9998 × 0.01041666 BTC = 14.0000 PLN
$MarketPrice = 134399980000;
$MarketFee = 0.0022;
$UserPrice = 1400000000;
echo "<B>BUY TEST</B><BR>";
echo "CENA GIELDY: ".$MarketPrice."<BR>";
echo "TWOJA WPLATA: ".$UserPrice."<BR>";
echo "ILOSC W ZLECENIU: ".CalculateOrderQty($MarketPrice, $UserPrice)."<BR>";
echo "KWOTA ZA ILOSC W ZLECENIU: ".CalculateOrderCost($MarketPrice, CalculateOrderQty($MarketPrice, $UserPrice))." (TYLE ZAPLACISZ)<BR>";
echo "PROWIZJA: ".$MarketFee."<BR>";
echo "TWOJA ILOSC PO PROWIZJI: ".CalculateOrderQtyWithFee(CalculateOrderQty($MarketPrice, $UserPrice),$MarketFee)."<BR>";
echo "<HR>";
// Sell test
//2015-11-14 12:22:40 Sprzedaż: 1342.0100 × 0.01035522 BTC = 13.8968 PLN
$MarketPrice = 134201000000;
$MarketFee = 0.0022;
$UserBitcoins = ConvertBTCToSatoshi(0.01035522);
echo "<B>SELL TEST</B><BR>";
echo "CENA GIELDY: ".$MarketPrice."<BR>";
echo "TWOJE BTC: ".$UserBitcoins." (TYLE SPRZEDAJESZ)<BR>";
echo "SPRZEDASZ ZA: ".CalculateSellOrder($MarketPrice, $UserBitcoins)." (PRZED PROWIZJA)<BR>";
echo "PROWIZJA: ".$MarketFee."<BR>";
echo "PO PROWIZJI: ".CalculateSellOrderWithFee(CalculateSellOrder($MarketPrice, $UserBitcoins), $MarketFee)."<BR>";
?>
Wynik
Wygląda na to że działa OK, może się przyda komuś.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: 1035522 (TYLE SPRZEDAJESZ)
SPRZEDASZ ZA: 1389680879 (PRZED PROWIZJA)
PROWIZJA: 0.0022
PO PROWIZJI: 1386623581