11 changed files with 908 additions and 7 deletions
@ -0,0 +1,102 @@ |
|||||
|
<?php |
||||
|
|
||||
|
|
||||
|
namespace App\Admin\Actions\User; |
||||
|
|
||||
|
use Dcat\Admin\Admin; |
||||
|
use Dcat\Admin\Grid\RowAction; |
||||
|
use Illuminate\Http\Request; |
||||
|
use Dcat\Admin\Actions\Action; |
||||
|
use Dcat\Admin\Actions\Response; |
||||
|
use Illuminate\Support\Facades\DB; |
||||
|
use Illuminate\Database\Eloquent\Model; |
||||
|
use Dcat\Admin\Traits\HasPermissions; |
||||
|
use Illuminate\Contracts\Auth\Authenticatable; |
||||
|
use Illuminate\Support\Str; |
||||
|
|
||||
|
class AddContractControl extends Action |
||||
|
{ |
||||
|
/** |
||||
|
* @return string |
||||
|
*/ |
||||
|
protected $title = '新增K线风控'; |
||||
|
|
||||
|
public function render() |
||||
|
{ |
||||
|
$id = get_order_sn('su'); |
||||
|
|
||||
|
// 模态窗 |
||||
|
$this->modal($id); |
||||
|
|
||||
|
return <<<HTML |
||||
|
<span class="grid-expand" data-toggle="modal" data-target="#{$id}"> |
||||
|
<a class="btn btn-sm btn-outline-primary" href="javascript:void(0)">{$this->title}</a> |
||||
|
</span> |
||||
|
HTML; |
||||
|
} |
||||
|
|
||||
|
protected function modal($id) |
||||
|
{ |
||||
|
// 工具表单 |
||||
|
$form = new \App\Admin\Forms\ContractRisknew(); |
||||
|
|
||||
|
// 通过 Admin::html 方法设置模态窗HTML |
||||
|
Admin::html( |
||||
|
<<<HTML |
||||
|
<div class="modal fade" id="{$id}"> |
||||
|
<div class="modal-dialog modal-lg" role="document"> |
||||
|
<div class="modal-content"> |
||||
|
<div class="modal-header"> |
||||
|
<h4 class="modal-title">{$this->title}</h4> |
||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> |
||||
|
</div> |
||||
|
<div class="modal-body"> |
||||
|
{$form->render()} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
HTML |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Handle the action request. |
||||
|
* |
||||
|
* @param Request $request |
||||
|
* |
||||
|
* @return Response |
||||
|
*/ |
||||
|
public function handle(Request $request) |
||||
|
{ |
||||
|
// dump($this->getKey()); |
||||
|
|
||||
|
// return $this->response()->success('Processed successfully.')->redirect('/'); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @return string|array|void |
||||
|
*/ |
||||
|
public function confirm() |
||||
|
{ |
||||
|
// return ['Confirm?', 'contents']; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @param Model|Authenticatable|HasPermissions|null $user |
||||
|
* |
||||
|
* @return bool |
||||
|
*/ |
||||
|
protected function authorize($user): bool |
||||
|
{ |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @return array |
||||
|
*/ |
||||
|
protected function parameters() |
||||
|
{ |
||||
|
return []; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,95 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\Admin\Controllers; |
||||
|
|
||||
|
use App\Admin\Actions\User\AddContractControl; |
||||
|
use App\Admin\Actions\User\AddPromotionUser; |
||||
|
use App\Admin\Actions\User\AddSystemUser; |
||||
|
use App\Admin\Actions\User\AddUser; |
||||
|
use App\Admin\Renderable\Parents; |
||||
|
use App\Admin\Renderable\UserTradeStatistics; |
||||
|
use App\Admin\Renderable\UserWalletExpand; |
||||
|
use App\Handlers\ContractTool; |
||||
|
use App\Models\AgentGrade; |
||||
|
use App\Models\ContractPair; |
||||
|
use App\Models\ContractPosition; |
||||
|
use App\Models\PlatformContractControl; |
||||
|
use App\Models\SustainableAccount; |
||||
|
use App\Models\User; |
||||
|
use App\Models\UserAuth; |
||||
|
use App\Models\UserGrade; |
||||
|
use Dcat\Admin\Form; |
||||
|
use Dcat\Admin\Grid; |
||||
|
use Dcat\Admin\Layout\Content; |
||||
|
use Dcat\Admin\Show; |
||||
|
use Dcat\Admin\Controllers\AdminController; |
||||
|
use Dcat\Admin\Widgets\Card; |
||||
|
use Illuminate\Support\Facades\Cache; |
||||
|
use Dcat\Admin\Admin; |
||||
|
use Illuminate\Http\Request; |
||||
|
|
||||
|
class ContractRisknewController extends AdminController |
||||
|
{ |
||||
|
// public function index(Content $content) |
||||
|
// { |
||||
|
// return $content |
||||
|
// ->title('新合约风控') |
||||
|
// ->body(new Card(new \App\Admin\Forms\ContractRisknew())); |
||||
|
// } |
||||
|
|
||||
|
protected function grid() |
||||
|
{ |
||||
|
$pcc = PlatformContractControl::query()->orderByDesc('id'); |
||||
|
return Grid::make($pcc, function (Grid $grid) { |
||||
|
// $aa = DB::select('select * from contract_position'); |
||||
|
|
||||
|
if (Admin::user()->can('addSystemUser')) { |
||||
|
$grid->tools([new AddContractControl()]); |
||||
|
} |
||||
|
|
||||
|
$grades = AgentGrade::getCachedGradeOption(); |
||||
|
|
||||
|
$grid->id; |
||||
|
|
||||
|
|
||||
|
$grid->column('symbol','币种名称'); |
||||
|
$grid->column('now_price','操作价格'); |
||||
|
$grid->column('blacktime','回调时间'); |
||||
|
$grid->column('time','操作时间')->display(function ($v) { |
||||
|
return date('Y-m-d H:i:s', $v); |
||||
|
});; |
||||
|
|
||||
|
|
||||
|
$grid->disableViewButton(); |
||||
|
$grid->disableCreateButton(); |
||||
|
//$grid->disableEditButton(); |
||||
|
$grid->disableDeleteButton(); |
||||
|
$grid->disableBatchDelete(); |
||||
|
|
||||
|
$grid->filter(function (Grid\Filter $filter) use ($grades) { |
||||
|
$filter->between('created_at', "时间")->date()->width(4); |
||||
|
$filter->equal('whethertopromote', '币种名称')->select(function (){ |
||||
|
$symbols = config('coin.exchange_symbols'); |
||||
|
$PlatformCurrency = []; |
||||
|
foreach ($symbols as $key=>$val){ |
||||
|
$PlatformCurrency[]= $key; |
||||
|
// var_dump($key); |
||||
|
} |
||||
|
return $PlatformCurrency; |
||||
|
|
||||
|
})->width(2); |
||||
|
}); |
||||
|
}) |
||||
|
->title('新合约风控'); |
||||
|
} |
||||
|
|
||||
|
public function symbolDetal(Request $request){ |
||||
|
$cd = Cache::store('redis')->get('swap:' . $request['symbol'] . '_detail'); |
||||
|
if($cd){ |
||||
|
$cd['highest'] = $cd['price'] * 1.1; |
||||
|
$cd['minimum'] = $cd['price'] * 0.9; |
||||
|
} |
||||
|
|
||||
|
return $cd; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,578 @@ |
|||||
|
<?php |
||||
|
/* |
||||
|
* @Descripttion: |
||||
|
* @version: |
||||
|
* @Author: GuaPi |
||||
|
* @Date: 2021-07-29 10:40:49 |
||||
|
* @LastEditors: GuaPi |
||||
|
* @LastEditTime: 2021-08-09 17:43:48 |
||||
|
*/ |
||||
|
|
||||
|
namespace App\Admin\Forms; |
||||
|
|
||||
|
use App\Models\ContractPair; |
||||
|
use App\Models\PlatformContractControl; |
||||
|
use App\Models\User; |
||||
|
use Dcat\Admin\Grid; |
||||
|
use Dcat\Admin\Widgets\Form; |
||||
|
use Illuminate\Support\Facades\DB; |
||||
|
use Illuminate\Support\Facades\Redis; |
||||
|
use Symfony\Component\HttpFoundation\Response; |
||||
|
use Illuminate\Support\Facades\Cache; |
||||
|
use Illuminate\Support\Facades\Log; |
||||
|
use App\Models\DataTobr; |
||||
|
use Dcat\Admin\Admin; |
||||
|
|
||||
|
|
||||
|
class ContractRisknew extends Form |
||||
|
{ |
||||
|
/**s |
||||
|
* Handle the form request. |
||||
|
* |
||||
|
* @param array $input |
||||
|
* |
||||
|
* @return Response |
||||
|
*/ |
||||
|
public function handle(array $input) |
||||
|
{ |
||||
|
|
||||
|
$coin_up = [ |
||||
|
'symbol' => $input['symbol'], |
||||
|
'blacktime' => $input['blacktime'], |
||||
|
'now_price' => $input['nowprice'], |
||||
|
'time' => time(), |
||||
|
]; |
||||
|
$cd = Cache::store('redis')->get('swap:' . $input['symbol'] . '_detail'); |
||||
|
if($cd){ |
||||
|
$cd['highest'] = $cd['price'] * 1.1; |
||||
|
$cd['minimum'] = $cd['price'] * 0.9; |
||||
|
} |
||||
|
if($input['nowprice']>$cd['highest'] || $input['nowprice']<$cd['minimum']){ |
||||
|
return $this->error('控制价格不在范围内'); |
||||
|
} |
||||
|
|
||||
|
PlatformContractControl::query()->insert($coin_up); |
||||
|
|
||||
|
$dotime = time(); |
||||
|
$now_min_s = date('s', $dotime); |
||||
|
|
||||
|
|
||||
|
if ($now_min_s >= 55) { |
||||
|
return $this->error('最后5秒不给更新'); |
||||
|
} |
||||
|
// if ($now_min_s <= 5) { |
||||
|
// return $this->error('开始5秒不给更新'); |
||||
|
// } |
||||
|
$NumberOfRecovery = $input['blacktime']; |
||||
|
$symbols = ContractPair::query()->pluck('symbol'); |
||||
|
$PlatformCoin = config('coin.exchange_symbols'); |
||||
|
foreach ($PlatformCoin as $val => $key) { |
||||
|
$PlatformCoinNew[] = $val; |
||||
|
} |
||||
|
$data['count'] = $input['nowprice']; |
||||
|
$doit = $this->PlatformCurrencyRiskControlTotalProcessing($input['symbol'], $data, time(),$NumberOfRecovery); |
||||
|
// var_dump($symbols); |
||||
|
return $this->success('Processed successfully.'); |
||||
|
exit(); |
||||
|
foreach ($symbols as $symbol) { |
||||
|
if (!empty($input[$symbol])) { |
||||
|
$risk_key = 'fkJson:' . $symbol . '/USDT'; |
||||
|
$data = $input[$symbol]; |
||||
|
if (in_array($symbol, $PlatformCoinNew)) { |
||||
|
// if ($input[$symbol]['enabled'] == 1) { |
||||
|
$dotime = strtotime(date('Y-m-d ', time()) . $input[$symbol]['strat_time']); |
||||
|
// $doit = $this->PlatformCurrencyRiskControlTotalProcessing('AAAAA', $input[$symbol]); |
||||
|
// if ($input[$symbol]['pin'] == 1) { |
||||
|
// $doit = $this->PlatformCurrencyRiskControlTotalProcessing($symbol, $input[$symbol], $dotime); |
||||
|
// } else { |
||||
|
// $doit = $this->PlatformCurrencyRiskControlTotalProcessing($symbol, $input[$symbol], time()); |
||||
|
// } |
||||
|
$doit = $this->PlatformCurrencyRiskControlTotalProcessing($symbol, $input[$symbol], time(),$NumberOfRecovery); |
||||
|
if ($doit) { |
||||
|
return $this->error($doit); |
||||
|
} |
||||
|
// } |
||||
|
} |
||||
|
// !blank($risk) |
||||
|
$old_data = json_decode(Redis::get($risk_key), true); |
||||
|
if($old_data['now_time'] ==strtotime(date("Y-m-d H:i:00"))){ |
||||
|
return $this->error('此根还在路上,请下一分钟再操作'); |
||||
|
} |
||||
|
if(empty($old_data['now_time']) || $old_data['enabled'] == 1 || $data['enabled'] == 1){ |
||||
|
$data['now_time'] = strtotime(date("Y-m-d H:i:00")); |
||||
|
|
||||
|
if($data['enabled'] == 1 && $old_data['enabled'] == 1){ |
||||
|
// // 二次改价 |
||||
|
$data['back_count'] = $old_data['count']; |
||||
|
}elseif ($data['enabled'] == 0 && $old_data['enabled'] == 1){ |
||||
|
// // 关闭风控 |
||||
|
$data['back_count'] = $data['count']; |
||||
|
}else{ |
||||
|
// // 开启风控 |
||||
|
$data['back_count'] = $data['count']; |
||||
|
} |
||||
|
|
||||
|
}else{ |
||||
|
if(empty($old_data['now_time'])){ |
||||
|
$old_data['now_time'] = strtotime(date("Y-m-d H:i:00"))-180; |
||||
|
} |
||||
|
$data['now_time'] = $old_data['now_time']; |
||||
|
} |
||||
|
|
||||
|
Redis::set($risk_key, json_encode($data)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// return $this->error('Your error message.'); |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Notes: 平台币风控处理不走队列 |
||||
|
* @param $coin 币名称 |
||||
|
* @param $data 风控数据 |
||||
|
* User: torsenli |
||||
|
* Date: 2022/3/20 |
||||
|
* Time: 22:12 |
||||
|
*/ |
||||
|
public function PlatformCurrencyRiskControlTotalProcessing($coin, $data,$dotime,$NumberOfRecovery = 35) |
||||
|
{ |
||||
|
$now_time = strtotime(date('Y-m-d H:i', $dotime) . ":00"); |
||||
|
$now_min = date('i', $dotime); |
||||
|
$now_min_s = date('s', $dotime); |
||||
|
$decimal = 100000; |
||||
|
|
||||
|
if ($now_min_s >= 55) { |
||||
|
return "最后5秒不给更新"; |
||||
|
} |
||||
|
|
||||
|
$symbols = config('coin.exchange_symbols'); |
||||
|
|
||||
|
$coins = []; |
||||
|
$kk = 1; |
||||
|
foreach ($symbols as $symbol => $model) { |
||||
|
$coins[$symbol] = $model; |
||||
|
$kk++; |
||||
|
} |
||||
|
|
||||
|
// todo 测试固定model |
||||
|
$model = $coins[$coin]; |
||||
|
// $model = "App\Models\DataAaaaa"; |
||||
|
|
||||
|
// 更新当前一分钟数据 |
||||
|
// 获取当前一分钟数据 |
||||
|
$one_min_date = $model::query()->where('Date', $now_time)->where('is_1min', 1)->first()->toArray(); |
||||
|
Log::info($one_min_date); |
||||
|
// 判断是涨还是跌 |
||||
|
if ($one_min_date['Open'] < $data['count']) { |
||||
|
$UpsAndDowns = 1; |
||||
|
} else { |
||||
|
$UpsAndDowns = 0; |
||||
|
} |
||||
|
// 更新当前一分钟收盘数据 |
||||
|
$this->UpdateTheCurrentMinute($UpsAndDowns, $data['count'], $now_time, $model, $one_min_date); |
||||
|
|
||||
|
|
||||
|
// 随机回调15-25条一分钟 |
||||
|
// $NumberOfRecovery = mt_rand(15, 25); |
||||
|
// $NumberOfRecovery = 35; |
||||
|
$end_open = $model::query()->where('Date', $now_time + $NumberOfRecovery * 60)->where('is_1min', 1)->first()->toArray(); |
||||
|
|
||||
|
// 判断修复,是涨还是跌 |
||||
|
if ($end_open['Open'] > $data['count']) { |
||||
|
$high_price = $end_open['Open']; |
||||
|
$low_price = $data['count']; |
||||
|
} else { |
||||
|
$high_price = $data['count']; |
||||
|
$low_price = $end_open['Open']; |
||||
|
} |
||||
|
$open_price = $data['count']; |
||||
|
$close_price = $end_open['Open']; |
||||
|
|
||||
|
// 更新缓存最高最低 |
||||
|
// $periods = ['5min', '15min', '30min', '60min']; |
||||
|
// foreach ($periods as $period){ |
||||
|
// Log::info($coin); |
||||
|
// $old_per = Cache::store('redis')->get('swap:' . $coin . '_kline_' . $period); |
||||
|
// Log::info($old_per); |
||||
|
// // |
||||
|
// $old_per['high'] = $old_per['open']; |
||||
|
// $old_per['low'] = $old_per['open']; |
||||
|
// Cache::store('redis')->put('swap:' . $coin . '_kline_' . $period,$old_per); |
||||
|
// } |
||||
|
|
||||
|
|
||||
|
// 生成随机修复分钟数 |
||||
|
$period2_seconds = 60; |
||||
|
$periodCount = $NumberOfRecovery; |
||||
|
$periodsTrend = []; |
||||
|
$unit = custom_number_format(bcMath(($high_price - $low_price), $NumberOfRecovery - 1, '/', 8), 8); |
||||
|
$ups_downs_high = abs(floor($unit * $decimal * 5)); //高 |
||||
|
$ups_downs_value = abs(floor($unit * 2 * $decimal)); //值 |
||||
|
$ups_downs_low = floor($close_price); //低 |
||||
|
|
||||
|
$points = linspace($open_price, $close_price, $periodCount); |
||||
|
|
||||
|
|
||||
|
for ($i = 0; $i < $NumberOfRecovery; $i++) { |
||||
|
if ($end_open['Open'] > $data['count']) { |
||||
|
$thresholdValue = 60; |
||||
|
} else { |
||||
|
$thresholdValue = 40; |
||||
|
} |
||||
|
|
||||
|
$periodsTrend[$now_time + ($i * $period2_seconds)] = mt_rand(1, 100) <= $thresholdValue ? 1 : 2; |
||||
|
$prev = $model::query()->where('is_1min', 1)->where('Date', $now_time + ($i * $period2_seconds))->first(); // 上一条K线 |
||||
|
$close_point = $points[$i] * $decimal; |
||||
|
$current = $now_time + 60; |
||||
|
$open = $prev['Close'] * $decimal; |
||||
|
$up_or_down = mt_rand(1, 100); |
||||
|
$first = array_first($periodsTrend, function ($v, $k) use ($current, $period2_seconds) { |
||||
|
return $current >= $k && $current < ($k + $period2_seconds); |
||||
|
}); |
||||
|
|
||||
|
// dd($current); |
||||
|
|
||||
|
if ($first == 1) { |
||||
|
$value = 60; |
||||
|
} else { |
||||
|
$value = 40; |
||||
|
} |
||||
|
|
||||
|
// dd($ups_downs_low,$ups_downs_value,$ups_downs_high); |
||||
|
if ($up_or_down <= $value) { |
||||
|
// 涨 |
||||
|
$close = mt_rand($close_point, $close_point + mt_rand($ups_downs_low, $ups_downs_high)); |
||||
|
$high = mt_rand($close, $close + mt_rand($ups_downs_low, $ups_downs_value)); |
||||
|
$low = mt_rand($close - mt_rand($ups_downs_low, $ups_downs_value), $close); |
||||
|
} else { |
||||
|
// 跌 |
||||
|
$close = mt_rand($close_point - mt_rand($ups_downs_low, $ups_downs_high), $close_point); |
||||
|
$high = mt_rand($close, $close + mt_rand($ups_downs_value, $ups_downs_high)); |
||||
|
$low = mt_rand($close - mt_rand($ups_downs_low, $ups_downs_value), $close); |
||||
|
} |
||||
|
$high = max($open, $close, $high, $low); |
||||
|
$low = min($open, $close, $high, $low); |
||||
|
|
||||
|
// dd($open,$close,$high,$low,$close_point); |
||||
|
|
||||
|
$open = $open / $decimal; |
||||
|
$close = $close / $decimal; |
||||
|
$high = $high / $decimal; |
||||
|
$low = $low / $decimal; |
||||
|
if ($i + 1 == $NumberOfRecovery) { |
||||
|
$close = $end_open['Open']; |
||||
|
} |
||||
|
$data_new = ['open' => $open, 'close' => $close, 'high' => $high, 'low' => $low]; |
||||
|
// $data_new_after = ['Open' => $open, 'Close' => $close, 'High' => $high, 'Low' => $low,'time'=>date("Y-m-d H:i:s", $now_time + ($i * $period2_seconds)+60)]; |
||||
|
$data_new_after = ['Open' => $open, 'Close' => $close, 'High' => $high, 'Low' => $low, 'LastClose' => $close]; |
||||
|
// $cc['time'] = date("Y-m-d H:i:s", $now_time); |
||||
|
$model::query()->where('Date', $now_time + ($i * $period2_seconds) + 60)->where('is_1min', 1)->update($data_new_after); |
||||
|
// dump($data_new_after); |
||||
|
// Log::info(11111); |
||||
|
$this->OtherPeriod($now_time + ($i * $period2_seconds), $data_new, $model); |
||||
|
// dd($open, $close, $high, $low); |
||||
|
} |
||||
|
// dd($cc); |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Notes: 更新当前1分钟k线 |
||||
|
* @param $UpsAndDowns 涨跌0为涨1为跌 |
||||
|
* @param $UpdateValue 目标值 |
||||
|
* @param $Timing 定时时间 |
||||
|
* User: torsenli |
||||
|
* Date: 2022/3/20 |
||||
|
* Time: 18:00 |
||||
|
*/ |
||||
|
public function UpdateTheCurrentMinute($UpsAndDowns, $UpdateValue, $Timing = null, $model, $one_min_date = null) |
||||
|
{ |
||||
|
// Log::info(2222); |
||||
|
if ($UpsAndDowns > 0) { |
||||
|
if($UpdateValue>=$one_min_date['High']){ |
||||
|
$hight = $UpdateValue; |
||||
|
}else{ |
||||
|
$hight = $one_min_date['High']; |
||||
|
} |
||||
|
|
||||
|
$model::query()->where('Date', $Timing)->where('is_1min', 1)->update(['High' => $hight, 'Close' => $UpdateValue, 'LastClose' => $UpdateValue]); |
||||
|
// $model::query()->where('Date', $Timing + 60)->where('is_1min', 1)->update(['Low' => $UpdateValue, 'Open' => $UpdateValue]); |
||||
|
|
||||
|
// $data_new_one = ['open' => $one_min_date['Open'], 'close' => $UpdateValue, 'high' => $one_min_date['High'], 'low' => $UpdateValue]; |
||||
|
|
||||
|
|
||||
|
$data_new_one = ['open' => $one_min_date['Open'], 'close' => $UpdateValue, 'high' => $hight, 'low' => $one_min_date['Low']]; |
||||
|
$this->OtherPeriod($Timing, $data_new_one, $model); |
||||
|
} else { |
||||
|
if($UpdateValue<=$one_min_date['Low']) { |
||||
|
$low = $UpdateValue; |
||||
|
}else{ |
||||
|
$low = $one_min_date['Low']; |
||||
|
} |
||||
|
$model::query()->where('Date', $Timing)->where('is_1min', 1)->update(['Low' => $low, 'Close' => $UpdateValue, 'LastClose' => $UpdateValue]); |
||||
|
// $model::query()->where('Date', $Timing + 60)->where('is_1min', 1)->update(['High' => $UpdateValue, 'Open' => $UpdateValue]); |
||||
|
|
||||
|
$data_new_one = ['open' => $one_min_date['Open'], 'close' => $UpdateValue, 'high' => $one_min_date['High'], 'low' => $low]; |
||||
|
$this->OtherPeriod($Timing, $data_new_one, $model); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Notes: 更新其他时段值 |
||||
|
* @param $now_time |
||||
|
* @param $data |
||||
|
* @param $model |
||||
|
* User: torsenli |
||||
|
* Date: 2022/3/22 |
||||
|
* Time: 17:39 |
||||
|
*/ |
||||
|
public function OtherPeriod($now_time, $data, $model) |
||||
|
{ |
||||
|
|
||||
|
// $testtime = '1647959640'; |
||||
|
// $testtime = strtotime('2022-03-22 22:29:00'); |
||||
|
$testtime = $now_time; |
||||
|
$now_time = $testtime; |
||||
|
$now_min = date('i', $now_time); |
||||
|
$is_in = strtotime(date('Y-m-d H:', $testtime) . $now_min . ":00"); |
||||
|
|
||||
|
|
||||
|
$other_min['is_5min']['uup'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 5) * 5 . ":00")- 60 * 5; |
||||
|
$other_min['is_5min']['start'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 5) * 5 . ":00"); |
||||
|
$other_min['is_5min']['end'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 5) * 5 . ":00") + 60 * 4; |
||||
|
$other_min['is_5min']['next'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 5) * 5 . ":00") + 60 * 5; |
||||
|
$other_min['is_15min']['uup'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 15) * 15 . ":00") - 60 * 15; |
||||
|
$other_min['is_15min']['start'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 15) * 15 . ":00"); |
||||
|
$other_min['is_15min']['end'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 15) * 15 . ":00") + 60 * 15 - 60; |
||||
|
$other_min['is_15min']['next'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 15) * 15 . ":00") + 60 * 15; |
||||
|
$other_min['is_30min']['uup'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 30) * 30 . ":00")-60 * 30; |
||||
|
$other_min['is_30min']['start'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 30) * 30 . ":00"); |
||||
|
$other_min['is_30min']['end'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 30) * 30 . ":00") + 60 * 30 - 60; |
||||
|
$other_min['is_30min']['next'] = strtotime(date('Y-m-d H:', $testtime) . intval($now_min / 30) * 30 . ":00") + 60 * 30; |
||||
|
$other_min['is_1h']['uup'] = strtotime(date('Y-m-d H:', $testtime) . "00:00")-60 * 60; |
||||
|
$other_min['is_1h']['start'] = strtotime(date('Y-m-d H:', $testtime) . "00:00"); |
||||
|
$other_min['is_1h']['end'] = strtotime(date('Y-m-d H:', $testtime) . "00:00") + 60 * 60 - 60; |
||||
|
$other_min['is_1h']['next'] = strtotime(date('Y-m-d H:', $testtime) . "00:00") + 60 * 60; |
||||
|
|
||||
|
foreach ($other_min as $val => $key) { |
||||
|
|
||||
|
Log::info(11111); |
||||
|
Log::info(date('Y-m-d H:i:s', $is_in)); |
||||
|
// 如果不是当前时间段跳过 |
||||
|
// if($is_in != $key['end']){ |
||||
|
// continue; |
||||
|
// } |
||||
|
Log::info($val); |
||||
|
Log::info(date('Y-m-d H:i:s', $is_in)); |
||||
|
Log::info(date('Y-m-d H:i:s', $key['start'])); |
||||
|
Log::info(date('Y-m-d H:i:s', $key['end'])); |
||||
|
|
||||
|
|
||||
|
$open = $model::query()->where('is_1min', 1)->where('Date', $key['start'])->value('Open'); |
||||
|
$close = $model::query()->where('is_1min', 1)->where('Date', $key['end'])->value('Close'); |
||||
|
$high = $model::query()->where('is_1min', 1)->whereBetween('Date', [$key['start'], $key['end']])->max('High'); |
||||
|
$low = $model::query()->where('is_1min', 1)->whereBetween('Date', [$key['start'], $key['end']])->min('Low'); |
||||
|
$volume = $model::query()->where('is_1min', 1)->whereBetween('Date', [$key['start'], $key['end']])->sum('Volume'); |
||||
|
$amount = $model::query()->where('is_1min', 1)->whereBetween('Date', [$key['start'], $key['end']])->sum('Amount'); |
||||
|
|
||||
|
$model::query()->where('Date', $key['start'])->where($val, 1)->update( |
||||
|
[ |
||||
|
'Open' => $open, |
||||
|
'Close' => $close, |
||||
|
'High' => $high, |
||||
|
'Low' => $low, |
||||
|
'LastClose' => $close, |
||||
|
'Volume' => $volume, |
||||
|
'Amount' => $amount, |
||||
|
] |
||||
|
); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
// |
||||
|
// // 更新当前时间段最高最低 |
||||
|
// $other_time_date = $model::query()->where('Date', $now_time)->where('is_1min', 1)->first()->toArray(); |
||||
|
// $up_date['High'] = $high = max($other_time_date['Open'], $other_time_date['High'], $other_time_date['Low'], $other_time_date['Close'], $data['open'], $data['close'], $data['high'], $data['low']); |
||||
|
// $up_date['Low'] = $low = min($other_time_date['Open'], $other_time_date['High'], $other_time_date['Low'], $other_time_date['Close'], $data['open'], $data['close'], $data['high'], $data['low']); |
||||
|
// // $test_date[] = ['high' => $high, 'low' => $low, 'oldhigh' => $other_time_date['High'], 'oldlow' => $other_time_date['Low']]; |
||||
|
// // 如果是时间段开始时间更新开盘 |
||||
|
// if ($now_time === $key['start']) { |
||||
|
// $uup_data = $model::query()->where('Date', $key['uup'])->where($val, 1)->first()->toArray(); |
||||
|
// $up_date['Open'] = $open = $uup_data['Close']; |
||||
|
// // Log::info($data['open']); |
||||
|
// // Log::info($key['start']); |
||||
|
// // Log::info($uup_data['Close']); |
||||
|
// // Log::info($val); |
||||
|
// // Log::info($now_time); |
||||
|
// if($val == 'is_15min'){ |
||||
|
// Log::info($val); |
||||
|
// // Log::info($uup_data); |
||||
|
// Log::info($key['start']); |
||||
|
// Log::info($key['uup']); |
||||
|
// Log::info($key['next']); |
||||
|
// } |
||||
|
// } |
||||
|
// // 如果是时间段收盘时间更新收盘 |
||||
|
// if ($now_time === $key['end']) { |
||||
|
// $up_date['Close'] = $close = $data['close']; |
||||
|
// $up_date['LastClose'] = $close = $data['close']; |
||||
|
// $next_line['Open'] = $data['close']; |
||||
|
// $model::query()->where('Date', $key['next'])->where($val, 1)->update($next_line); |
||||
|
// } |
||||
|
// // $up_date['time'] = date("Y-m-d H:i:s", $now_time); |
||||
|
// // $up_date['type'] = $val; |
||||
|
// // $up_date['kkyk'] = date("Y-m-d H:i:s", $now_time - 60); |
||||
|
// // $up_date['k1kyk'] = date("Y-m-d H:i:s", $key['start']); |
||||
|
// // $up_date['k2kyk'] = date("Y-m-d H:i:s", $key['end']); |
||||
|
// $model::query()->where('Date', $key['start'])->where($val, 1)->update($up_date); |
||||
|
// |
||||
|
// |
||||
|
// |
||||
|
// |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
//更新缓存 |
||||
|
// Log::info($key['start']); |
||||
|
// Log::info($now_time); |
||||
|
// $period = 'is_'. $val; |
||||
|
|
||||
|
// 可能有用 |
||||
|
// $now_high = $model::query()->where('is_1min', 1)->whereBetween('Date', [$key['start'],$now_time])->max('High'); |
||||
|
// $now_low = $model::query()->where('is_1min', 1)->whereBetween('Date', [$key['start'],$now_time])->min('Low'); |
||||
|
|
||||
|
|
||||
|
// $low = DataRao::query()->where('is_1min', 1)->whereBetween('Date', [$where_start, $where_end])->min('Low'); |
||||
|
// $now_high = $model::query()->whereBetween('Date', $key['start'],$now_time)->where($period, 1)->max('High'); |
||||
|
// $now_low = $model::query()->whereBetween('Date', $key['start'],$now_time)->where($period, 1)->max('Low'); |
||||
|
// $periods = ['5min', '15min', '30min', '60min']; |
||||
|
// foreach ($periods as $period){ |
||||
|
// Log::info($coin); |
||||
|
|
||||
|
// 可能有用 |
||||
|
// $old_per = Cache::store('redis')->get('swap:' . $other_time_date['Symbol'] . '_kline_' . $val); |
||||
|
// $old_per['high'] = $now_high; |
||||
|
// $old_per['low'] = $now_low; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
// Log::info($now_high); |
||||
|
// Log::info($old_per); |
||||
|
// // |
||||
|
// $old_per['high'] = $old_per['open']; |
||||
|
// $old_per['low'] = $old_per['open']; |
||||
|
|
||||
|
// 可能有用 |
||||
|
// Cache::store('redis')->put('swap:' . $other_time_date['Symbol'] . '_kline_' . $val,$old_per); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
// } |
||||
|
|
||||
|
// unset($up_date); |
||||
|
} |
||||
|
// dd($up_date); |
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Build a form here. |
||||
|
*/ |
||||
|
public function form() |
||||
|
{ |
||||
|
$this->radio('symbol','选择币种')->options(function (){ |
||||
|
$symbols = config('coin.exchange_symbols'); |
||||
|
$PlatformCurrency = []; |
||||
|
foreach ($symbols as $key=>$val){ |
||||
|
$PlatformCurrency[$key]= $key; |
||||
|
// var_dump($key); |
||||
|
} |
||||
|
return $PlatformCurrency; |
||||
|
|
||||
|
})->required(); |
||||
|
|
||||
|
// $this->text('rise','涨')->required(); |
||||
|
// $this->text('fall','跌')->required(); |
||||
|
$this->text('nowprice','结束价格')->required()->help('当前价格'); |
||||
|
$this->text('blacktime','回复时间')->default(function (){ |
||||
|
$aa = rand(10,25); |
||||
|
return $aa; |
||||
|
})->required()->help('回复时间'); |
||||
|
// $this->text('password')->required(); |
||||
|
// $this->text('InitializeUSDT', '初始化USDT')->default(0); |
||||
|
// $this->text('pid', '邀请人UID')->default(11); |
||||
|
// $this->text('referrer', '代理商UID')->default(11)->help('为空时默认与上级ID相等'); |
||||
|
$this->display(['现价'])->with(function($val){ |
||||
|
return "<span id='current_price'></span>"; |
||||
|
}); |
||||
|
$this->display(['最高价'])->with(function($val){ |
||||
|
return "<span id='highest'></span>"; |
||||
|
}); |
||||
|
$this->display(['最低价'])->with(function($val){ |
||||
|
return "<span id='minimum'></span>"; |
||||
|
}); |
||||
|
|
||||
|
Admin::script(" |
||||
|
$('input[type=radio]').change(function(){ |
||||
|
var val = $('input[name=symbol]:checked').val(); |
||||
|
$.post({url:'symbol-detal',data:{symbol:val},success:function(result){ |
||||
|
$('#current_price').html(result.price); |
||||
|
$('#highest').html(result.highest); |
||||
|
$('#minimum').html(result.minimum); |
||||
|
}}); |
||||
|
}); |
||||
|
"); |
||||
|
// $symbols = ContractPair::query()->pluck('symbol'); |
||||
|
// $index = 1; |
||||
|
// foreach ($symbols as $symbol) { |
||||
|
// $func = function () use ($symbol) { |
||||
|
// // 获取风控任务 |
||||
|
// $risk_key = 'fkJson:' . $symbol . '/USDT'; |
||||
|
// $risk = json_decode(Redis::get($risk_key), true); |
||||
|
// $this->row(function ($row) use ($symbol, $risk) { |
||||
|
// $minUnit = $risk['minUnit'] ?? 0; |
||||
|
// $count = $risk['count'] ?? 0; |
||||
|
// $enabled = $risk['enabled'] ?? 0; |
||||
|
// $strat_time = $risk['strat_time'] ?? 0; |
||||
|
// //$end_time = $risk['end_time'] ?? 0; |
||||
|
// $pin = $risk['pin'] ?? 0; |
||||
|
// |
||||
|
// $row->width(3)->text($symbol . '.' . 'minUnit', '单位')->default($minUnit); |
||||
|
// $row->width(3)->text($symbol . '.' . 'count', '计数')->default($count); |
||||
|
// $row->time($symbol . '.' . 'strat_time', '开始时间')->default($strat_time); |
||||
|
// //$row->time($symbol . '.' . 'end_time', '结束时间')->default($end_time); |
||||
|
// $row->width(3)->switch($symbol . '.' . 'enabled', '开关')->default($enabled); |
||||
|
// $row->width(3)->switch($symbol . '.' . 'pin', '是否指定时间')->default($pin); |
||||
|
// |
||||
|
// }); |
||||
|
// }; |
||||
|
// // 第一个参数是选项卡标题,第二个参数是内容,第三个参数是是否选中 |
||||
|
// $title = $symbol . '合约'; |
||||
|
// if ($index == 1) { |
||||
|
// $this->tab($title, $func, true); |
||||
|
// } else { |
||||
|
// $this->tab($title, $func); |
||||
|
// } |
||||
|
// $index++; |
||||
|
// } |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* The data of the form. |
||||
|
* |
||||
|
* @return array |
||||
|
*/ |
||||
|
public function default() |
||||
|
{ |
||||
|
return []; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\BlockControl\Controllers; |
||||
|
|
||||
|
use App\Models\ContractPair; |
||||
|
use Dcat\Admin\Form; |
||||
|
use Dcat\Admin\Grid; |
||||
|
use Dcat\Admin\Layout\Content; |
||||
|
use Dcat\Admin\Show; |
||||
|
use Dcat\Admin\Controllers\AdminController; |
||||
|
use Dcat\Admin\Widgets\Card; |
||||
|
use Illuminate\Support\Facades\Cache; |
||||
|
|
||||
|
class ContractRisknewController extends AdminController |
||||
|
{ |
||||
|
public function index(Content $content) |
||||
|
{ |
||||
|
return $content |
||||
|
->title('新风控') |
||||
|
->body(new Card(new \App\BlockControl\Forms\ContractRisknew())); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,81 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace App\BlockControl\Forms; |
||||
|
|
||||
|
use App\Models\ContractPair; |
||||
|
use Dcat\Admin\Widgets\Form; |
||||
|
use Illuminate\Support\Facades\DB; |
||||
|
use Illuminate\Support\Facades\Redis; |
||||
|
use Symfony\Component\HttpFoundation\Response; |
||||
|
|
||||
|
class ContractRisknew extends Form |
||||
|
{ |
||||
|
/** |
||||
|
* Handle the form request. |
||||
|
* |
||||
|
* @param array $input |
||||
|
* |
||||
|
* @return Response |
||||
|
*/ |
||||
|
public function handle(array $input) |
||||
|
{ |
||||
|
// dd($input); |
||||
|
|
||||
|
$symbols = ContractPair::query()->pluck('symbol'); |
||||
|
foreach ($symbols as $symbol) { |
||||
|
if (!empty($input[$symbol])) { |
||||
|
$risk_key = 'fkJson:' . $symbol . '/USDT'; |
||||
|
$data = $input[$symbol]; |
||||
|
Redis::set($risk_key, json_encode($data)); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// return $this->error('Your error message.'); |
||||
|
|
||||
|
return $this->success('Processed successfully.'); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Build a form here. |
||||
|
*/ |
||||
|
public function form() |
||||
|
{ |
||||
|
$symbols = ContractPair::query()->pluck('symbol'); |
||||
|
|
||||
|
$index = 1; |
||||
|
foreach ($symbols as $symbol) { |
||||
|
$func = function () use ($symbol) { |
||||
|
// 获取风控任务 |
||||
|
$risk_key = 'fkJson:' . $symbol . '/USDT'; |
||||
|
$risk = json_decode(Redis::get($risk_key), true); |
||||
|
$this->row(function ($row) use ($symbol, $risk) { |
||||
|
$minUnit = $risk['minUnit'] ?? 0; |
||||
|
$count = $risk['count'] ?? 0; |
||||
|
$enabled = $risk['enabled'] ?? 0; |
||||
|
|
||||
|
$row->width(3)->text($symbol . '.' . 'minUnit', '单位')->default($minUnit); |
||||
|
$row->width(3)->text($symbol . '.' . 'count', '计数')->default($count); |
||||
|
$row->width(3)->switch($symbol . '.' . 'enabled', '开关')->default($enabled); |
||||
|
}); |
||||
|
}; |
||||
|
// 第一个参数是选项卡标题,第二个参数是内容,第三个参数是是否选中 |
||||
|
$title = $symbol . '合约'; |
||||
|
if ($index == 1) { |
||||
|
$this->tab($title, $func, true); |
||||
|
} else { |
||||
|
$this->tab($title, $func); |
||||
|
} |
||||
|
$index++; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* The data of the form. |
||||
|
* |
||||
|
* @return array |
||||
|
*/ |
||||
|
public function default() |
||||
|
{ |
||||
|
return []; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,23 @@ |
|||||
|
<?php |
||||
|
|
||||
|
/** |
||||
|
* Created by PhpStorm. |
||||
|
* User: Administrator |
||||
|
* Date: 2020/7/8 |
||||
|
* Time: 10:55 |
||||
|
*/ |
||||
|
|
||||
|
namespace App\Models; |
||||
|
|
||||
|
use Illuminate\Database\Eloquent\Model; |
||||
|
use Illuminate\Support\Facades\Cache; |
||||
|
use Illuminate\Support\Facades\Log; |
||||
|
|
||||
|
class PlatformContractControl extends Model |
||||
|
{ |
||||
|
//#合约持仓信息 |
||||
|
|
||||
|
protected $primaryKey = 'id'; |
||||
|
protected $table = 'platform_contract_control'; |
||||
|
protected $guarded = []; |
||||
|
} |
||||
Loading…
Reference in new issue