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, ]; } } } } }