query($sql); if ($result->num_rows > 0) { // 输出数据 while ($row = $result->fetch_assoc()) { echo "ID: " . $row["id"] . $br; echo "UID: " . $row["UID"] . $br; echo "Switch: " . $row["switch"] . $br; echo "Coin: " . $row["coin"] . $br; $coin = $row["coin"]; echo "coin: " . $coin . $br; //**這邊開始 */ if ($row["switch"] == 1) { $apiKeys = getApiKeys($link, 'bitfinex', $row["UID"]); $apiKey = $apiKeys['apiKey']; $secret = $apiKeys['secret']; cancelAllFundingOffers($row["coin"]); //***********請求/* 註記 */ $start_time1 = microtime(true); // 開始時間 // 呼叫 authenticateWebSocket 函式 $authResult = authenticateWebSocket($coin, $apiKey, $secret); //***********請求/* 註記 */ $end_time1 = microtime(true); // 結束時間 $execution_time = $end_time1 - $start_time1; // 計算執行時間 echo "程式執行時間: $execution_time 秒" . $br; // 輸出執行時間 $wss = $authResult['wss']; if (isset($authResult['asset'][0][2][2]) && isset($authResult['asset'][0][2][4])) { $tot = $authResult['asset'][0][2][2]; $ava = $authResult['asset'][0][2][4]; } else { // 处理键不存在的情况 $tot = 0; // 或者一些默认值 $ava = 0; // 或者一些默认值 } $fcsData = $authResult['fcsData']; // echo "
";
// print_r($fcsData);
// echo "";
if ($tot != 0) {
$compRate = 1 - ($ava / $tot);
} else {
$compRate = 0;
}
echo "tot: " . $tot . $br;
echo "ava: " . $ava . $br;
echo "compRate: " . $compRate . $br;
$ava = $ava - $row["reserveamount"];
$ava = floor($ava * 10) / 10; //無條件捨去到小數點第一位
echo "扣完保留數量可用: " . $ava . $br;
// 計算基礎掛單金額(每筆掛單的金額)
$unitAmount = floor(max($tot / 200, 152) * 10) / 10; //無條件捨去到小數點第一位
echo "基礎掛單金額: {$unitAmount} " . $br;
// 根据 $row["coin"] 的值设置 frr 的值
if ($row["coin"] === 'USD') {
$frr = $row_usd['frr'];
$ra01 = $row_usd['ra01'];
$ra02 = $row_usd['ra02'];
$ra03 = $row_usd['ra03'];
$ra04 = $row_usd['ra04'];
$ra05 = $row_usd['ra05'];
$hungry_avg = $row_usd['ra01'] * 0.9;
$hungry_max = $row_usd['ra02'] * 0.9;
} elseif ($row["coin"] === 'UST') {
$frr = $row_ust['frr'];
$ra01 = $row_ust['ra01'];
$ra02 = $row_ust['ra02'];
$ra03 = $row_ust['ra03'];
$ra04 = $row_ust['ra04'];
$ra05 = $row_ust['ra05'];
$hungry_avg = $row_ust['ra01'] * 0.9;
$hungry_max = $row_ust['ra02'] * 0.9;
}
$radiff=(($ra02-$ra01)/10);
$ra01 = $ra01 + $radiff;
if ($ra01 <= R2f(6)) {
$ra01 = R2f(6);
if ($ra02 <= R2f(7.1)) {
$ra02 = R2f(7.1);
}
}
if ($ra04 >= R2f(24)) { //如果US06大於20%//瘋狗浪模式
$numOrders = 16; //拆成6單
for ($i = 1; $i <= $numOrders; $i++) {
if ($ava >= $unitAmount) {
$rate = number_format(R2f(24) + ($i - 1) * (($ra04 - R2f(24)) / ($numOrders - 1)), 8); //從低24往高 遞增掛單
echo "瘋狗 " . ($i) . " RATE: [[ " . number_format($rate * 36500, 2) . " ]]";
// $response = submitFundingOffer($apiKey, $secret, 'LIMIT', $coin, strval($unitAmount), $rate, calculatePeriod($rate), $ava);
websocket_Offer($wss, $coin, strval($unitAmount), $rate, calculatePeriod($rate), $ava);
} elseif ($ava > 150) {
$rate = number_format(R2f(24) + ($i - 1) * (($ra04 - R2f(24)) / ($numOrders - 1)), 8);
echo "瘋狗 " . ($i) . " RATE: [[ " . number_format($rate * 36500, 2) . " ]]";
// $response = submitFundingOffer($apiKey, $secret, 'LIMIT', $coin, strval($ava), $rate, calculatePeriod($rate), $ava);
websocket_Offer($wss, $coin, strval($ava), $rate, calculatePeriod($rate), $ava);
}
} //for
} elseif (($ra04 >= R2f(15)) && ($ra04 <= R2f(24))) { //如果US06=15~24 一般高利 06可能要重新定義為 30天以上到 平均~最高/4+1
$numOrders = 16; //拆成6單
for ($i = 1; $i <= $numOrders; $i++) {
if ($ava >= $unitAmount) {
$rate = number_format($ra04 - ($i - 1) * (($ra04 - $ra03) / ($numOrders - 1)), 8); //從高24往低 遞減掛單
echo "小狗 " . ($i) . " RATE: [[ " . number_format($rate * 36500, 2) . " ]]";
// $response = submitFundingOffer($apiKey, $secret, 'LIMIT', $coin, strval($unitAmount), $rate, calculatePeriod($rate), $ava);
websocket_Offer($wss, $coin, strval($unitAmount), $rate, calculatePeriod($rate), $ava);
} elseif ($ava > 150) {
$rate = number_format($ra04 - ($i - 1) * (($ra04 - $ra03) / ($numOrders - 1)), 8);
echo "小狗 " . ($i) . " RATE: [[ " . number_format($rate * 36500, 2) . " ]]";
// $response = submitFundingOffer($apiKey, $secret, 'LIMIT', $coin, strval($ava), $rate, calculatePeriod($rate), $ava);
websocket_Offer($wss, $coin, strval($ava), $rate, calculatePeriod($rate), $ava);
}
} //for
}
// else {
// $planC = R2f(floor(min(24, max(15, f2R($ra05))))); //這是一個相當神奇的函數...反正就是取整數15~24轉換成日利率
// $planD = strval($planC * 0.9);
// if ($ava >= $unitAmount) {
// echo "寶貝狗 RATE: [[ " . number_format($planC * 36500, 2) . " ]]";
// websocket_Offer($wss, $coin, strval($unitAmount), $planC, calculatePeriod($planC), $ava);
// } elseif ($ava > 150) {
// websocket_Offer($wss, $coin, strval($ava), $planC, calculatePeriod($planC), $ava);
// }
// if ($ava >= $unitAmount) {
// echo "寶貝狗 RATE: [[ " . number_format($planD * 36500, 2) . " ]]";
// websocket_Offer($wss, $coin, strval($unitAmount), $planD, calculatePeriod($planD), $ava);
// } elseif ($ava > 150) {
// websocket_Offer($wss, $coin, strval($ava), $planD, calculatePeriod($planD), $ava);
// }
// }
else {
// $planC = R2f(floor(min(24, max(14, f2R($ra05))))); //這是一個相當神奇的函數...反正就是取整數15~24轉換成日利率
$planC = R2f(min(24, max(14.98, f2R($ra05)))); //這是一個相當神奇的函數...反正就是取整數15~24轉換成日利率
echo $planC;
$numOrders = 4; //拆成4單
for ($i = 1; $i <= $numOrders; $i++) {
if ($ava >= $unitAmount) {
$rate = number_format($planC - ($i - 1) * (($planC - R2f(14.98)) / ($numOrders - 1)), 8); //從高24往低 遞減掛單
echo "寶貝狗 " . ($i) . " RATE: [[ " . number_format($rate * 36500, 2) . " ]]";
// $response = submitFundingOffer($apiKey, $secret, 'LIMIT', $coin, strval($unitAmount), $rate, calculatePeriod($rate), $ava);
websocket_Offer($wss, $coin, strval($unitAmount), $rate, calculatePeriod($rate), $ava);
} elseif ($ava > 150) {
$rate = number_format($planC - ($i - 1) * (($planC - R2f(14.98)) / ($numOrders - 1)), 8);
echo "寶貝狗 " . ($i) . " RATE: [[ " . number_format($rate * 36500, 2) . " ]]";
// $response = submitFundingOffer($apiKey, $secret, 'LIMIT', $coin, strval($ava), $rate, calculatePeriod($rate), $ava);
websocket_Offer($wss, $coin, strval($ava), $rate, calculatePeriod($rate), $ava);
}
} //for
}
// if ($compRate > 0.7) {
$numOrders = 12; //拆成12單
$amountPerOrder = floor($ava / $numOrders * 10) / 10; //無條件捨去到小數點第一位
// 如果每单金额小于 150,则设为 150
if ($amountPerOrder < 150) {
$amountPerOrder = 151;
}
// if (calculatePeriod($ra01) == 2) {
// websocket_Offer($wss, $coin, strval($amountPerOrder), $ra01, 3, $ava);
// echo "短單A RATE: [[ " . number_format($ra01 * 36500, 2) . " ]]";
// }
for ($i = 1; $i <= $numOrders; $i++) {
if ($ava >= $amountPerOrder) {
// $rate = number_format($ra01 + ($i - 1) * (($ra02 - $ra01) / ($numOrders - 1)), 8); //遞增
$rate = number_format($ra02 - ($i - 1) * (($ra02 - $ra01) / ($numOrders - 1)), 8); //遞減
echo "短單C " . ($i) . " RATE: [[ " . number_format($rate * 36500, 2) . " ]]";
websocket_Offer($wss, $coin, strval($amountPerOrder), $rate, calculatePeriod($rate), $ava);
// $response = submitFundingOffer($apiKey, $secret, 'LIMIT', $coin, strval($amountPerOrder), $rate, calculatePeriod($rate), $ava);
} //if
} //for
// } else {
// $numOrders = 12;
// $amountPerOrder = floor($ava / $numOrders * 10) / 10;
// if ($amountPerOrder < 150) {
// $amountPerOrder = 151;
// }
// // if (calculatePeriod($hungry_avg) == 2) {
// // websocket_Offer($wss, $coin, strval($amountPerOrder), $hungry_avg, 3, $ava);
// // }
// for ($i = 1; $i <= $numOrders; $i++) {
// if ($ava >= $amountPerOrder) {
// // $rate = number_format($hungry_avg + ($i - 1) * (($hungry_max - $hungry_avg) / ($numOrders - 1)), 8); //遞增
// $rate = number_format($hungry_max - ($i - 1) * (($hungry_max - $hungry_avg) / ($numOrders - 1)), 8); //遞減
// echo "hungry_hungry_hungry_" . ($i) . " RATE: " . number_format($rate * 36500, 2);
// // $response = submitFundingOffer($apiKey, $secret, 'LIMIT', $coin, strval($amountPerOrder), $rate, calculatePeriod($rate), $ava);
// websocket_Offer($wss, $coin, strval($amountPerOrder), $rate, calculatePeriod($rate), $ava);
// } //if
// } //for
// }
echo $hr;
echo $hr;
// 关闭 WebSocket 连接
$wss->close();
}
} //迴圈
} else {
echo "0 结果";
}
$end_time = microtime(true); // 結束時間
$execution_time = $end_time - $start_time; // 計算執行時間
echo "程式執行時間: $execution_time 秒" . $br; // 輸出執行時間
// 关闭数据库连接
$link->close();
// function calculatePeriod($rate,$rate01,$period01,$rate02,$period02,$rate03,$period03,$rate04,$period04,$rate05,$period05,$rate06,$period06,$rate07,$period07,$period08)
// {
// // $rate = $rate*36500;
// if ($rate > $rate01) {
// return intval($period01);
// } elseif ($rate > $rate02) {
// return intval($period02);
// } elseif ($rate > $rate03) {
// return intval($period03);
// } elseif ($rate > $rate04) {
// return intval($period04);
// } elseif ($rate > $rate05) {
// return intval($period05);
// } elseif ($rate > $rate06) {
// return intval($period06);
// } elseif ($rate > $rate07) {
// return intval($period07);
// } else {
// return intval($period08);
// }
// }
function calculatePeriod($rate)
{
global $frr;
if ($frr >= R2f(15)) { //表示高利 要盡量縮短短天期時間 爭取高利
if ($rate >= R2f(22)) {
return 120;
} elseif ($rate >= R2f(20)) { //主要是改這
return 90;
} elseif ($rate >= R2f(18)) { //主要是改這
return 60;
} elseif ($rate >= R2f(16)) { //主要是改這
return 31;
} elseif ($rate >= $frr) { //主要是改這
return 15;
} elseif ($rate >= ($frr * 0.95)) {
return 7;
} elseif ($rate >= ($frr * 0.9)) {
return 6;
} elseif ($rate >= ($frr * 0.85)) {
return 5;
} elseif ($rate >= ($frr * 0.8)) {
return 4;
} elseif ($rate >= ($frr * 0.75)) {
return 3;
} else {
return 2;
}
} else {
if ($rate >= R2f(20)) {
return 120;
} elseif ($rate >= R2f(19)) {
return 90;
} elseif ($rate >= R2f(17)) {
return 60;
} elseif ($rate >= R2f(14.98)) {
return 31;
} elseif ($rate >= $frr) {
return 15;
} elseif ($rate >= ($frr * 0.95)) {
return 7;
} elseif ($rate >= ($frr * 0.9)) {
return 6;
} elseif ($rate >= ($frr * 0.85)) {
return 5;
} elseif ($rate >= ($frr * 0.8)) {
return 4;
} elseif ($rate >= ($frr * 0.75)) {
return 3;
} else {
return 2;
}
}
}
//取得SQL公開資料
function get_bfx_public_SQL($currencyId)
{
global $link;
$query = "SELECT * FROM bfx_public WHERE id = ?";
$stmt = $link->prepare($query);
$stmt->bind_param("i", $currencyId);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$stmt->close();
return $row;
}
function getUSD_SQL()
{
return get_bfx_public_SQL(1);
}
function getUST_SQL()
{
return get_bfx_public_SQL(2);
}
//
function getApiKeys($link, $exchange, $targetUID)
{
$apiKey = "";
$secret = "";
$sql_api_keys = "SELECT apiKey, secret FROM api_keys WHERE exchange = ? AND UID = ?";
$stmt = $link->prepare($sql_api_keys);
if ($stmt) {
// 绑定参数并执行查询
$stmt->bind_param("si", $exchange, $targetUID);
$stmt->execute();
// 绑定结果并输出查询结果
$stmt->bind_result($apiKey, $secret);
while ($stmt->fetch()) {
$secret = decrypt($secret);
}
// 关闭 prepared statement
$stmt->close();
} else {
echo "查询准备失败";
}
return array('apiKey' => $apiKey, 'secret' => $secret);
}
//下單
function websocket_Offer($wss, $coin, $amount, $rate, $period, &$ava)
{
$ava -= $amount; // 更新可用金额
// 构造放贷 offer 订单
$offerPayload = [
0,
'fon',
null,
[
'type' => 'LIMIT',
'symbol' => 'f' . $coin,
'amount' => $amount,
'rate' => $rate,
'period' => $period,
'flags' => 0
]
];
// 发送放贷 offer 订单
$wss->send(json_encode($offerPayload));
usleep(150000); // 100000 微秒 = 0.1 秒
}
// ini_set('max_input_vars', 10000);
// 開啟身分驗證
function authenticateWebSocket($coin, $apiKey, $secret)
{
// WebSocket 服务器地址
$socketUrl = 'wss://api.bitfinex.com/ws/2';
// 创建 WebSocket 客户端
$wss = new WebSocket\Client($socketUrl);
// 生成 nonce
$nonce = (string)(microtime(true) * 1000);
$authPayload = 'AUTH' . $nonce;
// 使用 PHP 的 hash_hmac 函数生成 HMAC 签名
$authSig = hash_hmac('sha384', $authPayload, $secret);
// 发送认证信息
$payload = json_encode([
'apiKey' => $apiKey,
'authSig' => $authSig,
'nonce' => $nonce,
'authPayload' => $authPayload,
'event' => 'auth'
]);
$wss->send($payload);
$timeout = 3; // 设置超时时间(单位:秒)
$startTime = microtime(true); // 获取当前时间戳
// 初始化資料陣列
$asset = [];
$fcsData = [];
// 循环接收消息
while (true) {
// 获取当前时间戳
$currentTime = microtime(true);
// 检查是否超时
if ($currentTime - $startTime > $timeout) {
return false; // 认证超时,返回false
echo 'WebSocket 認證失敗:超時或未收到認證成功消息';
$errorMessage = 'WebSocket 認證失敗:超時或未收到認證成功消息';
$logFile = 'C:/error.log';
$context = "websocket驗證";
$logMessage = '[' . date('Y-m-d H:i:s') . '] ' . $context . ' - ' . $errorMessage . PHP_EOL;
file_put_contents($logFile, $logMessage, FILE_APPEND);
}
$message = $wss->receive();
// 解析資料
$data = json_decode($message, true);
// echo "";
// print_r($data);
// echo "";
if (is_array($data)) {
if (isset($data[0]) && isset($data[1])) {
// 檢查是否為 fcs 事件
if ($data[0] === 0 && $data[1] === 'fcs') {
$fcsData[] = $data;
}
// 檢查是否為 wu 事件
if (is_array($data) && $data[0] === 0 && $data[1] === 'wu') {
// 檢查資金是否為 USD 或 UST
if ($data[2][0] === 'funding' && $data[2][1] === $coin) {
$asset[] = $data;
}
}
// 檢查是否接收到 [0,"bu",..]
// if (is_array($data) && $data[0] === 0 && $data[1] === 'bu') {
// if (!empty($asset)) {
// return [
// 'wss' => $wss,
// 'asset' => $asset,
// 'fcsData' => $fcsData,
// ];
// } else {
// continue; // 繼續迴圈,等待下一個消息
// }
// }
if (is_array($data) && $data[0] === 0 && $data[1] === 'bu') {
return [
'wss' => $wss,
'asset' => $asset,
'fcsData' => $fcsData,
];
}
}
}
}
}