Files
li 1b24994e74 feat: 后端全量更新 - 含所有本次需求
- Contract.php: 返回合约账户余额(balance_contract)
- My.php: 地址管理增加BTC/ETH
- AppContract.php: 一键平仓(closeall)
- AppProxy.php: 代理专属注册链接 + 分级权限(L1/L2)
- site.php: 手续费减半(0.018→0.009)
- agent_permission_setup.sql: 代理权限SQL
- crypto_news_crawler.py: 新闻自动采集脚本
2026-03-30 20:16:32 +08:00

1484 lines
74 KiB
PHP
Executable File

<?php
namespace app\api\controller;
use app\common\controller\Api;
use fast\Random;
use think\Db;
use think\Config;
use function fast\e;
/**
* 币币交易专属任务
*/
class TaskbbIft extends Api
{
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
public function millisecondWay(){
list($s1, $s2) = explode(' ', microtime());
return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000);
}
//币币撮合交易
public function coin_deal_ift()
{
echo "start--";
$t1 = $this->millisecondWay();
$curr_jy_id = 55;//交易币种ID
$curr_buy_id = 1;//购买的币种ID
//市价买 现价买(高->低) 市价卖 现价卖(低->高)
$redis = getRedis();
$running = $redis->get('cointrades_ift');
if($running) {
echo' is running';
$redis->set('cointrades_ift', false);
exit;
}
// var_dump(json_decode($redis->get("ift_1min"),true));exit;
//查询10条买单
$order_buy = Db::name('app_coin_trade_ift')
->whereIn('status','0,1')
->where('type','buy')
->order('cart','asc')
->order('price','desc')
->order('id','asc')
->limit(100)
->select();
if(empty($order_buy)){
echo "暂无买单";
$redis->set('cointrades_ift', false);
//虽无数据 但是实时K线得跟着变
//1分钟
$this->ift_redis($redis, "ift_1min", [], "i",1);
//5分钟
$this->ift_redis($redis, "ift_5min", [], "i",5);
//15分钟
$this->ift_redis($redis, "ift_15min", [], "i",15);
//30分钟
$this->ift_redis($redis, "ift_30min", [], "i",30);
//60分钟
$this->ift_redis($redis, "ift_60min", [], "h",1);
//1天
$this->ift_redis($redis, "ift_1day", [], "d",1);
//1个月
$this->ift_redis($redis, "ift_1mon", [], "m",1);
exit;
}
$order_sell = Db::name('app_coin_trade_ift')
->whereIn('status','0,1')
->where('type','sell')
->order('cart','asc')
->order('price','asc')
->order('id','asc')
->limit(100)
->select();
if(empty($order_sell)){
echo "暂无卖单";
$redis->set('cointrades_ift', false);
//虽无数据 但是实时K线得跟着变
//1分钟
$this->ift_redis($redis, "ift_1min", [], "i",1);
//5分钟
$this->ift_redis($redis, "ift_5min", [], "i",5);
//15分钟
$this->ift_redis($redis, "ift_15min", [], "i",15);
//30分钟
$this->ift_redis($redis, "ift_30min", [], "i",30);
//60分钟
$this->ift_redis($redis, "ift_60min", [], "h",1);
//1天
$this->ift_redis($redis, "ift_1day", [], "d",1);
//1个月
$this->ift_redis($redis, "ift_1mon", [], "m",1);
exit;
}
$curr_id = $curr_jy_id;
$curr = Db::name("app_currency")->where("id",$curr_jy_id)->find();
$price = $curr['exchange'];
//撮合配对
$all_data = [];$zongjie = 0;
foreach ($order_buy as $key => $bvv) {
if($zongjie){
break;//此跳过为 没有可撮合的交易
}
if($key >= 20){
break;
}
foreach ($order_sell as $kk => $svv) {
if($kk >= 20){
break;
}
if($bvv['cart'] == "market"){
//买单市价
if($svv['cart'] == "market"){
//卖单市价
$buy_usdt = $bvv['amount']-$bvv['have_usdt'];//待使用USDT
$buy_num = sprintf("%.6f",$buy_usdt/$price);//剩余可买数量
// echo $buy_num."--";
$sell_num = $svv['num'] - $svv['have_num'];//剩余可卖数量
$sell_usdt = sprintf("%.6f",$sell_num*$price);
echo $bvv['id'].":".$buy_usdt.",".$svv['id'].":".$sell_usdt."----";
if($buy_num == $sell_num){
//双方完全成交
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$buy_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$buy_usdt;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 2,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $price,//单价
"usdt" => $buy_usdt,//
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$sell_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$sell_usdt;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 2,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $price,//单价
"usdt" => $sell_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
//双方成交完 清除数据跳过整个循环
unset($order_buy[$key]);
unset($order_sell[$kk]);
break;
}elseif($buy_num > $sell_num){
//买单数量大于卖单 卖单全成交买单部分成交
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$sell_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$sell_usdt;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 1,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $price,//单价
"usdt" => $sell_usdt,//成交USDT
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$sell_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$sell_usdt;
$all_data[$svv['id']]['status'] = 2;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 2,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $price,//单价
"usdt" => $sell_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
$bvv['have_num'] = $bvv['have_num']+$sell_num;
$bvv['have_usdt'] = $bvv['have_usdt']+$sell_usdt;
$order_buy[$key] = $bvv;
//买单还有剩余 跳过本轮循环继续成交卖单 清除本次卖单
unset($order_sell[$kk]);
continue;
}elseif($buy_num < $sell_num){
//卖单数量大于买单 买单全成交卖单部分成交
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$buy_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$buy_usdt;
$all_data[$bvv['id']]['status'] = 2;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 2,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $price,//单价
"usdt" => $buy_usdt,//
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$buy_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$buy_usdt;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 1,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $price,//单价
"usdt" => $buy_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
$svv['have_num'] = $svv['have_num']+$buy_num;
$svv['have_usdt'] = $svv['have_usdt']+$buy_usdt;
$order_sell[$kk] = $svv;
//卖单还有剩余 跳过卖单循环 让下一个买单来继续成交此卖单 清除当前买单
unset($order_buy[$key]);
break;
}
}elseif ($svv['cart'] == "limit") {
//买单市价 卖单现价 价格会根据卖单变化
$price = $svv['price'];
$buy_usdt = $bvv['amount']-$bvv['have_usdt'];//待使用USDT
$buy_num = sprintf("%.6f",$buy_usdt/$price);//剩余可买数量
// echo $buy_num."--";
$sell_num = $svv['num'] - $svv['have_num'];//剩余可卖数量
$sell_usdt = sprintf("%.6f",$sell_num*$price);
$curr_price = $price;
echo $bvv['id'].":".$buy_usdt.",".$svv['id'].":".$sell_usdt."----";
if($buy_num == $sell_num){
//双方完全成交
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$buy_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$buy_usdt;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 2,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $price,//单价
"usdt" => $buy_usdt,//
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$sell_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$sell_usdt;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 2,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $price,//单价
"usdt" => $sell_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
//双方成交完 清除数据跳过整个循环
unset($order_buy[$key]);
unset($order_sell[$kk]);
break;
}elseif($buy_num > $sell_num){
//买单数量大于卖单 卖单全成交买单部分成交
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$sell_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$sell_usdt;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 1,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $price,//单价
"usdt" => $sell_usdt,//成交USDT
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$sell_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$sell_usdt;
$all_data[$svv['id']]['status'] = 2;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 2,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $price,//单价
"usdt" => $sell_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
$bvv['have_num'] = $bvv['have_num']+$sell_num;
$bvv['have_usdt'] = $bvv['have_usdt']+$sell_usdt;
$order_buy[$key] = $bvv;
//买单还有剩余 跳过本轮循环继续成交卖单 清除本次卖单
unset($order_sell[$kk]);
continue;
}elseif($buy_num < $sell_num){
//卖单数量大于买单 买单全成交卖单部分成交
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$buy_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$buy_usdt;
$all_data[$bvv['id']]['status'] = 2;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 2,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $price,//单价
"usdt" => $buy_usdt,//
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$buy_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$buy_usdt;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 1,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $price,//单价
"usdt" => $buy_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
$svv['have_num'] = $svv['have_num']+$buy_num;
$svv['have_usdt'] = $svv['have_usdt']+$buy_usdt;
$order_sell[$kk] = $svv;
//卖单还有剩余 跳过卖单循环 让下一个买单来继续成交此卖单 清除当前买单
unset($order_buy[$key]);
break;
}
}
}elseif($bvv['cart'] == "limit"){
//买单限价
if($svv['cart'] == "market"){
//卖单市价 买单现价 价格会根据买单变化
$price = $bvv['price'];
$buy_usdt = $bvv['amount']-$bvv['have_usdt'];//待使用USDT
$buy_num = sprintf("%.6f",$buy_usdt/$price);//剩余可买数量
// echo $buy_num."--";
$sell_num = $svv['num'] - $svv['have_num'];//剩余可卖数量
$sell_usdt = sprintf("%.6f",$sell_num*$price);
$curr_price = $price;
echo $bvv['id'].":".$buy_usdt.",".$svv['id'].":".$sell_usdt."----";
if($buy_num == $sell_num){
//双方完全成交
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$buy_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$buy_usdt;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 2,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $price,//单价
"usdt" => $buy_usdt,//
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$sell_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$sell_usdt;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 2,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $price,//单价
"usdt" => $sell_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
//双方成交完 清除数据跳过整个循环
unset($order_buy[$key]);
unset($order_sell[$kk]);
break;
}elseif($buy_num > $sell_num){
//买单数量大于卖单 卖单全成交买单部分成交
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$sell_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$sell_usdt;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 1,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $price,//单价
"usdt" => $sell_usdt,//成交USDT
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$sell_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$sell_usdt;
$all_data[$svv['id']]['status'] = 2;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 2,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $price,//单价
"usdt" => $sell_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
$bvv['have_num'] = $bvv['have_num']+$sell_num;
$bvv['have_usdt'] = $bvv['have_usdt']+$sell_usdt;
$order_buy[$key] = $bvv;
//买单还有剩余 跳过本轮循环继续成交卖单 清除本次卖单
unset($order_sell[$kk]);
continue;
}elseif($buy_num < $sell_num){
//卖单数量大于买单 买单全成交卖单部分成交
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$buy_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$buy_usdt;
$all_data[$bvv['id']]['status'] = 2;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 2,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $price,//单价
"usdt" => $buy_usdt,//
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$buy_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$buy_usdt;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 1,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $price,//单价
"usdt" => $buy_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
$svv['have_num'] = $svv['have_num']+$buy_num;
$svv['have_usdt'] = $svv['have_usdt']+$buy_usdt;
$order_sell[$kk] = $svv;
//卖单还有剩余 跳过卖单循环 让下一个买单来继续成交此卖单 清除当前买单
unset($order_buy[$key]);
break;
}
}elseif ($svv['cart'] == "limit") {
//买单现价 卖单现价 必须当买单价格高于卖单才可成交 价格根据卖单变
$price = $svv['price'];
$buy_price = $bvv['price'];
if($buy_price >= $price){
$curr_price = $price;
$buy_price = $price;
$buy_usdt = $bvv['amount']-$bvv['have_usdt'];//待使用USDT
$buy_num = sprintf("%.6f",$buy_usdt/$buy_price);//剩余可买数量
// echo $buy_num."--";
$sell_num = $svv['num'] - $svv['have_num'];//剩余可卖数量
$sell_usdt = sprintf("%.6f",$sell_num*$price);//剩余可卖USDT
// echo $sell_usdt;exit;
echo $bvv['id'].":".$buy_usdt.",".$svv['id'].":".$sell_usdt."----";
if($buy_num == $sell_num){
//双方完全成交
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$buy_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$buy_usdt;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 2,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $buy_price,//单价
"usdt" => $buy_usdt,//
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$sell_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$sell_usdt;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 2,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $price,//单价
"usdt" => $sell_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
//双方成交完 清除数据跳过整个循环
unset($order_buy[$key]);
unset($order_sell[$kk]);
break;
}elseif($buy_num > $sell_num){
//买单数量大于卖单 卖单全成交买单部分成交
$sj_buy_usdt = sprintf("%.6f",$sell_num*$buy_price);//实际花费多少USDT
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$sell_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$sj_buy_usdt;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 1,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $buy_price,//单价
"usdt" => $sj_buy_usdt,//成交USDT
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$sell_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$sell_usdt;
$all_data[$svv['id']]['status'] = 2;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 2,//2=完全成交,1=部分成交
"num" => $sell_num,//成交数量
"price" => $price,//单价
"usdt" => $sell_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
$bvv['have_num'] = $bvv['have_num']+$sell_num;
$bvv['have_usdt'] = $bvv['have_usdt']+$sj_buy_usdt;
$order_buy[$key] = $bvv;
//买单还有剩余 跳过本轮循环继续成交卖单 清除本次卖单
unset($order_sell[$kk]);
continue;
}elseif($buy_num < $sell_num){
//卖单数量大于买单 买单全成交卖单部分成交
if(isset($all_data[$bvv['id']])){
$all_data[$bvv['id']]['num'] = $all_data[$bvv['id']]['num']+$buy_num;
$all_data[$bvv['id']]['usdt'] = $all_data[$bvv['id']]['usdt']+$buy_usdt;
$all_data[$bvv['id']]['status'] = 2;
}else{
$all_data[$bvv['id']] = array(
"order_id" => $bvv['id'],
"type" => "buy",
"status" => 2,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $buy_price,//单价
"usdt" => $buy_usdt,//
"user_id" => $bvv['user_id'],
"have_num" => $bvv['have_num'],//初始成交量
"have_usdt" => $bvv['have_usdt'],//初始成交USTD
"cart" => $bvv['cart'],
);
}
$sj_sell_usdt = sprintf("%.6f",$buy_num*$price);//实际卖了多少USDT
if(isset($all_data[$svv['id']])){
$all_data[$svv['id']]['num'] = $all_data[$svv['id']]['num']+$buy_num;
$all_data[$svv['id']]['usdt'] = $all_data[$svv['id']]['usdt']+$sj_sell_usdt;
}else{
$all_data[$svv['id']] = array(
"order_id" => $svv['id'],
"type" => "sell",
"status" => 1,//2=完全成交,1=部分成交
"num" => $buy_num,//成交数量
"price" => $price,//单价
"usdt" => $sj_sell_usdt,//
"user_id" => $svv['user_id'],
"have_num" => $svv['have_num'],//初始成交量
"have_usdt" => $svv['have_usdt'],//初始成交USTD
"cart" => $svv['cart'],
);
}
$svv['have_num'] = $svv['have_num']+$buy_num;
$svv['have_usdt'] = $svv['have_usdt']+$sj_sell_usdt;
$order_sell[$kk] = $svv;
//卖单还有剩余 跳过卖单循环 让下一个买单来继续成交此卖单 清除当前买单
unset($order_buy[$key]);
break;
}
}else{
$zongjie = 1;
echo "已撮合完";
break;
}
}
}
}
}
if(empty($all_data)){
//虽无数据 但是实时K线得跟着变
//1分钟
$this->ift_redis($redis, "ift_1min", [], "i",1);
//5分钟
$this->ift_redis($redis, "ift_5min", [], "i",5);
//15分钟
$this->ift_redis($redis, "ift_15min", [], "i",15);
//30分钟
$this->ift_redis($redis, "ift_30min", [], "i",30);
//60分钟
$this->ift_redis($redis, "ift_60min", [], "h",1);
//1天
$this->ift_redis($redis, "ift_1day", [], "d",1);
//1个月
$this->ift_redis($redis, "ift_1mon", [], "m",1);
}
if(!isset($curr_price) || !$curr_price){
$curr_price = $curr['exchange'];
}
//手续费
$market_bb_free = Config::get("site.market_bb_free");//标准手续费
$zhiya_free_rebate = Config::get("site.zhiya_free_rebate");//质押折扣
$apt_free = Config::get("site.apt_free");//APT手续费折扣
$apt_curr = Db::name("app_currency")->where("id",2)->find(); //平台APT
// $res_curr = Db::name("app_currency")->where("id",2)->find();//交易币种 此处可能是其他币
$res_curr = $apt_curr;
Db::startTrans();
try {
$detail = [];$trade_order = [];$ift_1s = [];
foreach ($all_data as $key => $value) {
//质押手续费折扣
$count_zhiya = Db::name("app_zhiya_user")->where("user_id", $value['user_id'])->where("status",1)->sum("num");
$zhekou = 1;
foreach ($zhiya_free_rebate as $kk => $vv) {
if($count_zhiya > $kk){
$zhekou = $vv;
}
}
$fee_bl = $market_bb_free*$zhekou/100;//手续费收取比例
$apy_pay = 1;
//买家收入币种,卖家收入USDT
if($value['type'] == "buy"){
$nums = $value['num'];//实际收入数量
$curr_id = $curr_jy_id;//实际收入币种
$user_curr = Db::name("app_currency_user a")->field("a.*,b.apy_pay")
->join("user b","a.user_id=b.id","left")
->where("a.user_id",$value['user_id'])
->where("a.curr_id",$curr_id)
->find();
//手续费扣除
if($user_curr['apy_pay'] == 1){
//平台币 APT
$free_num = sprintf("%.8f",$nums*$fee_bl*$apt_free);//折扣后手续费
$fee = sprintf("%.8f",$free_num*$res_curr['exchange']/$apt_curr['exchange']);//根据汇率计算最终手续费
$user_apt = Db::name('app_currency_user')->where('curr_id',2)->where('user_id',$value['user_id'])->find();//apt余额
if($user_apt['num'] >= $fee){
$apy_pay = 2;
$detail[] = array(
"user_id" => $value['user_id'],
"curr_id" => $user_apt['curr_id'],
"price" => $fee,
"cart" => 2,
"type" => 7,
"serial_no" => 'C'.time().Random::build('numeric',4),
"description" => "币币APT手续费",
"createtime" => time(),
"before_num" => $user_apt['num'],
"after_num" => $user_apt['num']-$fee,
);
Db::name("app_currency_user")->where("id",$user_apt['id'])->setDec("num",$fee);
}else{
$free_num = sprintf("%.8f",$nums*$fee_bl);//折扣后手续费
$fee = $free_num;
$nums = $nums - $fee;//实际收入减去手续费
}
}else{
//交易币
$free_num = sprintf("%.8f",$nums*$fee_bl);//折扣后手续费
$fee = $free_num;
$nums = $nums - $fee;//实际收入减去手续费
}
}else{
$curr_id = $curr_buy_id;//实际收入币种 USDT
$nums = $value['usdt'];//实际收入数量
$user_curr = Db::name("app_currency_user a")->field("a.*,b.apy_pay")
->join("user b","a.user_id=b.id","left")
->where("a.user_id",$value['user_id'])
->where("a.curr_id",$curr_id)
->find();
//手续费扣除
if($user_curr['apy_pay'] == 1){
//平台币 APT
$free_num = sprintf("%.8f",$nums*$fee_bl*$apt_free);//折扣后手续费
$fee = sprintf("%.8f",$free_num/$value['price']);//根据汇率计算最终手续费
$user_apt = Db::name('app_currency_user')->where('curr_id',2)->where('user_id',$value['user_id'])->find();//apt余额
if($user_apt['num'] >= $fee){
$apy_pay = 2;
$detail[] = array(
"user_id" => $value['user_id'],
"curr_id" => $user_apt['curr_id'],
"price" => $fee,
"cart" => 2,
"type" => 7,
"serial_no" => 'C'.time().Random::build('numeric',4),
"description" => "币币APT手续费",
"createtime" => time(),
"before_num" => $user_apt['num'],
"after_num" => $user_apt['num']-$fee,
);
Db::name("app_currency_user")->where("id",$user_apt['id'])->setDec("num",$fee);
}else{
$free_num = sprintf("%.8f",$nums*$fee_bl);//折扣后手续费
$fee = $free_num;
$nums = $nums - $fee;//实际收入减去手续费
}
}else{
//交易币
$free_num = sprintf("%.8f",$nums*$fee_bl);//折扣后手续费
$fee = $free_num;
$nums = $nums - $fee;//实际收入减去手续费
}
}
$detail[] = array(
"user_id" => $value['user_id'],
"curr_id" => $curr_id,
"price" => $nums,
"cart" => 1,
"type" => 7,
"serial_no" => 'C'.time().Random::build('numeric',4),
"description" => "币币交易买入",
"createtime" => time(),
"before_num" => $user_curr['num'],
"after_num" => $user_curr['num']+$nums,
);
Db::name("app_currency_user")->where("id",$user_curr['id'])->setInc("num",$nums);
//状态1=部分成交,2=完全成交
if($value['status'] == 1){
$update = array(
'have_num' => $value['have_num']+$value['num'],
'have_usdt' => $value['have_usdt']+$value['usdt'],
'status' => 1,
'updatetime' => time(),
);
}else{
$update = array(
'have_num' => $value['have_num']+$value['num'],
'have_usdt' => $value['have_usdt']+$value['usdt'],
'status' => 2,
'finishtime' => time(),
);
//市价 同步实际成交金额
if($value['cart'] == "market"){
$update['amount'] = $update['have_usdt'];
}
}
Db::name("app_coin_trade_ift")->where("id",$value['order_id'])->update($update);
$trade_order[] = [
'user_id' => $value['user_id'],
'coin_id' => 2,
'trade_id' => $value['order_id'],
'num' => $value['num'],
'price' => $value['price'],
'amount' => $value['usdt'],
'fee' => $fee,
'createtime' => time(),
'type' => $value['type'],
'order_sn' => 'C' . time() . Random::build('numeric', 4),
'fee_type' => $apy_pay,
];
//记录实时K线的数据
if($value['type'] == "sell"){
if($value['price']<$curr_price){
$value['price'] = $curr_price;
}
//1分钟
$this->ift_redis($redis, "ift_1min", $value, "i",1);
//5分钟
$this->ift_redis($redis, "ift_5min", $value, "i",5);
//15分钟
$this->ift_redis($redis, "ift_15min", $value, "i",15);
//30分钟
$this->ift_redis($redis, "ift_30min", $value, "i",30);
//60分钟
$this->ift_redis($redis, "ift_60min", $value, "h",1);
//1天
$this->ift_redis($redis, "ift_1day", $value, "d",1);
//1个月
$this->ift_redis($redis, "ift_1mon", $value, "m",1);
}
}
if($detail){
Db::name("app_detailed")->insertAll($detail);
Db::name("app_coin_trade_order_ift")->insertAll($trade_order);
Db::name("app_currency")->where("name","IFT")->update(['exchange'=>$curr_price]);
Db::name("app_rate")->where("symbol","iftusdt")->update(['close'=>$curr_price]);
}
Db::commit();
echo "success";
} catch (Exception $e) {
Db::rollback();
echo "执行失败";
}
//用剩余的数据生成深度图 卖是从小到大 买是从大到小排列
$buy_shendu_ift = [];$sell_shendu_ift = [];
foreach ($order_buy as $key => $value) {
if(isset($buy_shendu_ift[$value['price']])){
$buy_shendu_ift[$value['price']][1] = sprintf("%.4f",$buy_shendu_ift[$value['price']][1]+($value['num'] - $value['have_num']));
}else{
$buy_shendu_ift[$value['price']] = [
$value['price'],
sprintf("%.4f",$value['num'] - $value['have_num']),
];
}
}
foreach ($order_sell as $key => $value) {
if(isset($sell_shendu_ift[$value['price']])){
$sell_shendu_ift[$value['price']][1] = sprintf("%.4f",$sell_shendu_ift[$value['price']][1]+($value['num'] - $value['have_num']));
}else{
$sell_shendu_ift[$value['price']] = [
$value['price'],
sprintf("%.4f",$value['num'] - $value['have_num']),
];
}
}
$buy_shendu_ift = array_values($buy_shendu_ift);
$sell_shendu_ift = array_values($sell_shendu_ift);
//深度加工 动起来
$new_buy = [];$new_sell = [];
$buy_price = 0;
foreach ($buy_shendu_ift as $key => $value) {
//随机调整深度
$rand = rand(1, 19);
if($buy_price > 0 && $rand < 2){
if($buy_price-$value[0] > 0.001){
$data = array(
0 => sprintf("%.4f",$buy_price - 0.0005),
1 => sprintf("%.4f",rand(10000, 100000)/10),
);
//随机插入数量
$new_buy[] = $data;
}
}
if($rand<2){
$value[1] = rand($value[1]*10000, $value[1]*20000)/10000;
}
if($rand>18){
$value[1] = rand($value[1]*10000, $value[1]*2000)/2000;
}
$buy_price = $value[0];
$new_buy[] = $value;
}
$sell_price = 0;
foreach ($sell_shendu_ift as $key => $value) {
$rand = rand(1, 19);
if($sell_price > 0 && $rand<2){
if($value[0]-$sell_price > 0.001){
$data = array(
0 => sprintf("%.4f",$sell_price + 0.0005),
1 => sprintf("%.4f",rand(10000, 100000)/10),
);
$new_sell[] = $data;
}
}
//随机调整深度
if($rand<2){
$value[1] = rand($value[1]*10000, $value[1]*20000)/10000;
}
if($rand>18){
$value[1] = rand($value[1]*10000, $value[1]*2000)/2000;
}
$sell_price = $value[0];
//随机插入数量
$new_sell[] = $value;
}
// $redis->set("buy_shendu_ift",json_encode($buy_shendu_ift));
// $redis->set("sell_shendu_ift",json_encode($sell_shendu_ift));
$redis->set("buy_shendu_ift",json_encode($new_buy));
$redis->set("sell_shendu_ift",json_encode($new_sell));
var_dump($all_data);
$t2 = $this->millisecondWay();
echo "执行时长:".($t2-$t1)/1000;
echo "价格:".$curr_price;exit;
$redis->set('cointrades_ift', false);
}
/*
* 模拟生成K线
*/
public function kline_shendu()
{
$curr_id = 55;
$rand = rand(1, 20);
if($rand < 19){
echo $rand."---不成交";exit;
}
sleep(rand(1, 5));
//K线调整
$order_sell = Db::name('app_coin_trade_ift')
->whereIn('status','0,1')
->where('type','sell')
->order('cart','asc')
->order('price','asc')
->order('id','asc')
->find();
$order_buy = Db::name('app_coin_trade_ift')
->whereIn('status','0,1')
->where('type','buy')
->order('cart','asc')
->order('price','desc')
->order('id','asc')
->find();
if($order_buy && $order_buy && $order_buy['price']<$order_sell['price']){
$now_price = Db::name("app_currency")->where("id",$curr_id)->value("exchange");
$num = rand(10, 90)*10;
$price = rand($order_buy['price']*10000, $order_sell['price']*10000)/10000;
if($price > $now_price){
if($num <= 800){
$price = sprintf("%.4f",$now_price + ($price-$now_price)/5);
}
}elseif($price < $now_price){
if($num <= 800){
$price = sprintf("%.4f",$now_price - ($now_price-$price)/5);
}
}
$data = array(
"num" => $num,//成交数量
"price" => $price,//单价
);
$redis = getRedis();
//1分钟
$this->ift_redis($redis, "ift_1min", $data, "i",1);
//5分钟
$this->ift_redis($redis, "ift_5min", $data, "i",5);
//15分钟
$this->ift_redis($redis, "ift_15min", $data, "i",15);
//30分钟
$this->ift_redis($redis, "ift_30min", $data, "i",30);
//60分钟
$this->ift_redis($redis, "ift_60min", $data, "h",1);
//1天
$this->ift_redis($redis, "ift_1day", $data, "d",1);
//1个月
$this->ift_redis($redis, "ift_1mon", $data, "m",1);
Db::name("app_rate")->where("symbol","iftusdt")->update(['close'=>$price]);
Db::name("app_currency")->where("name","IFT")->update(['exchange'=>$price]);
}
}
/**
* APT实时K线数据
* @param type $redis 链接redis
* @param type $redis_name 设置的redis名字
* @param type $value 交易的一些数据库
* @param type $times
* @param type $num
*/
public function ift_redis($redis,$redis_name,$value,$times,$num=1)
{
$ift_1min = $redis->get($redis_name);
$ift_1min = json_decode($ift_1min,true);
if(empty($value)){
if(!$ift_1min || empty($ift_1min)){
//未定义初始化
$ift_curr = Db::name("app_currency")->where("name","IFT")->find();
$ift_1min = [
"amount" => 0,
"close" => $ift_curr['exchange'],
"count" => 0,
"high" => $ift_curr['exchange'],
"id" => time(),
"low" => $ift_curr['exchange'],
"open" => $ift_curr['exchange'],
"vol" => 0,
];
}else{
$t1 = date($times,$ift_1min['id']);
$t2 = date($times, time());
if($times == "i" && $t2<$t1){//1,6
$t2 = $t2+60;
}
if($t2-$t1 >= $num || $t2<$t1){
$ift_curr = Db::name("app_currency")->where("name","IFT")->find();
$redis->set("bf_".$redis_name,json_encode($ift_1min));
//达到一个新的时间节点
$ift_1min['amount'] = 0;
$ift_1min['close'] = $ift_curr['exchange'];
$ift_1min['count'] = 0;
$ift_1min['high'] = $ift_curr['exchange'];
$ift_1min['id'] = time();
$ift_1min['low'] = $ift_curr['exchange'];
$ift_1min['open'] = $ift_curr['exchange'];
$ift_1min['vol'] = 0;
}
}
}else{
if(!$ift_1min || empty($ift_1min)){
//未定义初始化
$ift_1min = [
"amount" => $value['num'],
"close" => $value['price'],
"count" => 1,
"high" => $value['price'],
"id" => time(),
"low" => $value['price'],
"open" => $value['price'],
"vol" => $value['num'],
];
}else{
$t1 = date($times,$ift_1min['id']);
$t2 = date($times, time());
if($times == "i" && $t2<$t1){//1,6
$t2 = $t2+60;
}
if($t2-$t1 >= $num || $t2<$t1){
$redis->set("bf_".$redis_name,json_encode($ift_1min));
//达到一个新的时间节点
$ift_1min = [
"amount" => $value['num'],
"close" => $value['price'],
"count" => 1,
"high" => $value['price'],
"id" => time(),
"low" => $value['price'],
"open" => $value['price'],
"vol" => $value['num'],
];
}else{
$ift_1min['amount'] = $ift_1min['amount']+$value['num'];
$ift_1min['close'] = $value['price'];
$ift_1min['count'] = $ift_1min['count']+1;
if($value['price'] > $ift_1min['high']){
$ift_1min['high'] = $value['price'];
}
if($value['price'] < $ift_1min['low']){
$ift_1min['low'] = $value['price'];
}
$ift_1min['vol'] = $ift_1min['amount'];
}
}
}
$redis->set($redis_name,json_encode($ift_1min));
}
/**
* 更新ift-K线数据
*/
public function update_ift_kline()
{
$redis = getRedis();
//1分钟
$ift_1min = $redis->get("bf_ift_1min");
$ift_1min = json_decode($ift_1min,true);
if($ift_1min){
$ift_1min_data = [];
$last_1min = Db::name("ift_k_1min")->order("ts desc")->find();
if($last_1min){
if($last_1min['ts'] != $ift_1min['id']){
$ift_1min_data = array(
"symbol" => "iftusdt",
"ts" => $ift_1min['id'],
"open" => $ift_1min['open'],
"close" => $ift_1min['close'],
"low" => $ift_1min['low'],
"high" => $ift_1min['high'],
"amount" => $ift_1min['amount'],
"vol" => $ift_1min['vol'],
"count" => $ift_1min['count'],
);
}
}else{
$ift_1min_data = array(
"symbol" => "iftusdt",
"ts" => $ift_1min['id'],
"open" => $ift_1min['open'],
"close" => $ift_1min['close'],
"low" => $ift_1min['low'],
"high" => $ift_1min['high'],
"amount" => $ift_1min['amount'],
"vol" => $ift_1min['vol'],
"count" => $ift_1min['count'],
);
}
if($ift_1min_data){
Db::name("ift_k_1min")->insert($ift_1min_data);
echo 1;
}
}
//5分钟
$ift_5min = $redis->get("bf_ift_5min");
$ift_5min = json_decode($ift_5min,true);
if($ift_5min){
$ift_5min_data = [];
$last_5min = Db::name("ift_k_5min")->order("ts desc")->find();
if($last_5min){
if($last_5min['ts'] != $ift_5min['id']){
$ift_5min_data = array(
"symbol" => "iftusdt",
"ts" => $ift_5min['id'],
"open" => $ift_5min['open'],
"close" => $ift_5min['close'],
"low" => $ift_5min['low'],
"high" => $ift_5min['high'],
"amount" => $ift_5min['amount'],
"vol" => $ift_5min['vol'],
"count" => $ift_5min['count'],
);
}
}else{
$ift_5min_data = array(
"symbol" => "iftusdt",
"ts" => $ift_5min['id'],
"open" => $ift_5min['open'],
"close" => $ift_5min['close'],
"low" => $ift_5min['low'],
"high" => $ift_5min['high'],
"amount" => $ift_5min['amount'],
"vol" => $ift_5min['vol'],
"count" => $ift_5min['count'],
);
}
if($ift_5min_data){
Db::name("ift_k_5min")->insert($ift_5min_data);
echo 2;
}
}
//15分钟
$ift_15min = $redis->get("bf_ift_15min");
$ift_15min = json_decode($ift_15min,true);
if($ift_15min){
$ift_15min_data = [];
$last_15min = Db::name("ift_k_15min")->order("ts desc")->find();
if($last_15min){
if($last_15min['ts'] != $ift_15min['id']){
$ift_15min_data = array(
"symbol" => "iftusdt",
"ts" => $ift_15min['id'],
"open" => $ift_15min['open'],
"close" => $ift_15min['close'],
"low" => $ift_15min['low'],
"high" => $ift_15min['high'],
"amount" => $ift_15min['amount'],
"vol" => $ift_15min['vol'],
"count" => $ift_15min['count'],
);
}
}else{
$ift_15min_data = array(
"symbol" => "iftusdt",
"ts" => $ift_15min['id'],
"open" => $ift_15min['open'],
"close" => $ift_15min['close'],
"low" => $ift_15min['low'],
"high" => $ift_15min['high'],
"amount" => $ift_15min['amount'],
"vol" => $ift_15min['vol'],
"count" => $ift_15min['count'],
);
}
if($ift_15min_data){
Db::name("ift_k_15min")->insert($ift_15min_data);
echo 3;
}
}
//30分钟
$ift_30min = $redis->get("bf_ift_30min");
$ift_30min = json_decode($ift_30min,true);
if($ift_30min){
$ift_30min_data = [];
$last_30min = Db::name("ift_k_30min")->order("ts desc")->find();
if($last_30min){
if($last_30min['ts'] != $ift_30min['id']){
$ift_30min_data = array(
"symbol" => "iftusdt",
"ts" => $ift_30min['id'],
"open" => $ift_30min['open'],
"close" => $ift_30min['close'],
"low" => $ift_30min['low'],
"high" => $ift_30min['high'],
"amount" => $ift_30min['amount'],
"vol" => $ift_30min['vol'],
"count" => $ift_30min['count'],
);
}
}else{
$ift_30min_data = array(
"symbol" => "iftusdt",
"ts" => $ift_30min['id'],
"open" => $ift_30min['open'],
"close" => $ift_30min['close'],
"low" => $ift_30min['low'],
"high" => $ift_30min['high'],
"amount" => $ift_30min['amount'],
"vol" => $ift_30min['vol'],
"count" => $ift_30min['count'],
);
}
if($ift_30min_data){
Db::name("ift_k_30min")->insert($ift_30min_data);
echo 4;
}
}
//60分钟
$ift_60min = $redis->get("bf_ift_60min");
$ift_60min = json_decode($ift_60min,true);
if($ift_60min){
$ift_60min_data = [];
$last_60min = Db::name("ift_k_1h")->order("ts desc")->find();
if($last_60min){
if($last_60min['ts'] != $ift_60min['id']){
$ift_60min_data = array(
"symbol" => "iftusdt",
"ts" => $ift_60min['id'],
"open" => $ift_60min['open'],
"close" => $ift_60min['close'],
"low" => $ift_60min['low'],
"high" => $ift_60min['high'],
"amount" => $ift_60min['amount'],
"vol" => $ift_60min['vol'],
"count" => $ift_60min['count'],
);
}
}else{
$ift_60min_data = array(
"symbol" => "iftusdt",
"ts" => $ift_60min['id'],
"open" => $ift_60min['open'],
"close" => $ift_60min['close'],
"low" => $ift_60min['low'],
"high" => $ift_60min['high'],
"amount" => $ift_60min['amount'],
"vol" => $ift_60min['vol'],
"count" => $ift_60min['count'],
);
}
if($ift_60min_data){
Db::name("ift_k_1h")->insert($ift_60min_data);
echo 5;
}
}
//1天
$ift_1day = $redis->get("bf_ift_1day");
$ift_1day = json_decode($ift_1day,true);
if($ift_1day){
$ift_1day_data = [];
$last_1day = Db::name("ift_k_24h")->order("ts desc")->find();
if($last_1day){
if($last_1day['ts'] != $ift_1day['id']){
$ift_1day_data = array(
"symbol" => "iftusdt",
"ts" => $ift_1day['id'],
"open" => $ift_1day['open'],
"close" => $ift_1day['close'],
"low" => $ift_1day['low'],
"high" => $ift_1day['high'],
"amount" => $ift_1day['amount'],
"vol" => $ift_1day['vol'],
"count" => $ift_1day['count'],
);
}
}else{
$ift_1day_data = array(
"symbol" => "iftusdt",
"ts" => $ift_1day['id'],
"open" => $ift_1day['open'],
"close" => $ift_1day['close'],
"low" => $ift_1day['low'],
"high" => $ift_1day['high'],
"amount" => $ift_1day['amount'],
"vol" => $ift_1day['vol'],
"count" => $ift_1day['count'],
);
}
if($ift_1day_data){
Db::name("ift_k_24h")->insert($ift_1day_data);
echo 6;
}
}
//跟新rate表数据
$now_ift_1day = $redis->get("ift_1day");
$now_ift_1day = json_decode($now_ift_1day,true);
$update = array(
"amount" => $now_ift_1day['amount'],
"high" => $now_ift_1day['high'],
"low" => $now_ift_1day['low'],
"open" => $now_ift_1day['open'],
);
$update['increase'] = sprintf("%.4f",($now_ift_1day['close']-$update['open'])/$update['open']);
Db::name("app_rate")->where("symbol","iftusdt")->update($update);
//1个月
$ift_1mon = $redis->get("bf_ift_1mon");
$ift_1mon = json_decode($ift_1mon,true);
if($ift_1mon){
$ift_1mon_data = [];
$last_1mon = Db::name("ift_k_1month")->order("ts desc")->find();
if($last_1mon){
if($last_1mon['ts'] != $ift_1mon['id']){
$ift_1mon_data = array(
"symbol" => "iftusdt",
"ts" => $ift_1mon['id'],
"open" => $ift_1mon['open'],
"close" => $ift_1mon['close'],
"low" => $ift_1mon['low'],
"high" => $ift_1mon['high'],
"amount" => $ift_1mon['amount'],
"vol" => $ift_1mon['vol'],
"count" => $ift_1mon['count'],
);
}
}else{
$ift_1mon_data = array(
"symbol" => "iftusdt",
"ts" => $ift_1mon['id'],
"open" => $ift_1mon['open'],
"close" => $ift_1mon['close'],
"low" => $ift_1mon['low'],
"high" => $ift_1mon['high'],
"amount" => $ift_1mon['amount'],
"vol" => $ift_1mon['vol'],
"count" => $ift_1mon['count'],
);
}
if($ift_1mon_data){
Db::name("ift_k_1month")->insert($ift_1mon_data);
echo 7;
}
}
}
//4位小数的随机数
public function randomFloat($min = 0, $max = 10 , $localnum = 4)
{
if($localnum == 4) {
if ($max - $min <= 0.0002) {
return 0;
}
$rand = mt_rand() / mt_getrandmax() * ($max - $min-0.0001);
$num = $min + $rand;
$number = sprintf("%.4f", $num);
if($number == $min){
$number += 0.0001;
}
}else if($localnum == 5){
if ($max - $min <= 0.00002) {
return 0;
}
$rand = mt_rand() / mt_getrandmax() * ($max - $min-0.00001);
$num = $min + $rand;
$number = sprintf("%.5f", $num);
if($number == $min){
$number += 0.00001;
}
}else if($localnum == 6){
if ($max - $min <= 0.000002) {
return 0;
}
$rand = mt_rand() / mt_getrandmax() * ($max - $min-0.000001);
$num = $min + $rand;
$number = sprintf("%.6f", $num);
if($number == $min){
$number += 0.000001;
}
}else if($localnum == 2){
if ($max - $min <= 0.02) {
return 0;
}
$rand = mt_rand() / mt_getrandmax() * ($max - $min-0.01);
$num = $min + $rand;
$number = sprintf("%.2f", $num);
if($number == $min){
$number += 0.01;
}
}else if($localnum == 3){
if ($max - $min <= 0.001) {
return 0;
}
$rand = mt_rand() / mt_getrandmax() * ($max - $min-0.001);
$num = $min + $rand;
$number = sprintf("%.3f", $num);
if($number == $min){
$number += 0.001;
}
}
return $number;
}
}