Кстати, очень неправильно и опасно считать курс по последним сделкам, особенно когда обороты магазина будут заметно ниже ликвидности рынка (а у рынка bitcoin очень слабая ликвидность).
особенно это важно, когда магазин выходит в фиатные валюты сразу при получении суммы в bitcoin. Так же, речь ведь идет о фиате, а это значит географическая привязка, а также выбор платежной системы, в которой будет храниться средства, все это определяет обменную биржу, что тоже влияет на курс (сравните курсы btc-e и mtgox).
Смотреть надо стакан, тип операции (купля или продажа) и совокупный объем средств, который, возможно, будет участвовать в сделке! Просто необходимо посчитать, сколько ордеров и с каким объемом будут использованы в стакане, для того чтобы купить или продать необходимый объем.
Что то типа такого:
...
// get market data
$depth=get($this->market_depth_link($base_currency,$quote_currency));
$validation_result=check_valid_depth($depth)
if($validation_result->isWarning()) return $last_depth; // todo: parse warnings
if($validation_result->isError()) throw Error('market depth validation',$validation_result);
// sort bids and asks, btc-e format
usort($depth->asks,function($a,$b){if ($a[0]==$b[0]) return 0;return ((double)$a[0]<(double)$b[0])?-1:1;});
usort($depth->bids,function($a,$b){if ($a[0]==$b[0]) return 0;return ((double)$a[0]<(double)$b[0])?1:-1;});
....
function depth_price($o_askbids,$amount)
{ // how many amount $amount btc can be sold or buyed at once, function return real price
$askbid_quote=0;
$askbid_base=$amount;
foreach($o_askbids as $askbid) if($askbid[1]>0)
{
$base=$askbid[0]*$askbid[1];
if($base<$amount)
{ // depth position are not enought, come to next
$askbid_quote+=$askbid[1];
$amount-=$base;
} else
{ // a last depth position, cut them
$askbid_quote+=$amount/$askbid[0];
$amount=0;
break;
}
}
// todo: check if there is enough bids or asks for desired $amount for warning
$askbid_base-=$amount;
return $askbid_base/$askbid_quote;
}
p.s. кстати и это еще ничего не гарантирует, во время сильной движухи, достаточно крупный ордер может просто не успеть выполниться, плюс биржа может мухлевать или особенности кривого алгоритма (например вставить/удалить ордер, пока будет исполняться ваш)