btapi = new Btapi(); } //获取价格币种 public function get_coin() { $data = Db::name('app_ai_coin a') ->field('a.*,b.api_url') ->join('app_ai_exchange b','b.id=a.exchange_id','left') ->where('a.status','1') ->order('a.weigh','desc') ->limit(3) ->select(); foreach ($data as $key=>$value) { $data[$key]['price'] = sprintf('%.2f',$value['price']); } $this->success('success',$data); } //获取信誉值数 public function get_xinyus() { $strategy = Db::name('app_ai_strategy') ->where('status','1') ->where('user_id',$this->auth->id) ->select(); $cc_amount = 0; foreach ($strategy as $key=>$value) { if($value['cc_price'] <= 0) continue; $strategy_order = Db::name('app_ai_strategy_order') ->where('strategy_id',$value['id']) ->order('id','desc')->find(); if($strategy_order['type'] == '2') continue; $sum = Db::name('app_ai_strategy_order') ->where('strategy_id',$value['id']) ->where('strategy_code',$strategy_order['strategy_code']) ->where('type','1') ->sum('amount'); $cc_amount += $sum; } //平均收益比 $income_per = Db::name('app_ai_strategy') ->where('user_id',$this->auth->id) ->where('status','1') ->sum('zy_percent'); if($strategy) { $xinyu = sprintf('%.4f', $cc_amount * ($income_per / count($strategy)) * Config::get('site.xinyu_percent')); }else{ $xinyu = 0; } $balances = Db::name('app_currency_user') ->where('user_id',$this->auth->id) ->where('curr_id','1')->find(); if($balances) { $warning['num'] = sprintf('%.4f', $balances['num_lh']); }else{ $warning['num'] = sprintf('%.4f',0); } if($warning['num'] < $xinyu) { $warning['xinyu'] = '1'; }else{ $warning['xinyu'] = '0'; } $lang = $this->request->request("lang"); switch ($lang) { case "zh-cn": $xinyu_waring = Config::get("site.xinyu_waring"); break; default: $xinyu_waring = Config::get("site.xinyu_waring_en"); break; } $warning['xinyu_waring'] = $xinyu_waring; $this->success('ok',$warning); } //获取所有币种 public function get_exchange() { $coin_type = 1; $strategy = Db::name('app_ai_strategy') ->where('user_id',$this->auth->id) ->select(); $strategy1 = array_column($strategy,'type','coin_id'); $strategy2 = array_column($strategy,'status','coin_id'); $value = []; $coin = Db::name('app_ai_coin') ->where('status', '1') ->where('exchange_id', 1) ->where('coin_type',$coin_type) ->select(); $youxian = []; foreach ($coin as $k=>$val){ if(isset($strategy1[$val['id']])) { $val['type'] = $strategy1[$val['id']]; $val['status'] = $strategy2[$val['id']]; }else{ $val['type'] = '2'; $val['status'] = '0'; } $val['image'] = Config::get('site.image_url').$val['image']; $stretagy_order = Db::name('app_ai_strategy_order') ->where('coin_id',$val['id']) ->where('type','2') ->where('createtime','>',strtotime(date('Y-m-d 00:00:00'))) ->count(); $val['strategy_xhcode'] = $stretagy_order; if($val['symbol'] == 'btcusdt' || $val['symbol'] == 'ethusdt'){ $youxian[] = $val; unset($coin[$k]); }else{ $coin[$k] = $val; } } $last_names = array_column($coin,'strategy_xhcode'); array_multisort($last_names,SORT_DESC,$coin); $coin = array_merge_recursive($youxian,$coin); $user_usdt = Db::name("app_currency_user")->where("user_id",$this->auth->id)->where("curr_id",1)->value("num_lh"); $value['usdtnum'] = $user_usdt; $value['coins'] = $coin; $value['ws_url'] = 'wss://api.hadax.com/ws'; $data[] = $value; $this->success('success',$data); } //搜索币种 public function search_coin() { $params = $this->request->post(); if(!isset($params['coin']) || empty($params['coin'])) { $this->error(__('请输入要搜索的币种')); } $coin = strtoupper($params['coin']); $coins = Db::name('app_ai_coin') ->whereLike('coinname','%'.$coin.'%') ->select(); $this->success('success',$coins); } //获取循环策略 public function get_strategy() { $params = $this->request->post(); $type = (isset($params['type']) && !empty($params['type']))?$params['type']:'2'; $coin_type = 1; $exchangeid = 1; $data = Db::name('app_ai_strategy a') ->field('a.*,b.coinname,b.price,b.image,b.symbol,b.coin_type,b.coin_desc') ->join('app_ai_coin b', 'a.coin_id = b.id', 'left') ->where('a.user_id', $this->auth->id) ->where('a.type', $type) ->where('b.coin_type',$coin_type) ->where('b.exchange_id',$exchangeid) ->order('a.status', 'desc') ->paginate(50, false, ['query' => request()->param()]); foreach ($data as $key=>$value) { $order_sell = Db::name('app_ai_strategy_order') ->where('strategy_id',$value['id']) ->where('type','2') ->order('id','desc')->find(); if(empty($order_sell)) { $order_sell['id'] = 1; } $strategy_code = Db::name('app_ai_strategy_order') ->where('coin_id',$value['coin_id']) ->where('user_id',$this->auth->id) ->where('createtime','>',strtotime(date('Y-m-d'))) ->where('type','2')->count(); $value['strategy_xhcode'] = $strategy_code; if($value['cc_amount'] <=0 && $value['cc_price'] > 0) { $value['cc_num'] = sprintf('%.6f' , Db::name('app_ai_strategy_order') ->where('strategy_id',$value['id']) ->where('type','1') ->where('id','>',$order_sell['id']) ->order('id','desc')->sum('amount')); $value['cc_nums'] = sprintf('%.6f' , Db::name('app_ai_strategy_order') ->where('strategy_id',$value['id']) ->where('type','1') ->where('id','>',$order_sell['id']) ->order('id','desc')->sum('num')); $value['increase'] = sprintf('%.4f', ($value['price'] - $value['cc_price']) / $value['cc_price']); }else if($value['cc_amount'] > 0 && $value['cc_price']>0){ $value['cc_nums'] = $value['cc_num']; $value['cc_num'] = $value['cc_amount']; $value['increase'] = sprintf('%.4f', ($value['price'] - $value['cc_price']) / $value['cc_price']); }else{ $value['cc_nums'] = 0; $value['increase'] = '0.00'; } //浮亏 最新价格持仓-目前持仓 $newamount = $value['cc_nums'] * $value['price']; $ccamount = $value['cc_nums'] * $value['cc_price']; $value['fukui'] = sprintf('%.6f',$newamount-$ccamount); $value['image'] = Config::get('site.image_url').$value['image']; $data[$key] = $value; } $this->success('success',$data); } //获取币种策略 public function get_strategy_coin() { $params = $this->request->post(); if(!isset($params['coin_id']) || empty($params['coin_id'])){ $this->error(__('请输入要查询的币种')); } $coin = Db::name('app_ai_coin') ->where('id',$params['coin_id']) ->where('status','1')->find(); if(!$coin) { $this->error(__('币种不存在')); } $stretagy = Db::name('app_ai_strategy') ->where('coin_id',$params['coin_id']) ->where('user_id',$this->auth->id) ->find(); $strategy_code = 0; $stretagy_order = Db::name('app_ai_strategy_order') ->where('strategy_id',$stretagy['id']) ->order('id','desc')->find(); if(empty($stretagy)) { $bcjson = Config::get('site.bcjson'); $bcjsons = []; $stretagy = [ 'amount' => 0.000000, "coin_id" => $coin['id'], "status" => "0", "first_num" => Config::get('site.first_num'), "order_num" => Config::get('site.order_num'), "zy_percent" => Config::get('site.zy_percent'), "zy_ht" => Config::get('site.zy_ht'), "bcjson" => $bcjsons, "bc_ht" => Config::get('site.bc_ht'), "cc_price" => "0.000000", "type" => "1", "is_double" => Config::get('site.is_double'), "double_max" => Config::get('site.double_max'), "coinname" => $coin['coinname'], "price" => "0.000000", 'coin_price' => $coin['price'], 'bc_time' => 0, 'cc_num' => '0.000000', 'symbol' => $coin['symbol'], 'bcdf' => '0%', 'bcjg' => '0.0000', 'cc_amount' => '0.0000', 'in_price' => '0.000000', 'pc_status' => '0', 'is_now' => '0' ]; if($coin['coin_type'] == '2'){ $bcjson = Config::get('site.fmjson'); } foreach ($bcjson as $key=>$value) { $stretagy['bcs_'.$key] = $value; } }else{ $order_sell = Db::name('app_ai_strategy_order') ->where('strategy_id',$stretagy['id']) ->where('type','2') ->order('id','desc')->find(); if(empty($order_sell)) { $order_sell['id'] = 0; }else{ $strategy_code = $order_sell['strategy_code']; } $order = Db::name('app_ai_strategy_order') ->where('strategy_id',$stretagy['id']) ->where('type','1') ->where('id','>',$order_sell['id']) ->order('bc_time','desc')->find(); if(empty($order)) $order['bc_time'] = 0; else{ $strategy_code = $order['strategy_code']; } $stretagy['cc_num'] = Db::name('app_ai_strategy_order') ->where('strategy_id',$stretagy['id']) ->where('type','1') ->where('id','>',$order_sell['id']) ->order('id','desc')->sum('num'); $stretagy['bc_time'] = $order['bc_time']; $bcjson = json_decode($stretagy['bcjson'],true); $bcjsons = []; foreach ($bcjson as $key=>$value) { $stretagy['bcs_'.$key] = $value; } $stretagy['bcjson'] = $bcjsons; $stretagy['coin_price'] = $coin['price']; $stretagy['symbol'] = $coin['symbol']; $stretagy['order_num'] = $stretagy['num']; //已补仓次数 $bctime = $order['bc_time']; if($bctime >= $stretagy['num']) ; //达到最大补仓次数 $bctimes = (string)($order['bc_time'] + 1); // var_dump($bctimes,$bcjson,$bcjsons);exit; if(isset($bcjson[$bctimes])) { $percent = $bcjson[$bctimes]; $stretagy['bcdf'] = ($percent*100).'%'; $stretagy['bcjg'] = sprintf('%.4f',$stretagy['cc_price'] * (1-$percent)); }else{ $percent = 0; $stretagy['bcdf'] = '0%'; $stretagy['bcjg'] = '0'; } } if($stretagy['cc_amount'] <= 0 && $stretagy['cc_price'] > 0) { $stretagy['cc_amount'] = Db::name('app_ai_strategy_order') ->where('strategy_id', $stretagy['id']) ->where('type', '1') ->where('id', '>', $order_sell['id']) ->order('id', 'desc')->sum('amount'); $stretagy['cc_amount'] = sprintf('%.4f',$stretagy['cc_amount']); $allamount = $stretagy['cc_amount']; $allnum = Db::name('app_ai_strategy_order') ->where('strategy_id', $stretagy['id']) ->where('strategy_code', $stretagy_order['strategy_code']) ->where('type', '1') ->sum('num'); $allfee = Db::name('app_ai_strategy_order') ->where('strategy_id', $stretagy['id']) ->where('strategy_code', $stretagy_order['strategy_code']) ->where('type', '1') ->sum('fee'); $ccnums = intval(($allnum - $allfee) * pow(10, 8)) / pow(10, 8); $ccprices = intval($allamount / $ccnums * pow(10, 8)) / pow(10, 8); $stretagy['cc_price'] = $ccprices; $stretagy['cc_num'] = $ccnums; $ret1 = Db::name('app_ai_strategy') ->where('id',$stretagy['id'])->update(['cc_price'=>$ccprices,'cc_num'=>$ccnums,'cc_amount'=>$allamount,'updatetime'=>time()]); $stretagy['increase'] = (sprintf('%.4f', ($coin['price'] - $stretagy['cc_price']) / $stretagy['cc_price']) * 100) . '%'; }else if($stretagy['cc_amount'] > 0 && $stretagy['cc_price']){ $stretagy['increase'] = (sprintf('%.4f', ($coin['price'] - $stretagy['cc_price']) / $stretagy['cc_price']) * 100) . '%'; }else $stretagy['increase'] = '0.00%'; //查询信誉值 //当前持仓总量U $strategy = Db::name('app_ai_strategy') ->where('user_id',$this->auth->id) ->where('status','1') ->select(); $cc_amount = $pc_amount = 0; foreach ($strategy as $key=>$value) { if($value['cc_price'] <= 0) continue; $strategy_order = Db::name('app_ai_strategy_order') ->where('strategy_id',$value['id']) ->order('id','desc')->find(); if($strategy_order['type'] == '2') continue; $sum = Db::name('app_ai_strategy_order') ->where('strategy_id',$value['id']) ->where('strategy_code',$strategy_order['strategy_code']) ->where('type','1') ->sum('amount'); $cc_amount += $sum; } $stretagy['strategy_xhcode'] = $strategy_code; //平均收益比 $income_per = Db::name('app_ai_strategy') ->where('user_id',$this->auth->id) ->where('status','1') ->sum('zy_percent'); if($strategy) { $xinyu = sprintf('%.4f', $cc_amount * ($income_per / count($strategy)) * Config::get('site.xinyu_percent')); }else{ $xinyu = 0; } $balances = Db::name('app_currency_user') ->where('user_id',$this->auth->id) ->where('curr_id',1)->find(); if($balances) { $data['num'] = sprintf('%.4f', $balances['num_lh']); }else{ $data['num'] = sprintf('%.4f',0); } if($data['num'] < $xinyu) { $stretagy['xinyu'] = '1'; }else{ $stretagy['xinyu'] = '0'; } $lang = $this->request->request("lang"); switch ($lang) { case "zh-cn": $coin_waring = Config::get("site.coin_waring"); $xinyu_waring = Config::get("site.xinyu_waring"); break; default: $coin_waring = Config::get("site.coin_waring_en"); $xinyu_waring = Config::get("site.xinyu_waring_en"); break; } $stretagy['xinyu_waring'] = $xinyu_waring; if($coin['increase'] <0 && abs($coin['increase']) > Config::get('site.increase_waring')) { $stretagy['coin_tx'] = '1'; $stretagy['coin_waring'] = $coin_waring.abs($coin['increase']*100)."%"; }else{ $stretagy['coin_tx'] = '0'; $stretagy['coin_waring'] = $coin_waring.(Config::get('site.increase_waring')*100)."%"; } $stretagy['image'] = Config::get('site.image_url').$coin['image']; $stretagy['price_precision'] = $coin['price_precision']; $stretagy['exchange_id'] = $coin['exchange_id']; if($stretagy['exchange_id'] == 1){ $stretagy['ws_url'] = 'wss://api.hadax.com/ws'; }else if($stretagy['exchange_id'] == 2){ $stretagy['ws_url'] = 'ws://172.247.4.178:8989'; } $this->success('success',$stretagy); } //获取交易记录 public function get_order() { $params = $this->request->post(); $type = (isset($params['type']) && !empty($params['type']))?$params['type']:''; if(!empty($type)) { $w['a.type'] = $type; } $w['b.exchange_id'] = 1; if(isset($params['symbol']) && !empty($params['symbol'])) { $w['b.symbol'] = ['LIKE','%'.$params['symbol'].'%']; } if(isset($params['starttime']) && !empty($params['starttime'])) { $params['starttime'] = strtotime($params['starttime'].' 00:00:00'); $w['a.createtime'] = ['>',$params['starttime']]; } if(isset($params['endtime']) && !empty($params['endtime'])) { $params['endtime'] = strtotime($params['endtime'].' 00:00:00'); if(isset($params['starttime']) && !empty($params['starttime'])){ $w['a.createtime'] = ['between',$params['starttime'].",".$params['endtime']]; }else{ $w['a.createtime'] = ['<',$params['endtime']]; } } $w['a.user_id'] = $this->auth->id; $data = Db::name('app_ai_strategy_order a') ->field('a.*,b.coinname,b.image') ->join('app_ai_coin b','a.coin_id = b.id','left') ->where($w) ->order('a.id','desc') ->paginate(20,false,['query' => request()->param()]); foreach ($data as $key=>$value) { $value['createtime'] = date('Y-m-d H:i:s',$value['createtime']); $value['image'] = Config::get("site.image_url").$value['image']; $data[$key] = $value; } $this->success('success',$data); } //设置策略 public function set_strategy() { $params = $this->request->post(); if(!isset($params['coin_id']) || empty($params['coin_id'])) { $this->error(__('请选择要设置的币种')); } //实名认证判断 if(!controller("Common")->get_auth()){ $this->error(__("请先完成实名认证"),['jump'=>1]); } $coinids = explode(',',$params['coin_id']); $paramss = $params; foreach ($coinids as $keys => $values) { $params = $paramss; $params['coin_id'] = $values; $coin = Db::name('app_ai_coin') ->where('id', $params['coin_id']) ->where('status', '1')->find(); if (!$coin) { $this->error(__('币种已下架或不存在')); } $strategy = Db::name('app_ai_strategy') ->where('user_id', $this->auth->id) ->where('coin_id', $params['coin_id']) ->find(); if (!isset($params['first_num']) || empty($params['first_num'])) { if (empty($strategy)) { $params['first_num'] = Config::get('site.first_num'); } else { $params['first_num'] = $strategy['first_num']; } } if ($params['first_num'] < Config::get('site.min_buy')) { $this->error(__('最低买单数量为:') . Config::get('site.min_buy')); } if (!isset($params['order_num']) || empty($params['order_num'])) { if (empty($strategy)) { $params['order_num'] = Config::get('site.order_num'); } else { $params['order_num'] = $strategy['num']; } } else if ($params['order_num'] > Config::get('site.order_num')) { $this->error(__('最高做单数量') . Config::get('site.order_num')); } $params['double_max'] = $params['order_num']; if (!isset($params['zy_percent']) || empty($params['zy_percent'])) { if (empty($strategy)) { $params['zy_percent'] = Config::get('site.zy_percent'); } else { $params['zy_percent'] = $strategy['zy_percent']; } } if (!isset($params['zy_ht']) || empty($params['zy_ht'])) { if (empty($strategy)) { $params['zy_ht'] = Config::get('site.zy_ht'); } else { $params['zy_ht'] = $strategy['zy_ht']; } } $params['bcjson'] = []; foreach ($params as $key => $value) { if (strpos($key, 'bcs_') !== false) { $keys = str_replace('bcs_', '', $key); $params['bcjson'][$keys] = $value; } } if (!isset($params['bcjson']) || empty($params['bcjson'])) { if (empty($strategy)) { $params['bcjson'] = Config::get('site.bcjson'); } else { $params['bcjson'] = json_decode($strategy['bcjson'], true); } } if (!isset($params['bc_ht']) || empty($params['bc_ht'])) { if (empty($strategy)) { $params['bc_ht'] = Config::get('site.bc_ht'); } else { $params['bc_ht'] = $strategy['bc_ht']; } } if (!isset($params['is_double']) || empty($params['is_double'])) { if (empty($strategy)) { $params['is_double'] = Config::get('site.is_double'); } else { $params['is_double'] = $strategy['is_double']; } } if (!isset($params['double_max']) || empty($params['double_max'])) { if (empty($strategy)) { $params['double_max'] = Config::get('site.double_max'); } else { $params['double_max'] = $strategy['double_max']; } } if (!isset($params['type']) || empty($params['type'])) { if (empty($strategy)) { $params['type'] = '2'; } else { $params['type'] = $strategy['type']; } } if (!isset($params['status']) || (empty($params['status']) && $params['status'] != 0)) { if (empty($strategy)) { $params['status'] = '0'; } else { $params['status'] = $strategy['status']; } } if($params['status'] == '1') { //查询信誉值 //当前持仓总量U $strategys = Db::name('app_ai_strategy') ->where('user_id',$this->auth->id) ->where('status','1') ->select(); $cc_amount = $pc_amount = 0; foreach ($strategys as $key=>$value) { if($value['cc_price'] <= 0) continue; $strategy_order = Db::name('app_ai_strategy_order') ->where('strategy_id',$value['id']) ->order('id','desc')->find(); if($strategy_order['type'] == '2') continue; $sum = Db::name('app_ai_strategy_order') ->where('strategy_id',$value['id']) ->where('strategy_code',$strategy_order['strategy_code']) ->where('type','1') ->sum('amount'); $cc_amount += $sum; } //平均收益比 $income_per = Db::name('app_ai_strategy') ->where('user_id',$this->auth->id) ->where('status','1') ->sum('zy_percent'); if($strategys) { $xinyu = sprintf('%.4f', $cc_amount * ($income_per / count($strategy)) * Config::get('site.xinyu_percent')); }else{ $xinyu = 0; } $balances = Db::name('app_currency_user') ->where('user_id',$this->auth->id) ->where('curr_id',1)->find(); if($balances['num_lh'] <= $xinyu) { $this->error(__('信誉值不足,请充值')); } } if (!isset($params['pc_status']) || (empty($params['pc_status']) && $params['pc_status'] != 0)) { if (empty($strategy)) { $params['pc_status'] = '0'; } else { $params['pc_status'] = $strategy['pc_status']; } } if (!isset($params['is_now']) || (empty($params['is_now']) && $params['is_now'] != 0)) { if (empty($strategy)) { $params['is_now'] = '0'; } else { $params['is_now'] = $strategy['pc_status']; $params['is_now'] = $strategy['is_now']; } } if (!isset($params['in_price']) || (empty($params['in_price']) && $params['pc_status'] != 0)) { if (empty($strategy)) { $params['in_price'] = '0.000000'; } else { $params['in_price'] = $strategy['in_price']; } } $update = [ 'user_id' => $this->auth->id, 'coin_id' => $coin['id'], "status" => $params['status'], "first_num" => $params['first_num'], "num" => $params['order_num'], "zy_percent" => $params['zy_percent'], "zy_ht" => $params['zy_ht'], "bcjson" => json_encode($params['bcjson']), "bc_ht" => $params['bc_ht'], "type" => $params['type'], "is_double" => $params['is_double'], "double_max" => $params['double_max'], 'in_price' => $params['in_price'], 'pc_status' => $params['pc_status'], 'is_now' => $params['is_now'], ]; $inserts = false; if ($strategy) { $update['updatetime'] = time(); $ret = Db::name('app_ai_strategy') ->where('id', $strategy['id']) ->update($update); } else { $update['createtime'] = time(); $ret = Db::name('app_ai_strategy') ->insertGetId($update); $strategy['id'] = $ret; $strategy['status'] = $params['status']; $inserts = true; } } if($ret) { $this->success(__('提交成功')); }else{ $this->error(__('系统繁忙')); } } //获取电子账单 public function get_bill() { $params = $this->request->post(); $type = (isset($params['type']) && !empty($params['type']))?$params['type']:'1'; $today = strtotime(date('Y-m-d 00:00:00')); $w['a.user_id'] = $this->auth->id; $size = (isset($params['size']))?$params['size']:20; $exchangeid = 1; if($type == '1') { $data = Db::name('app_ai_strategy_order a') ->field('a.order_sn,a.createtime,a.income,b.coinname,b.image') ->join('app_ai_coin b', 'a.coin_id = b.id', 'left') ->where('a.type','2') ->where('a.user_id',$this->auth->id) ->where('a.createtime','>',$today) ->where('a.income','>',0) ->where('b.exchange_id',$exchangeid) ->order('a.id', 'desc') ->paginate($size, false, ['query' => request()->param()])->each(function($item){ $item['createtime'] = date('Y-m-d H:i:s',$item['createtime']); $item['image'] = Config::get('site.image_url').$item['image']; return $item; })->toArray(); $data['today_num'] = sprintf('%.6f', Db::name('app_ai_strategy_order a') ->field('a.order_sn,a.createtime,a.income,b.coinname') ->join('app_ai_coin b', 'a.coin_id = b.id', 'left') ->where('a.type','2') ->where('a.user_id',$this->auth->id) ->where('a.income','>',0) ->where('b.exchange_id',$exchangeid) ->where('a.createtime','>',$today)->sum('income')); $data['all_num'] = sprintf('%.6f', Db::name('app_ai_strategy_order a') ->field('a.income,a.createtime') ->join('app_ai_coin b', 'a.coin_id = b.id', 'left') ->where('a.type','2') ->where('a.user_id',$this->auth->id) ->where('a.income','>',0) ->where('b.exchange_id',$exchangeid) ->order('a.id', 'desc')->sum('income')); }else { $jstime = date('Y-m-d'); $jsarr = Db::name('app_ai_user_income') ->where('user_id',$this->auth->id) ->where('exchange_id',$exchangeid) ->select(); $jsarrs = array_column($jsarr,'id','jstime'); $datas = Db::name('app_ai_strategy_order a') ->field('a.income,a.createtime') ->join('app_ai_coin b', 'a.coin_id = b.id', 'left') ->where('a.type','2') ->where('a.user_id',$this->auth->id) ->where('a.income','>',0) ->where('b.exchange_id',$exchangeid) ->order('a.id', 'asc') ->select(); $insert = []; $update = []; $today = strtotime(date('Y-m-d 00:00:00')); foreach ($datas as $key=>$value) { $jjtime = date('Y-m-d',$value['createtime']); if(!isset($jsarrs[$jjtime])) { if(!isset($insert[$jjtime])) $insert[$jjtime] = $value['income']; else $insert[$jjtime] += $value['income']; }else { if(!isset($update[$jjtime])) $update[$jjtime] = $value['income']; else $update[$jjtime] += $value['income']; } } if(!empty($insert)){ $insertarr = []; foreach ($insert as $key => $value) { $insertarr[] = [ 'user_id' => $this->auth->id, 'num' => $value, 'jstime' => $key, 'createtime' => time(), 'exchange_id' => $exchangeid, ]; } Db::name('app_ai_user_income')->insertAll($insertarr); } if(!empty($update)) { foreach ($update as $key=>$value) { Db::name('app_ai_user_income') ->where('user_id',$this->auth->id) ->where('exchange_id',$exchangeid) ->where('jstime',$key)->update(['num'=>$value,'updatetime'=>time()]); } } $data = Db::name('app_ai_user_income a') ->field('a.num as income,a.jstime as createtime') ->where('a.user_id',$this->auth->id) ->where('a.exchange_id',$exchangeid) ->order('a.id', 'desc') ->paginate($size, false, ['query' => request()->param()])->toArray(); $data['today_num'] = sprintf('%.6f',Db::name('app_ai_strategy_order a') ->field('a.order_sn,a.createtime,a.income,b.coinname') ->join('app_ai_coin b', 'a.coin_id = b.id', 'left') ->where('a.type','2') ->where('a.user_id',$this->auth->id) ->where('a.income','>',0) ->where('b.exchange_id',$exchangeid) ->where('a.createtime','>',$today)->sum('income')); $data['all_num'] = sprintf('%.6f', Db::name('app_ai_strategy_order a') ->field('a.income,a.createtime') ->join('app_ai_coin b', 'a.coin_id = b.id', 'left') ->where('a.type','2') ->where('a.user_id',$this->auth->id) ->where('a.income','>',0) ->where('b.exchange_id',$exchangeid) ->order('a.id', 'desc')->sum('income')); } //计算今日数据 //当前持仓总量U $strategy = Db::name('app_ai_strategy a') ->field('a.*') ->join('app_ai_coin b', 'a.coin_id = b.id', 'left') ->where('b.exchange_id',$exchangeid) ->where('a.user_id',$this->auth->id) ->select(); $cc_amount = $pc_amount = 0; foreach ($strategy as $key=>$value) { $cc_amount += $value['cc_amount']; } $pc_amount = Db::name('app_ai_strategy_order a') ->join('app_ai_coin b', 'a.coin_id = b.id', 'left') ->where('b.exchange_id',$exchangeid) ->where('a.type','2') ->where('a.user_id',$this->auth->id) ->where('a.createtime','>',$today)->sum('amount'); if($pc_amount <= 0 && $data['today_num'] <= 0) { $yk_percent = '0.0000'; }else $yk_percent = sprintf('%.4f', $data['today_num']/($pc_amount - $data['today_num']) ); //今日平仓总量、今日平均盈亏比例 $data['cc_amount'] = sprintf('%.4f',$cc_amount); $data['pc_amount'] = sprintf('%.4f',$pc_amount); $data['yk_percent'] = $yk_percent; //交易所手续费 $data['exchange_fee'] = sprintf('%.6f',Db::name('app_ai_strategy_order a') ->join('app_ai_coin b', 'a.coin_id = b.id', 'left') ->where('b.exchange_id',$exchangeid) ->where('a.user_id',$this->auth->id) ->where('a.type','2')->sum('a.fee')); //信誉值 $data['xinyu_fee'] = sprintf('%.6f',$data['all_num'] * Config::get('site.xinyu_percent')); //净收益 $data['all_income'] = sprintf('%.6f',$data['all_num'] - $data['exchange_fee'] - $data['xinyu_fee']); //今日交易所手续费 $data['toexchange_fee'] = sprintf('%.6f',Db::name('app_ai_strategy_order a') ->join('app_ai_coin b', 'a.coin_id = b.id', 'left') ->where('b.exchange_id',$exchangeid) ->where('a.user_id',$this->auth->id) ->where('a.type','2') ->where('a.createtime','>',$today) ->sum('a.fee')); //今日信誉值 $data['toxinyu_fee'] = sprintf('%.6f',$data['today_num'] * Config::get('site.xinyu_percent')); //今日净收益 $data['toall_income'] = sprintf('%.6f',$data['today_num'] - $data['toexchange_fee'] - $data['toxinyu_fee']); $data['balance'] = Db::name("app_currency_user")->where("user_id", $this->auth->id)->where("curr_id",1)->value("num_lh"); $this->success('success',$data); } //清仓卖出 public function clean_cang() { $params = $this->request->post(); if(!isset($params['coin_id']) || empty($params['coin_id'])) { $this->error(__('请选择操作币种')); } $coinarr = explode(',',$params['coin_id']); //redis防重复点击 $symbol = "qingcang" . $this->auth->id; $submited = pushRedis($symbol); if (!$submited) { $this->error(__("操作频繁")); } $msg = '清仓卖出'; $url = "https://api.huobi.pro"; foreach ($coinarr as $key=>$value) { $coin = Db::name('app_ai_coin a') ->field('a.*') ->where('a.id',$value) ->find(); if(empty($coin)) continue; //判断是否是最高点--- $coindata = json_decode(http_curl($url.'/market/trade?symbol='.$coin['symbol']),true); if (!isset($coindata['status']) || $coindata['status'] != 'ok') { lopRedis($symbol); $this->error(__('系统繁忙')); } $newprice = $coindata['tick']['data'][0]['price']; $orderids = $coindata['tick']['data'][0]['trade-id']; $strategy = Db::name('app_ai_strategy') ->where('user_id',$this->auth->id) ->where('coin_id',$value) ->find(); if(empty($strategy)) continue; $strategy_order = Db::name('app_ai_strategy_order') ->where('strategy_id',$strategy['id']) ->order('id','desc') ->find(); if($strategy_order['type'] == '2') continue; //总持仓数量 $sumnum = Db::name('app_ai_strategy_order') ->where('strategy_id',$strategy['id']) ->where('strategy_code',$strategy_order['strategy_code']) ->where('type','1') ->sum('num'); //发起交易所接口---- $num = $sumnum; $amount = sprintf('%.8f',$sumnum*$newprice); $outamount = Db::name('app_ai_strategy_order') ->where('strategy_id',$strategy['id']) ->where('strategy_code',$strategy_order['strategy_code']) ->where('type','1') ->sum('amount'); //理论扣除信誉值 $kouchu = sprintf('%.4f',Config::get('site.xinyu_percent')*$outamount*$strategy['zy_percent']); $currency = Db::name('app_currency_user') ->where('user_id',$strategy['user_id']) ->where('curr_id',1)->find(); $diffnum = sprintf('%.4f',$currency['num_lh'] - $kouchu); if($diffnum < 0) { $msg .= '策略币种:'.$coin['coinname'].'平仓失败,信誉值不足:余额-'.$currency['num_lh'].',需扣除信誉值: '.$kouchu; continue; } $income = sprintf('%.6f',$amount - $outamount); $order = [ 'user_id' => $strategy['user_id'], 'coin_id' => $coin['id'], 'strategy_id' => $strategy['id'], 'type' => '2', 'order_sn' => $orderids, 'num' => $num, 'amount' => $amount, 'price' => $newprice, 'fee' => sprintf('%.4f', $amount * 0.0012), 'bc_time' => 0, 'createtime' => time(), 'strategy_code' => $strategy_order['strategy_code'], 'income' => $income, ]; Db::startTrans(); try { if($income > 0) { //扣除信誉值 $kouchu = sprintf('%.4f',Config::get('site.xinyu_percent')*$income); $diffnum = sprintf('%.4f',$currency['num_lh'] - $kouchu); if($diffnum < 0) { $diffnum = 0; $kouchu = $currency['num_lh']; } $user_usdt = Db::name("app_currency_user")->where("user_id", $this->auth->id)->where("curr_id",1)->find(); $detailed[] = [ 'user_id' => $strategy['user_id'], 'curr_id' => '1', 'price' => $amount, 'cart' => '1', 'type' => '2', 'description' => '量化卖出', 'createtime' => time(), 'before_num' => $user_usdt['num_lh'], 'after_num' => $user_usdt['num_lh']+$amount ]; Db::name('app_currency_user')->where('id',$user_usdt['id'])->update(['num_lh'=>$user_usdt['num_lh']+$amount]); $detailed[] = [ 'user_id' => $strategy['user_id'], 'curr_id' => '2', 'price' => $kouchu, 'cart' => '2', 'type' => '2', 'description' => '扣取信誉值', 'createtime' => time(), 'before_num' => $currency['num_lh'], 'after_num' => $diffnum ]; Db::name('app_currency_user')->where('id',$currency['id'])->update(['num_lh'=>$diffnum]); Db::name('app_detailed_lh')->insertAll($detailed); //上级反信誉值 // $users = Db::name('user')->where('id',$strategy['user_id'])->find(); // $usersarr = array_filter(array_reverse( explode('|',$users['team_text']))); // $lastper = 0; // foreach ($usersarr as $ks => $vals) // { // if(!is_numeric($vals) || empty($vals)) continue; // if( $vals == 1) continue; //$vals == $strategy['user_id'] || // $usera = Db::name('user')->where('id',$vals)->find(); // if($usera['share_percent'] <= 0) continue; // $currencys = Db::name('app_currency_user') // ->where('user_id',$usera['id']) // ->where('curr_id','1')->find(); // $percents = $usera['share_percent'] - $lastper; // if($percents <= 0) continue; // $addnum = sprintf('%.4f',$kouchu * $percents); // $diffnums = sprintf('%.4f',$currencys['num'] + $addnum); // // $detailed = [ // 'user_id' => $usera['id'], // 'curr_id' => '7', // 'price' => $addnum, // 'cart' => '1', // 'type' => '3', // 'description' => '获取信誉值', // 'createtime' => time(), // 'before_num' => $currencys['num'], // 'after_num' => $diffnums // ]; // if($usera['share_percent'] > 0) $lastper = $usera['share_percent']; // Db::name('app_detailed_lh') // ->insert($detailed); // $ret = Db::name('app_currency_user') // ->where('user_id',$usera['id']) // ->where('curr_id','1')->update(['num'=>$diffnums,'updatetime'=>time()]); // // } } Db::name('app_ai_strategy_order')->insert($order); Db::name('app_ai_strategy') ->where('id',$strategy['id'])->update(['cc_price'=>0,'cc_num'=>0,'cc_amount'=>0,'updatetime'=>time()]); if($strategy['type'] == '1' && $strategy['status'] == '1'){ //单次循环暂停 $ret = Db::name('app_ai_strategy') ->where('id',$strategy['id']) ->update(['status'=>'0','updatetime'=>time()]); } Db::commit(); $this->success(__('已清仓,请查看交易记录详情').$msg); } catch (Exception $e) { Db::rollback(); lopRedis($symbol); $this->error(__("清仓失败")); } } $this->error($msg); } //手动加仓 public function add_cang() { //实名认证判断 if(!controller("Common")->get_auth()){ $this->error(__("请先完成实名认证"),['jump'=>1]); } $params = $this->request->post(); if(!isset($params['coin_id']) || empty($params['coin_id'])) { $this->error(__('请选择操作币种')); } if(!isset($params['num']) || empty($params['num']) || !is_numeric($params['num'])) { $this->error(__('请输入补仓数量')); } if($params['num'] < Config::get('site.min_buy')) { $this->error(__('最低买单数量为:').Config::get('site.min_buy')); } $coin = Db::name('app_ai_coin a') ->field('a.*') ->where('a.id',$params['coin_id']) ->find(); if(empty($coin)) { $this->error(__('交易币种不存在')); } $strategy = Db::name('app_ai_strategy') ->where('user_id',$this->auth->id) ->where('coin_id',$coin['id']) ->find(); if($strategy['status'] != '1'){ $this->error(__('请开启策略')); } //redis防重复点击 $symbol = "jiacang" . $this->auth->id; $submited = pushRedis($symbol); if (!$submited) { $this->error(__("操作频繁")); } $strategy_order = Db::name('app_ai_strategy_order') ->where('strategy_id',$strategy['id']) ->order('id','desc') ->find(); //判断是否是最高点--- $url = "https://api.huobi.pro"; $coindata = json_decode(http_curl($url.'/market/trade?symbol='.$coin['symbol']),true); if (!isset($coindata['status']) || $coindata['status'] != 'ok') { lopRedis($symbol); $this->error(__('系统繁忙')); } $newprice = $coindata['tick']['data'][0]['price']; $orderids = $coindata['tick']['data'][0]['trade-id']; $dou = pow(10,$coin['precision']); $user_usdt = Db::name("app_currency_user")->where("user_id",$this->auth->id)->where("curr_id",1)->find(); if($user_usdt['num_lh'] < $params['num']){ $this->error(__("余额不足")); } $num = sprintf('%.6f', $params['num'] / $newprice); $order = [ 'user_id' => $this->auth->id, 'coin_id' => $coin['id'], 'strategy_id' => $strategy['id'], 'type' => '1', 'order_sn' => $orderids, 'num' => $num, 'amount' => $params['num'], 'price' => $newprice, 'fee' => sprintf('%.4f', $num * 0.002), 'bc_time' => 0, 'createtime' => time(), ]; $detailed[] = [ 'user_id' => $this->auth->id, 'curr_id' => '1', 'price' => $params['num'], 'cart' => '2', 'type' => '2', 'description' => '量化补仓', 'createtime' => time(), 'before_num' => $user_usdt['num_lh'], 'after_num' => $user_usdt['num_lh']-$params['num'] ]; if(empty($strategy_order)) $order['strategy_code'] = 1; else if($strategy_order['type'] == '2'){ $order['strategy_code'] = $strategy_order['strategy_code'] + 1; }else{ $order['strategy_code'] = $strategy_order['strategy_code']; } Db::startTrans(); try { //添加记录 Db::name('app_currency_user')->where('id',$user_usdt['id'])->update(['num_lh'=>$user_usdt['num_lh']-$params['num']]); Db::name("app_detailed_lh")->insertAll($detailed); if($strategy_order['type'] == '2'){ //需要扣除手续费后 根据精度算出真实持仓数量 $ccnums = intval(($order['num']- $order['fee'])*pow(10,8))/pow(10,8); $ccprices = intval($order['amount']/$ccnums*pow(10,8))/pow(10,8); $allamount = $order['amount']; }else { //更新持仓均价 $allamount = Db::name('app_ai_strategy_order') ->where('strategy_id', $strategy['id']) ->where('strategy_code', $strategy_order['strategy_code']) ->where('type', '1') ->sum('amount'); $allnum = Db::name('app_ai_strategy_order') ->where('strategy_id', $strategy['id']) ->where('strategy_code', $strategy_order['strategy_code']) ->where('type', '1') ->sum('num'); $allfee = Db::name('app_ai_strategy_order') ->where('strategy_id', $strategy['id']) ->where('strategy_code', $strategy_order['strategy_code']) ->where('type', '1') ->sum('fee'); $allamount += $params['num']; $allnum += $order['num']; $allfee += $order['fee']; $ccnums = intval(($allnum - $allfee) * pow(10, 8)) / pow(10, 8); $ccprices = intval($allamount / $ccnums * pow(10, 8)) / pow(10, 8); } Db::name('app_ai_strategy')->where('id',$strategy['id'])->update(['cc_price'=>$ccprices,'cc_num'=>$ccnums,'cc_amount'=>$allamount,'updatetime'=>time()]); Db::name('app_ai_strategy_order')->insert($order); lopRedis($symbol); Db::commit(); $this->success(__('加仓成功')); } catch (Exception $e) { lopRedis($symbol); Db::rollback(); $this->error(__('系统繁忙')); } } //获取默认设置 public function get_strategy_ori() { $bcjson = Config::get('site.bcjson'); $bcjsons = []; $stretagy = [ "first_num" => Config::get('site.first_num'), "order_num" => Config::get('site.order_num'), "zy_percent" => Config::get('site.zy_percent'), "zy_ht" => Config::get('site.zy_ht'), "bcjson" => $bcjsons, "bc_ht" => Config::get('site.bc_ht'), "is_double" => Config::get('site.is_double'), "double_max" => Config::get('site.double_max'), ]; foreach ($bcjson as $key=>$value) { $stretagy['bcs_'.$key] = $value; } $this->success('success',$stretagy); } public function test() { $shouquan = Db::name('app_ai_shouquan a') ->field('a.*,b.api_url') ->join('app_ai_exchange b','a.exchange_id = b.id','left') ->where('a.user_id',37)->find();; $apis = new Huobi($shouquan['api_key'], $shouquan['secret_key'], $shouquan['api_url']); $times = (time() - 28800)*1000; $startime = getMillisecond() - 36000*1000; $endtime = getMillisecond(); $result = $apis->search_order('arpausdt','sell-market',$startime,$endtime); echo "
";
        var_dump($result);
    }

    //获取通用策略限制
    public function get_strategy_setting()
    {
        $params = $this->request->post();
        if(isset($params['exchange_id'])) $exchangeid = $params['exchange_id'];
        else $exchangeid = 1;
        if($exchangeid == 1) {
            $data = [
                'bc_min_limit' => $this->auth->bc_min_limit
            ];
        }else if($exchangeid == 2){
            $data = [
                'bc_min_limit' => $this->auth->bc_min_limit_ba
            ];
        }else{
            $data = [
                'bc_min_limit' => 0.000000
            ];
        }
        $this->success('ok',$data);
    }

    //设置补仓余额最低限制,低于不进行补仓
    public function setbc_limit()
    {
        $params = $this->request->post();
        if(!isset($params['bc_min_limit']) || empty($params['bc_min_limit']) || !is_numeric($params['bc_min_limit']))
        {
            $this->error(__('请输入设置的补仓最低余额限制'));
        }
        if(isset($params['exchange_id'])) $exchangeid = $params['exchange_id'];
        else $exchangeid = 1;
        if($exchangeid == 1) {
            $ret = Db::name('user')
                ->where('id',$this->auth->id)
                ->update(['bc_min_limit' => $params['bc_min_limit'],'updatetime'=>time()]);
        }else if($exchangeid == 2){
            $ret = Db::name('user')
                ->where('id',$this->auth->id)
                ->update(['bc_min_limit_ba' => $params['bc_min_limit'],'updatetime'=>time()]);
        }else{
            $ret = false;
        }

        if($ret){
            $this->success(__('提交成功'));
        }else{
            $this->error(__('系统繁忙'));
        }
    }

    //获取排行榜
    public function get_paihang()
    {
        $params = $this->request->post();
        $today = strtotime(date('Y-m-d'));
        if(isset($params['exchange_id'])) $exchangeid = $params['exchange_id'];
        else $exchangeid = 1;
        if($params['type'] == 1)  //日收益
        {
            $data = Db::name('app_ai_user_income a')
                ->field('a.num as income,a.jstime,b.nickname,b.avatar,a.pcnum,a.income_per')
                ->join('user b','b.id=a.user_id','left')
                ->where('a.jstime',date('Y-m-d'))
                ->where('a.exchange_id',$exchangeid)
                ->order('a.num','desc')->limit(10)->select();
            foreach ($data as $key => $value)
            {
                $value['avatar'] = Config::get('site.image_url').$value['avatar'];
                $data[$key] = $value;
            }
        }else if($params['type'] == 2)  //总收益
        {
            $data = Db::name('app_ai_user_income_all a')
                ->field('a.income,b.nickname,b.avatar,a.pcnum,a.income_per')
                ->where('a.income','>',0)
                ->join('user b','b.id=a.user_id','left')
                ->where('a.exchange_id',$exchangeid)
                ->order('a.income','desc')->limit(10)->select();
            foreach ($data as $key => $value)
            {
                $value['avatar'] = Config::get('site.image_url').$value['avatar'];
                $data[$key] = $value;
            }
        }else{    //币种
            $today = strtotime( date('Y-m-d'));
            $data = Db::name('app_ai_strategy_order a')
                ->field('count(a.id) as num,b.coinname,b.id as coin_id,b.image,c.image as exchange_image')
                ->join('app_ai_coin b','b.id=a.coin_id','left')
                ->join('app_ai_exchange c','c.id=b.exchange_id','left')
                ->where('a.type',2)
                ->where('a.createtime','>',$today)
                ->where('b.exchange_id',$exchangeid)
                ->group('a.coin_id')
                ->limit('50')
                ->order('num','desc')
                ->select();
            foreach ($data as $key=>$value)
            {
                $value['image'] = Config::get('site.image_url').$value['image'];
                $value['exchange_image'] = Config::get('site.image_url').$value['exchange_image'];
                $strategy_order = Db::name('app_ai_strategy_order')
                    ->where('coin_id',$value['coin_id'])
                    ->where('type','2')
                    ->where('createtime','>',$today)
                    ->order('id','desc')->find();
                $value['last_time'] = date('H:i:s',$strategy_order['createtime']);
                $data[$key] = $value;
            }
        }
        $this->success('ok',$data);
    }

}