Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /*
- Необходимо написать php class, который будет принимать get-запрос и отправлять другой get запрос в соответствии с заданными условиями, а также делать необходимые проверки
- Для приема и отправки GET-запросов использовать https://github.com/guzzle/guzzle
- Необходимо реализовать запись информации о запросах в БД и вывод информации из базы данных.
- Необходимо реализовать простой роутинг:
- 1. https://api.sitename.ru/class.php?action=dashboard вывод информации о всех запросах (ставках)
- 2. https://api.sitename.ru/class.php?action=request на данный маршрут будут отправляться входной GET-запрос
- Формат входного GET-запроса следующий: https://sitename.ru/class.php?action=request&request=signal&signal_from=названиеисточника&order_type=типордера&symbol=валютнаяпара(например frxEURUSD)
- API binaryteam.ru документация здесь: https://docs.google.com/document/d/1BNQIC42N31q_DZx1fSLMCDYeGOB1cFAL3OAd1V8oDZ4/edit
- Класс должен работать с массивом пользователей $users, который содержит следующую информацию:
- $users = array(
- 'aleksv' => array(
- 'username' => 'aleksv', // имя пользователя
- 'user_status' => 'active', // статус пользователя (active или stopped)
- 'trading' => true, // разрешена торговля или нет
- 'type_account' => 'demo', // тип аккаунта для отправки ставки (demo или real)
- 'duration' => '3m', // продолжительность (время экспирации ставки)
- 'bet_amount' => (int)1, // первоначальная сумма ставки в USD
- 'martingale' => true, // разрешено использовать мартингейл или нет на следующий сигнал
- 'trade_in_expiration' => false, // разрешено отправлять новый сигнал по одной и той-же валютной паре, если время экспирации предыдущего контракта не вышло и результат не известен
- 'martingale_steps' => (int)2, // количество колен мартингейл
- 'apikey' => '2101823462323f9e97107f9c9481162d', // ключ binaryteam для отправки ставок
- ),
- 'roman' => array(
- 'username' => 'roman',
- 'user_status' => 'stopped',
- 'trading' => true,
- 'type_account' => 'demo',
- 'duration' => '3m',
- 'bet_amount' => (int)1,
- 'martingale' => true,
- 'trade_in_expiration' => false,
- 'martingale_steps' => (int)2,
- 'apikey' => '',
- )
- );
- После получения входящего GET-запроса необходимо создать объект класса Request для каждого пользователя с заданными параметрами:
- $user = new Request ($params);
- и вызвать метод: $user->sendbet_api();
- ### Проверяем, активен пользователь или нет, разрешена торговля или нет, есть ключ API или нет. Если пользователь active, торговля true и есть APIKEY выполняем программу дальше
- ### Далее проверяем:
- 0. Сценарий первый: в базе данных нет еще никаких ставок
- -----------------------
- Тогда, сохраняем полученную информацию из входящего GET-запроса в БД, сессию, затем отправляем исходящий GET-запрос на сервис https://api.binaryteam.ru/?request=signal&key=".$this->apikey."&type_account=".$this->type_account."&bet=".$signal."&symbol=".$this->symbol."&duration=".$this->duration."&amount=".$this->bet_amount , получаем $binaryteam_betid, ждем 5 секунд, вызываем метод $user->bet_info($binaryteam_betid, $apikey) отправляем повторный запрос на сервис binaryteam, получаем полную информацию по контракту $binaryteam_betid($contract_id) и сохраняем информацию в БД.
- 1. Сценарий второй:
- -----------------------
- В базе данных есть ставки с такой-же валютной парой и таким-же полем signal_from как мы получили из входящего GET-запроса.
- Для всех ставок время экспирации закончилось(нет активных контрактов) и последняя ставка "ВЫИГРАЛА - result =1"
- Тогда необходимо выполнить действия описанные в - 0. Сценарий первый
- 2. Сценарий третий:
- -----------------------
- В базе данных есть ставки с такой-же валютной парой и таким-же полем signal_from как мы получили из входящего GET-запроса.
- Для всех ставок время экспирации закончилось(нет активных контрактов) и последняя ставка "ПРОИГРАЛА - result =2"
- Тогда проверяем $this->martingale и $this->martingale_steps. Если $this->martingale = false, тогда необходимо выполнить действия описанные в - 0. Сценарий первый
- Если ( $this->martingale = true && $this->martingale_steps >= 1 )? Тогда необходимо выполнить действия описанные в - 0. Сценарий первый (сохранить информацию и открыть контракт удвоенной ставкой: $this->bet_amount *2 это на шаге 1(сохранить результат в сессию, каждый следующий шаг, удваиваем предыдущий $this->bet_amount до тех пор, пока не закончатся количество колен мартингейл). Если количество колен мартингейл закончилось, т.е мы прошли весь цикл колен, тогда необходимо выполнить действия описанные в - 0. Сценарий первый (открыть обычную ставку) и так до следующего проигрыша.
- 3. Сценарий четвертый:
- -----------------------
- В базе данных ЕСТЬ! ставка(последняя ставка) с такой-же валютной парой и таким-же полем signal_from как мы получили из входящего GET-запроса.
- Для ставки время экспирации еще закончилось (результат не известен), тогда проверяем:
- 1. $this->trade_in_expiration
- Если значение $this->trade_in_expiration === true(разрешено отправлять новыю ставку, пока время экспирации не вышло), то сохраняем полученную информацию из входящего GET-запроса в БД, сессию, затем отправляем исходящий GET-запрос на сервис https://api.binaryteam.ru/?request=signal&key=".$this->apikey."&type_account=".$this->type_account."&bet=".$signal."&symbol=".$this->symbol."&duration=".$this->duration."&amount=".$this->bet_amount , получаем $binaryteam_betid, ждем 5 секунд, вызываем метод $user->bet_info($binaryteam_betid, $apikey) отправляем повторный запрос на сервис binaryteam, получаем полную информацию по контракту $binaryteam_betid($contract_id) и сохраняем информацию в БД.
- 2. Если ($this->trade_in_expiration === false) - запрещено отправлять новыю ставку, пока время экспирации не вышло, тогда ничего не делаем (просто игнорируем входящий GET-запрос)
- Важный момент: Всегда необходимо проверять соответствие источника сигнала (signal_from) и валюты сигнала($this->symbol) из входящего GET-запроса с последней ставкой в базе данных, с таким же источником сигнала и такой-же валютной паре.
- -----------------------
- На странице: https://api.sitename.ru/class.php?action=dashboard необходимо выводить информацию о всех запросах (ставках), которые были отправлены на сервер binaryteam
- Проверять результат ставки по контракту, каждые 5-10 секунд, не долбить каждую секунду сервер binaryteam запросами
- Обновлять результаты ставок в таблице /class.php?action=dashboard каждые 5-10 секунд (через ajax - без перезагрузки страницы)
- */
- ini_set('display_errors', 1);
- ini_set('display_startup_errors', 1);
- ini_set('error_reporting', E_ALL);
- require_once("vendor/autoload.php");
- $db_host = 'localhost';
- $db_name = 'binarysignals';
- $db_user = 'binarysignals';
- $db_password = '9P1a5V2j';
- // Подключаемся к серверу БД
- $mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
- $mysqli->set_charset("utf8");
- if (!$mysqli) { die ('Connection error: ' . mysql_error()); }
- $users = array(
- 'aleksv' => array(
- 'username' => 'aleksv',
- 'user_status' => 'active',
- 'trading' => true,
- 'type_account' => 'demo',
- 'duration' => '3m',
- 'bet_amount' => (int)1,
- 'martingale' => true,
- 'trade_in_expiration' => false,
- 'martingale_steps' => (int)2,
- 'apikey' => '2101823462323f9e97107f9c9481162d',
- ),
- 'roman' => array(
- 'username' => 'roman',
- 'user_status' => 'stopped',
- 'trading' => true,
- 'type_account' => 'demo',
- 'duration' => '3m',
- 'bet_amount' => (int)1,
- 'martingale' => true,
- 'trade_in_expiration' => false,
- 'martingale_steps' => (int)2,
- 'apikey' => '',
- )
- );
- class Request {
- public $username; // имя пользователя
- public $user_status; // статус пользователя (active или stopped)
- public $trading; // разрешена торговля пользователю или нет
- public $type_account; // тип аккаунта для отправки ставки (demo или real)
- public $duration; // продолжительность (время экспирации ставки)
- public $bet_amount; // первоначальная сумма ставки в USD
- public $martingale; // разрешено использовать мартингейл или нет на следующий сигнал
- public $martingale_steps; // количество колен мартингейл
- public $trade_in_expiration; // разрешено отправлять новый сигнал по одной и той-же валютной паре, если время экспирации предыдущего контракта не вышло и результат не известен
- public $apikey; // ключ binaryteam для отправки ставок
- public $response;
- public $binaryteam_betid; // идентификатор ставки в Json-ответе на запрос создания ставки (signal)
- public $contract_id; // идентификатор ставки в сервисе binaryteam
- public $symbol; // Валютная пара, например frxEURUSD или frxAUDCAD
- public $order_type; // тип ордера ORDER_TYPE_SELL, ORDER_TYPE_SELL_LIMIT, ORDER_TYPE_BUY, ORDER_TYPE_BUY_LIMIT
- public $signal; // сигнал для отправки может быть только двух типов: PUT или CALL
- public function index() {
- echo "Это index";
- /*
- Получаем все ставки отправленные по API из БД и выводим в таблице на странице.
- После завершения времени экспирации, получаем результат ставки и обновляем информацию в БД. При выводе ставок в таблице, у тех ставок, для которых время экспирации не вышло должен работать таймер и отсчитывать время до конца экспирации (запросом через ajax к методу get_expiration_time каждую секунду - метод описать). Пример таблицы: http://skrinshoter.ru/s/090519/aNY8KwAC
- */
- }
- public function __construct($params = null) {
- if (!empty($params)) {
- foreach($params as $key => $value)
- {
- $this->$key = $value;
- }
- }
- }
- public function sendbet_api() {
- if ($this->user_status ==='active' && $this->trading === true && !empty($this->apikey)) {
- /*
- Проверяем, активен пользователь или нет, разрешена торговля или нет, есть ключ API или нет. Если пользователь active, торговля true и есть APIKEY выполняем программу дальше
- */
- // echo "<pre>";
- // print_r($user);
- // echo "</pre>";
- isset($_GET['symbol']) ? $this->symbol = $_GET['symbol'] : $this->symbol = '';
- isset($_GET['order_type'])? $this->order_type = $_GET['order_type'] : $this->order_type = '';
- if ($this->order_type === 'ORDER_TYPE_SELL') {
- $this->signal = 'PUT';
- } else if ($this->order_type === 'ORDER_TYPE_SELL_LIMIT') {
- $this->signal = 'PUT';
- } else if ($this->order_type === 'ORDER_TYPE_BUY') {
- $this->signal = 'CALL';
- } else if ($this->order_type === 'ORDER_TYPE_BUY_LIMIT') {
- $this->signal = 'CALL';
- } else {
- $this->signal = '';
- }
- // https://api.sitename.ru/class.php?action=request&request=signal&order_type=ORDER_TYPE_SELL&symbol=frxAUDCAD
- /*
- Что необходимо сделать перед отправкой сигнала:
- 1. Проверить 'trade_in_expiration' => false, // разрешено отправлять новый сигнал по одной и той-же валютной паре, если время экспирации предыдущего контракта не вышло и результат не известен
- */
- $client = new \GuzzleHttp\Client();
- $response = $client->request('GET', "https://api.binaryteam.ru/?request=signal&key=".$this->apikey."&type_account=".$this->type_account."&bet=".$signal."&symbol=".$this->symbol."&duration=".$this->duration."&amount=".$this->bet_amount);
- //echo $response->getStatusCode(); # 200
- //echo $response->getHeaderLine('content-type'); # 'application/json; charset=utf8'
- $response_body = json_decode($response->getBody()->getContents(), true);
- echo "<pre>";
- print_r($response_body);
- echo "</pre>";
- // Ответить в фейсбук
- }
- }
- public function bet_info($binaryteam_betid, $apikey) {
- $client = new \GuzzleHttp\Client();
- $response = $client->request('GET', "https://api.binaryteam.ru/?request=report&key=".$apikey."&id=".$binaryteam_betid);
- echo $response->getStatusCode(); # 200
- echo $response->getHeaderLine('content-type'); # 'application/json; charset=utf8'
- echo $response->getBody(); # '{"id": 1420053, "name": "guzzle", ...}'
- $response_body = json_decode($response->getBody()->getContents());
- echo "<pre>";
- print_r($response_body);
- echo "</pre>";
- $this->__gwt = $gwt[1];
- $this->__tkn = $tkn[1];
- $this->__group_id = $group_id[1];
- if(!$form_id[1] or empty($form_id[1]) or !$id[1] or empty($id[1]))
- {
- return false;
- }
- return array('group_id' => $group_id[1], 'form_id' => $form_id[1], 'tkn' => $tkn[1], 'gwt' => $gwt[1], 'id' => $id[1]);
- }
- private function login() {
- }
- static function auth($username, $password) {
- }
- }
- if ($_GET['action']) {
- $info = new Request ();
- }
- switch($_GET['action']) {
- case "install" :
- $sql = "CREATE TABLE IF NOT EXISTS `signals_list` (
- `id` int not null AUTO_INCREMENT,
- `contract_id` int(30) not null,
- `symbol` varchar(255) not null,
- `bet` varchar(255) not null,
- `is_signal` varchar(255) not null,
- `time_start` varchar(255) not null,
- `time_end` varchar(255) not null,
- `quote_start` varchar(255) not null,
- `quote_end` varchar(255) not null,
- `amount` varchar(255) not null,
- `duration` varchar(255) not null,
- `payout` varchar(255) not null,
- `payout_perc` varchar(255) not null,
- `payment` varchar(255) not null,
- `result` varchar(255) not null,
- `result_code` varchar(255) not null,
- `start` varchar(255) not null,
- `timeout` varchar(255) not null,
- `end` varchar(255) not null,
- `user_id` int(30) not null,
- `user_name` varchar(255) not null,
- `signal_provider` varchar(255) not null,
- `signal_id` varchar(255) not null,
- `signal_name` varchar(255) not null,
- `signal_from` varchar(255) not null,
- `send_telegram` text not null,
- `send_sms` text not null,
- `bet_comment` text not null,
- `timezone` varchar(255) not null,
- PRIMARY KEY (id)
- )
- ";
- $result = $mysqli->query($sql);
- //print_r($result) ;
- if ($result) {
- // echo "Создание таблицы завершено";
- //header('HTTP/1.1 200 OK');
- //header('Location: http://'.$_SERVER['HTTP_HOST'].'class.php?action=install');
- } else {
- echo "Таблицу создать не удалось";
- }
- // if ($mysqli->query("SHOW TABLES LIKE signals_list")) {
- // echo "Таблица существует в БД";
- // }
- break;
- case "request" :
- isset($_GET['request']) ? $request = $_GET['request'] : $request = '';
- if ($request === 'signal') {
- foreach ( $users as $user ) {
- $user = new Request ([
- 'username' => $user['username'],
- 'user_status' => $user['user_status'],
- 'trading' => $user['trading'],
- 'type_account' => $user['type_account'],
- 'duration' => $user['duration'],
- 'bet_amount' => $user['bet_amount'],
- 'martingale' => $user['martingale'],
- 'trade_in_expiration' => $user['trade_in_expiration'],
- 'martingale_steps' => $user['martingale_steps'],
- 'apikey' => $user['apikey'],
- ]);
- // echo "<pre>";
- // print_r($user);
- // echo "</pre>";
- $user->sendbet_api();
- }
- }
- break;
- case "dashboard" :
- $info->index();
- break;
- default :
- $info->index();
- break;
- }
- /*
- {"request":"report","params":{"key":"2101823462323f9e97107f9c9481162d","id":"15095069"},"answer":{"profile":"pro","contract_id":"46557536688","symbol":"frxEURUSD","bet":"PUT","is_signal":"0","time_start":"1557235424","time_end":"1557264224","quote_start":"1.11803","quote_end":"0","amount":"30","payout":"58.23","payout_perc":"94","payment":"58.23","result":"0","result_code":"702","real":{"amount":"0.50","currency":"USD","percent":"0","depo_start":"0.5","depo_min":"0.5","depo_max":"0.5"},"demo":{"amount":"15642.44","currency":"USD","percent":"0","depo_start":"15730.7","depo_min":"15642.4","depo_max":"15732.4"}},"time":{"start":"2019-05-07 18:10:15","timeout":0.02103,"end":"2019-05-07 15:10:15"}}
- stdClass Object
- (
- [request] => report
- [params] => stdClass Object
- (
- [key] => 2101823462323f9e97107f9c9481162d
- [id] => 15095069
- )
- [answer] => stdClass Object
- (
- [profile] => pro
- [contract_id] => 46557536688
- [symbol] => frxEURUSD
- [bet] => PUT
- [is_signal] => 0
- [time_start] => 1557235424
- [time_end] => 1557264224
- [quote_start] => 1.11803
- [quote_end] => 0
- [amount] => 30
- [payout] => 58.23
- [payout_perc] => 94
- [payment] => 58.23
- [result] => 0
- [result_code] => 702
- [real] => stdClass Object
- (
- [amount] => 0.50
- [currency] => USD
- [percent] => 0
- [depo_start] => 0.5
- [depo_min] => 0.5
- [depo_max] => 0.5
- )
- [demo] => stdClass Object
- (
- [amount] => 15642.44
- [currency] => USD
- [percent] => 0
- [depo_start] => 15730.7
- [depo_min] => 15642.4
- [depo_max] => 15732.4
- )
- )
- [time] => stdClass Object
- (
- [start] => 2019-05-07 17:55:27
- [timeout] => 0.0432
- [end] => 2019-05-07 14:55:27
- )
- )
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement