Öncelikle kendi açık emirlerimizi görebilmemiz için Binance'ın private API'sini kullanıyoruz. Ben epey sadeleştirdim buradaki amaca dönük olarak.
Bu dosyaya api.php adını verelim ve aşağıdaki kodu ekleyelim.
Bu dosyada herhangi bir değişikliğe gerek yok.
<?php
class Binance
{
public $btc_value = 0.00;
protected $base = "https://www.binance.com/api/", $api_key, $api_secret;
public function __construct($api_key, $api_secret)
{
$this->api_key = $api_key;
$this->api_secret = $api_secret;
}
public function openOrders($symbol)
{
return $this->signedRequest("v3/openOrders", ["symbol" => $symbol]);
}
private function request($url, $params = [])
{
$headers[] = "User-Agent: Mozilla/4.0 (compatible; PHP Binance API)\r\n";
$query = http_build_query($params, '', '&');
return json_decode($this->http_request($this->base . $url . '?' . $query, $headers), true);
}
public function http_request($url, $headers, $data = array())
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
if ($data) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_ENCODING, "");
$content = curl_exec($ch);
if (curl_errno($ch)) {
$content = false;
}
curl_close($ch);
return $content;
}
private function signedRequest($url, $params = [])
{
$headers[] = "User-Agent: Mozilla/4.0 (compatible; PHP Binance API)\r\nX-MBX-APIKEY: {$this->api_key}\r\n";
$params['timestamp'] = number_format(microtime(true) * 1000, 0, '.', '');
$query = http_build_query($params, '', '&');
$signature = hash_hmac('sha256', $query, $this->api_secret);
$endpoint = "{$this->base}{$url}?{$query}&signature={$signature}";
return json_decode($this->http_request($endpoint, $headers), true);
}
}
?>
Şimdide binance.php ya da adını ne isterseniz koyun, yeni bir php dosyası oluşturup içine aşağıdaki kodları giriyoruz.
<?php
require 'api.php';
//////////sadece bu 4 satir editlenecek///////////
$type = "BUY";
$api = "";
$secret ="";
$pair= "HOTBTC";
/////////////////////////////////////////////
//multidimentional arrayda arama fonksiyonu
function search($array, $key, $value)
{
$results = array();
if (is_array($array)) {
if (isset($array[$key]) && $array[$key] == $value) {
$results[] = $array;
}
foreach ($array as $subarray) {
$results = array_merge($results, search($subarray, $key, $value));
}
}
return $results;
}
$api = new Binance("api buraya", "secret buraya");
$openorders = $api->openOrders("{$pair}");
$yeni_array = search($openorders[0], "side", $type); // SATIŞ emri için SELL, alış emri için BUY diyoruz ve yeni bir array oluşturuyoruz.
$price = $yeni_array[0]['price']; // kendi satis fiyatimizi aldik.
if($price=='') {
echo "Acik {$type} Emri Yok<hr>";
} else {
echo "Girilen {$type} Emir Fiyati:" . $price . "<hr>";
}
//simdi orderbook listelemesi yapacagiz.
$link = "https://api.binance.com/api/v1/depth?symbol={$pair}&limit=1000";
$page = file_get_contents($link);
$response = json_decode($page, true);
//bids al emirleri
//asks sat emirleri
echo "<table border=1><tr><th>#</th><th>Fiyat</th><th>Adet</th></tr>";
$i=0;
foreach($response['asks'] AS $key) { // public orderları lsiteliyoruz
echo "<tr><td>{$i}</td><td>{$response['asks'][$i][0]}</td><td>{$response['asks'][$i][1]}</td></tr>";
//echo $i . "-)" . $response['asks'][$i][0] . " - " . $response['asks'][$i][1] . "<br>"; // fiyatini ve adedini bas
$count+=$response['asks'][$i][1]; // toplam alim adetlerini hesapla
if($response['asks'][$i][0]==$price) { // emirlerdeki fiyat ile kendi fiyatimiz eslesince, loopu durdur.
//echo "TOTAL:{$count}<hr>";
echo "<tr><td colspan=2>TOPLAM ADET</td><td>{$count}</td></tr>";
break;
}
$i++;
}
echo "</table>";
?>
Hepsi bu, kodu kendinize göre özelleştirebilirsiniz, ben vakit darlığından çokbasit şekilde ekrana yazdırdım sadece echo diyerek, siz daha güzel tablolar ile yapabilrisiniz.
Biraz daha zaman ayırarak kodun performasnı arttırılabilir, looplardan pek hoşlanmam genelde ama yazması en kısa şekli bu oldu şimdilik.
Eğer hâkimseniz, kendi fiyatınız ile orderbook arrayını karşılaştırıp gerekli verileri direk basan bir fonksiyon da yazabilirsiniz.
Buradaki işlem çok zor olmadığından performans olarak pek farkı yok ama daha temiz kodlama yapılabilir zamanınız varsa.
Karşınıza şöyle birşey çıkacak;