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, // Разрешено использовать мартингейл или нет, распространяется только на следующий сигнал (true || false)
- //'check_signal_currency' => true, // Проверять совпадение валюты сигнала (true || false)
- //'check_signal_from' => true, // Проверять совпадение источника сигнала (true || false)
- //'check_signal_type' => true, // Проверять совпадение типа сигнала CALL или PUT (true || false)
- 'trade_in_expiration' => false, // Разрешено отправлять новый сигнал на API binaryteam, если время экспирации(завершения) последнего контракта с таким-же источником и такой-же валютой(как уже есть контракт в БД) еще не вышло и результат контракта еще не известен (true || false)
- 'martingale_steps' => (int)5, // Количество колен мартингейл (числовое значение от 0 до 10)
- 'apikey' => '2101823462323f9e97107f9c9481162d', // Ключ binaryteam для отправки ставок
- ),
- 'roman' => array(
- 'username' => 'roman',
- 'user_status' => 'stopped',
- 'trading' => true,
- 'type_account' => 'demo',
- 'duration' => '3m',
- 'bet_amount' => (int)1,
- 'martingale' => true,
- //'check_signal_currency' => true,
- //'check_signal_from' => true,
- //'check_signal_type' => true,
- 'trade_in_expiration' => false,
- 'martingale_steps' => (int)2,
- 'apikey' => '',
- )
- );
- После получения входящего GET-запроса необходимо создать объект класса Request для каждого пользователя с заданными параметрами:
- $user = new Request ($params);
- и вызвать метод: $user->start();
- ### Примечание 1:
- Перед выполнением дальнейших действий необходимо проверить, активен пользователь или нет, разрешена торговля пользователю или нет, есть ключ API у пользователя или нет.
- Если пользователь active, торговля true и есть APIKEY выполняем программу дальше, если данное условие не выполняется, то для ЭТОГО пользователя дальше ничего не делаем.
- ### Примечание 2:
- Как работает параметр trade_in_expiration?
- Все контракты, которые приходят в исходном GET-запросе имеют источник сигнала, например source_1 и валютную пару, например frxEURUSD. После необходимых проверок, сигнал либо пропускается, либо отправляется на сервер API binaryteam и информация о контракте сохраняется в БД, также обязательно сохраняется источник сигнала, например source_1 и валютная пара, например frxEURUSD. Время экспирации(завершения) для этого контракта было установлено, например 8 часов.
- Параметр trade_in_expiration проверяет разрешено отправлять новый сигнал на API binaryteam, если время завершения последнего контракта с таким-же источником и такой-же валютой(как уже есть контракт в БД) еще не вышло и результат контракта еще не известен (время не завершено).
- Через 5 часов приходит снова сигнал с таким-же источником(source_1) и такой-же валютной парой(frxEURUSD). Что нам необходимо сделать? Проверяем параметр у пользователя trade_in_expiration, если trade_in_expiration === true (разрешено отправлять сигнал, пока время контракта не вышло), тогда отправляем новый сигнал на API binaryteam и сохраняем информацию в БД, если trade_in_expiration === false (НЕ РАЗРЕШЕНО отправлять новый сигнал, пока время предыдущего контракта с ТАКИМ-ЖЕ ИСТОЧНИКОМ и ТАКОЙ-ЖЕ ВАЛЮТНОЙ ПАРОЙ еще не вышло), тогда мы просто игнорируем второй сигнал.
- Может быть так, что время завершения для контракта с источником(source_1) и валютной парой(frxEURUSD) было установлено, например 8 часов. Через 5 часов приходит новый сигнал с источником(source_1 или source_2 или source_3 и т.д) и валютной парой(frxEURJPY). Источник может либо отличаться, либо повторяться, НО валютная пара совсем другая, тогда мы отправляем данный сигнал на API binaryteam и сохраняем информацию в БД.
- ### Внимание! Параметр trade_in_expiration необходимо проверять после каждого сигнала, пришедшего во входящем GET-запросе.
- ### Далее проверяем:
- 0. Сценарий первый: в базе данных нет еще никаких ставок
- -----------------------
- Тогда, сохраняем полученную информацию из входящего GET-запроса в БД, сессию, затем отправляем исходящий GET-запрос на сервис https://api.binaryteam.ru/?request=signal&key=".$this->apikey."&type_account=".$this->type_account."&bet=".$this->signal_type."&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. Сценарий второй:
- -----------------------
- Поступил новый сигнал.
- Проверяем параметр trade_in_expiration.
- В базе данных есть ставки с такой-же валютной парой и таким-же полем signal_from как мы получили из входящего GET-запроса.
- Для всех ставок время экспирации закончилось(нет активных контрактов) и последняя ставка "ВЫИГРАЛА - result =1"
- Тогда необходимо выполнить действия описанные в - 0. Сценарий первый
- 2. Сценарий третий:
- -----------------------
- Поступил новый сигнал.
- Проверяем параметр trade_in_expiration.
- В базе данных есть ставки с такой-же валютной парой и таким-же полем 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. Если контракт выигрывает (result=1), то следующие сигналы открываем обычной ставкой (мартингейл - обнуляем).
- Если контракт снова проиграет, то на следующий сигнал мы открываем новый контракт, но уже утроенной ставкой ($this->bet_amount *2)*2. Если контракт выигрывает (result=1), то следующие сигналы открываем обычной ставкой (мартингейл - обнуляем). Если проигрывает, то новый контракт открываем со ставкой (ставка предыдущего контракта *2).Если контракт выигрывает (result=1), то завершаем использование мартингейл, если проигрывает, то каждый следующий шаг, удваиваем предыдущий $this->bet_amount до тех пор, пока не закончатся количество колен мартингейл).
- Если количество колен мартингейл закончилось, т. е мы прошли весь цикл колен, тогда необходимо выполнить действия описанные в - 0. Сценарий первый (открыть обычную ставку) и так до следующего проигрыша.
- 3. Сценарий четвертый:
- -----------------------
- Поступил новый сигнал.
- Проверяем параметр trade_in_expiration.
- В базе данных ЕСТЬ! ставка(последняя ставка) с такой-же валютной парой и таким-же полем 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-запрос)
- Важный момент: Всегда необходимо проверять параметр $this->trade_in_expiration на соответствие источника сигнала (signal_from) и валюты сигнала($this->symbol) из входящего GET-запроса с последней ставкой в базе данных, с таким же источником сигнала и такой-же валютной парой.
- -----------------------
- На странице: https://api.sitename.ru/class.php?action=dashboard необходимо выводить информацию о всех запросах (ставках), которые были отправлены на сервер binaryteam.
- Информацию на странице https://api.sitename.ru/class.php?action=dashboard, обновлять через AJAX, никаких фреймой и рефрешей HTML страниц с запросами(вообщем без костылей).
- Проверять результат ставки по контракту, каждые 5-10 секунд, не долбить каждую секунду сервер binaryteam запросами
- Обновлять результаты ставок в таблице /class.php?action=dashboard каждые 5-10 секунд (через ajax - без перезагрузки страницы)
- Структура таблицы базы данных представлена ниже, если необходимо добавить какие-то поля, то добавляйте.
- Задержку на получение информации по контракту(результату после отправки контракта) делать только в отдельных методах, например $this->bet_info(); не надо вешать весь скрипт на N-времени. Использовать встроенные методы Guzzle
- */
- 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,
- 'check_signal_currency' => true,
- 'check_signal_from' => true,
- 'check_signal_type' => 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,
- 'check_signal_currency' => true,
- 'check_signal_from' => true,
- 'check_signal_type' => 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 $check_signal_currency; // Проверять совпадение валюты сигнала (true || false)
- public $check_signal_from; // Проверять совпадение источника сигнала (true || false)
- public $check_signal_type; // Проверять совпадение типа сигнала CALL или PUTT (true || false)
- 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_type; // сигнал для отправки может быть только двух типов: PUT или CALL
- public function index() {
- echo "Это index";
- /*
- Получаем все ставки отправленные по API из БД и выводим в таблице на странице.
- После завершения времени экспирации, получаем результат ставки и обновляем информацию в БД. При выводе ставок в таблице, у тех ставок, для которых время экспирации не вышло должен работать таймер и отсчитывать время до конца экспирации (запросом через ajax к методу get_expiration_time каждую секунду - метод описать). Пример таблицы: http://skrinshoter.ru/s/090519/aNY8KwAC
- */
- }
- public function start() {
- echo "start";
- /*
- Проверяем, активен пользователь или нет, разрешена торговля или нет, есть ключ API или нет. Если пользователь active, торговля true и есть APIKEY выполняем программу дальше
- */
- if ($this->user_status ==='active' && $this->trading === true && !empty($this->apikey)) {
- $this->sendbet_api(); // отправляем сигнал на сервер API
- $this->savebet_db(); // Сохраняем информацию о контракте в БД
- $this->bet_info(); // Получаем информацию(ответ от сервера API binaryteam) через 5-10 секунд и обновляем информацию о контракте в БД
- }
- }
- public function __construct($params = null) {
- if (!empty($params)) {
- foreach($params as $key => $value)
- {
- $this->$key = $value;
- }
- }
- }
- public function sendbet_api() {
- // 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_type = 'PUT';
- } else if ($this->order_type === 'ORDER_TYPE_SELL_LIMIT') {
- $this->signal_type = 'PUT';
- } else if ($this->order_type === 'ORDER_TYPE_BUY') {
- $this->signal_type = 'CALL';
- } else if ($this->order_type === 'ORDER_TYPE_BUY_LIMIT') {
- $this->signal_type = 'CALL';
- } else {
- $this->signal_type = '';
- }
- // 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=".$this->signal_type."&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