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'
<? function ConvertSatoshiToBTC($iSatoshi) { return bcdiv($iSatoshi, '100000000', 8); } function ConvertBTCToSatoshi($fBitcoins) { $fValue = bcmul($fBitcoins, '100000000', 10); return $iValue; } function ConvertPLNToGrosze($fPLN) { $fValue = bcmul($fPLN, '100000000', 8); return bcmul($fValue, '1', 0); } function ConvertGroszeToPLN($iGrosze) { $fValue = bcdiv($iGrosze, '100000000', 10); 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, $iUserCost) { $iOrderQty = CalculateOrderQty($iMarketPrice, $iUserCost); $iOrderCost = 0; $iOrderCost = bcmul($iOrderQty, $iMarketPrice, 10); $iOrderCost = bcdiv($iOrderCost, 100000000,10); return $iOrderCost; } // Zwraca ilosc ktora tak naprawde dostaje uzytkownik, potracona o prowizje function CalculateOrderQtyWithFee($iOrderQty, $fFee) { $fOrderQtyWithFee = bcmul($iOrderQty, $fFee, 10); $fOrderQtyWithFee = bcsub($iOrderQty, $fOrderQtyWithFee,10); return $iOrderQtyWithFee; } // Zwraca kwote za ktora sprzedamy podana przez uzytkownika ilosc BTC po podanej cenie na Gieldzie function CalculateSellOrder($iMarketPrice, $iUserSatoshi) { $iOrder = bcmul($iUserSatoshi, $iMarketPrice, 10); $iOrder = bcdiv($iOrder, 100000000,10); return $iOrder; } // Zwraca ilosc w groszach potracona o prowizje function CalculateSellOrderWithFee($iOrderPrice, $fFee) { $fOrderQtyWithFee = bcmul($iOrderPrice, $fFee, 10); $fOrderQtyWithFee = bcsub($iOrderPrice, $fOrderQtyWithFee,10); 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 "KWOTA ZA ILOSC W ZLECENIU: ".CalculateOrderCost($MarketPrice, $UserPrice)." (TYLE ZAPLACISZ)<BR>"; echo "TWOJA ILOSC PO PROWIZJI: ".CalculateOrderQtyWithFee(CalculateOrderQty($MarketPrice, $UserPrice),$MarketFee)."<BR>"; // Sell test //2015-11-14 12:22:40 Sprzedaż: 1342.0100 × 0.01035522 BTC = 13.8968 PLN $MarketPrice = 134201000000; $MarketFee = 0.0022; $UserBitcoins = 0.01035522; echo "SPRZEDASZ ZA: ".CalculateSellOrder($MarketPrice, ConvertBTCToSatoshi($UserBitcoins))." (PRZED PROWIZJA)<BR>"; echo "PO PROWIZJI: ".CalculateSellOrderWithFee(CalculateSellOrder($MarketPrice, ConvertBTCToSatoshi($UserBitcoins)), $MarketFee)."<BR>"; ?>
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
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.