Advertisement
aleksv11

class_example

May 10th, 2019
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 22.14 KB | None | 0 0
  1. <?php
  2.  
  3. /*
  4.  
  5. Необходимо написать php class, который будет принимать get-запрос и отправлять другой get запрос в соответствии с заданными условиями, а также делать необходимые проверки
  6. Для приема и отправки GET-запросов использовать https://github.com/guzzle/guzzle
  7. Необходимо реализовать запись информации о запросах в БД и вывод информации из базы данных.
  8.  
  9. Необходимо реализовать простой роутинг:
  10.     1. https://api.sitename.ru/class.php?action=dashboard вывод информации о всех запросах (ставках)
  11.     2. https://api.sitename.ru/class.php?action=request на данный маршрут будут отправляться входной GET-запрос
  12.  
  13. Формат входного GET-запроса следующий: https://sitename.ru/class.php?action=request&request=signal&signal_from=названиеисточника&order_type=типордера&symbol=валютнаяпара(например frxEURUSD)
  14.  
  15. API binaryteam.ru документация здесь: https://docs.google.com/document/d/1BNQIC42N31q_DZx1fSLMCDYeGOB1cFAL3OAd1V8oDZ4/edit
  16.  
  17.  
  18.  
  19. Класс должен работать с массивом пользователей $users, который содержит следующую информацию:
  20.  
  21. $users = array(
  22.     'aleksv' => array(
  23.         'username' => 'aleksv', // имя пользователя
  24.         'user_status' => 'active', // статус пользователя (active или stopped)
  25.         'trading' => true, // разрешена торговля или нет
  26.         'type_account' => 'demo', // тип аккаунта для отправки ставки (demo или real)
  27.         'duration' => '3m', // продолжительность (время экспирации ставки)
  28.         'bet_amount' => (int)1, //  первоначальная сумма ставки в USD
  29.         'martingale' => true, // разрешено использовать мартингейл или нет на следующий сигнал
  30.         'trade_in_expiration' => false, // разрешено отправлять новый сигнал по одной и той-же валютной паре, если время экспирации предыдущего контракта не вышло и результат не известен
  31.         'martingale_steps' => (int)2, // количество колен мартингейл
  32.         'apikey' => '2101823462323f9e97107f9c9481162d', // ключ binaryteam для отправки ставок
  33.     ),
  34.     'roman' => array(
  35.         'username' => 'roman',
  36.         'user_status' => 'stopped',
  37.         'trading' => true,
  38.         'type_account' => 'demo',
  39.         'duration' => '3m',
  40.         'bet_amount' => (int)1,
  41.         'martingale' => true,
  42.         'trade_in_expiration' => false,
  43.         'martingale_steps' => (int)2,
  44.         'apikey' => '',
  45.     )
  46. );
  47.  
  48.  
  49. После получения входящего GET-запроса необходимо создать объект класса Request для каждого пользователя с заданными параметрами:
  50.  
  51. $user = new Request ($params);
  52.  
  53. и вызвать метод: $user->sendbet_api();
  54.  
  55. ### Проверяем, активен пользователь или нет, разрешена торговля или нет, есть ключ API или нет. Если пользователь active, торговля true и есть APIKEY выполняем программу дальше
  56.  
  57. ### Далее проверяем:
  58.  
  59.  
  60.  
  61.     0. Сценарий первый: в базе данных нет еще никаких ставок
  62.     -----------------------
  63.     Тогда, сохраняем полученную информацию из входящего 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) и сохраняем информацию в БД.
  64.  
  65.  
  66.  
  67.     1. Сценарий второй:
  68.     -----------------------
  69.     В базе данных есть ставки с такой-же валютной парой и таким-же полем signal_from как мы получили из входящего GET-запроса.
  70.     Для всех ставок время экспирации закончилось(нет активных контрактов) и последняя ставка "ВЫИГРАЛА - result =1"
  71.    
  72.     Тогда необходимо выполнить действия описанные в - 0. Сценарий первый
  73.  
  74.  
  75.    
  76.  
  77.     2. Сценарий третий:
  78.     -----------------------
  79.     В базе данных есть ставки с такой-же валютной парой и таким-же полем signal_from как мы получили из входящего GET-запроса.
  80.     Для всех ставок время экспирации закончилось(нет активных контрактов) и последняя ставка "ПРОИГРАЛА - result =2"
  81.    
  82.     Тогда проверяем $this->martingale и $this->martingale_steps. Если $this->martingale = false, тогда необходимо выполнить действия описанные в - 0. Сценарий первый
  83.  
  84.     Если ( $this->martingale = true && $this->martingale_steps >= 1 )? Тогда необходимо выполнить действия описанные в - 0. Сценарий первый (сохранить информацию и открыть контракт удвоенной ставкой: $this->bet_amount *2 это на шаге 1(сохранить результат в сессию, каждый следующий шаг, удваиваем предыдущий $this->bet_amount до тех пор, пока не закончатся количество колен мартингейл). Если количество колен мартингейл закончилось, т.е мы прошли весь цикл колен, тогда необходимо выполнить действия описанные в - 0. Сценарий первый (открыть обычную ставку) и так до следующего проигрыша.
  85.  
  86.  
  87.    
  88.     3. Сценарий четвертый:
  89.     -----------------------
  90.     В базе данных ЕСТЬ! ставка(последняя ставка) с такой-же валютной парой и таким-же полем signal_from как мы получили из входящего GET-запроса.
  91.     Для ставки время экспирации еще закончилось (результат не известен), тогда проверяем:
  92.  
  93.         1. $this->trade_in_expiration
  94.  
  95.         Если значение $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) и сохраняем информацию в БД.
  96.  
  97.         2. Если ($this->trade_in_expiration === false) - запрещено отправлять новыю ставку, пока время экспирации не вышло, тогда ничего не делаем (просто игнорируем входящий GET-запрос)
  98.    
  99.  
  100.  
  101.  
  102.  
  103.     Важный момент: Всегда необходимо проверять соответствие источника сигнала (signal_from) и валюты сигнала($this->symbol) из входящего GET-запроса с последней ставкой в базе данных, с таким же источником сигнала и такой-же валютной паре.
  104.     -----------------------
  105.     На странице: https://api.sitename.ru/class.php?action=dashboard необходимо выводить информацию о всех запросах (ставках), которые были отправлены на сервер binaryteam
  106.  
  107.     Проверять результат ставки по контракту, каждые 5-10 секунд, не долбить каждую секунду сервер binaryteam запросами
  108.     Обновлять результаты ставок в таблице /class.php?action=dashboard каждые 5-10 секунд (через ajax - без перезагрузки страницы)
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116. */
  117.  
  118.  
  119.  
  120.  
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.     ini_set('display_errors', 1);
  130.     ini_set('display_startup_errors', 1);
  131.     ini_set('error_reporting', E_ALL);
  132.  
  133.     require_once("vendor/autoload.php");
  134.  
  135.     $db_host = 'localhost';
  136.     $db_name = 'binarysignals';
  137.     $db_user = 'binarysignals';
  138.     $db_password = '9P1a5V2j';
  139.  
  140.     // Подключаемся к серверу БД
  141.     $mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
  142.     $mysqli->set_charset("utf8");
  143.     if (!$mysqli) { die ('Connection error: ' . mysql_error()); }
  144.  
  145.     $users = array(
  146.         'aleksv' => array(
  147.             'username' => 'aleksv',
  148.             'user_status' => 'active',
  149.             'trading' => true,
  150.             'type_account' => 'demo',
  151.             'duration' => '3m',
  152.             'bet_amount' => (int)1,
  153.             'martingale' => true,
  154.             'trade_in_expiration' => false,
  155.             'martingale_steps' => (int)2,
  156.             'apikey' => '2101823462323f9e97107f9c9481162d',
  157.         ),
  158.         'roman' => array(
  159.             'username' => 'roman',
  160.             'user_status' => 'stopped',
  161.             'trading' => true,
  162.             'type_account' => 'demo',
  163.             'duration' => '3m',
  164.             'bet_amount' => (int)1,
  165.             'martingale' => true,
  166.             'trade_in_expiration' => false,
  167.             'martingale_steps' => (int)2,
  168.             'apikey' => '',
  169.         )
  170.     );
  171.  
  172.  
  173.  
  174. class Request {
  175.  
  176.     public $username; // имя пользователя
  177.     public $user_status; // статус пользователя (active или stopped)
  178.     public $trading; // разрешена торговля пользователю или нет
  179.     public $type_account; // тип аккаунта для отправки ставки (demo или real)
  180.     public $duration; // продолжительность (время экспирации ставки)
  181.     public $bet_amount; // первоначальная сумма ставки в USD
  182.     public $martingale; // разрешено использовать мартингейл или нет на следующий сигнал
  183.     public $martingale_steps; // количество колен мартингейл
  184.     public $trade_in_expiration; // разрешено отправлять новый сигнал по одной и той-же валютной паре, если время экспирации предыдущего контракта не вышло и результат не известен
  185.     public $apikey; // ключ binaryteam для отправки ставок
  186.     public $response;
  187.     public $binaryteam_betid; // идентификатор ставки в Json-ответе на запрос создания ставки (signal)
  188.     public $contract_id; // идентификатор ставки в сервисе binaryteam
  189.     public $symbol; // Валютная пара, например frxEURUSD или frxAUDCAD
  190.     public $order_type; // тип ордера ORDER_TYPE_SELL, ORDER_TYPE_SELL_LIMIT, ORDER_TYPE_BUY, ORDER_TYPE_BUY_LIMIT
  191.     public $signal; // сигнал для отправки может быть только двух типов: PUT или CALL
  192.  
  193.  
  194.     public function index() {
  195.  
  196.         echo "Это index";
  197.         /*
  198.  
  199.         Получаем все ставки отправленные по API из БД и выводим в таблице на странице.
  200.         После завершения времени экспирации, получаем результат ставки и обновляем информацию в БД. При выводе ставок в таблице, у тех ставок, для которых время экспирации не вышло должен работать таймер и отсчитывать время до конца экспирации (запросом через ajax к методу get_expiration_time каждую секунду - метод описать). Пример таблицы: http://skrinshoter.ru/s/090519/aNY8KwAC
  201.  
  202.  
  203.         */
  204.     }
  205.  
  206.  
  207.  
  208.     public function __construct($params = null) {
  209.  
  210.         if (!empty($params)) {
  211.             foreach($params as $key => $value)
  212.             {
  213.                 $this->$key = $value;
  214.             }
  215.         }
  216.  
  217.     }
  218.  
  219.     public function sendbet_api() {
  220.  
  221.         if ($this->user_status ==='active' && $this->trading === true && !empty($this->apikey)) {
  222.  
  223.         /*
  224.         Проверяем, активен пользователь или нет, разрешена торговля или нет, есть ключ API или нет. Если пользователь active, торговля true и есть APIKEY выполняем программу дальше
  225.  
  226.         */
  227.  
  228.             // echo "<pre>";
  229.             // print_r($user);
  230.             // echo "</pre>";
  231.  
  232.             isset($_GET['symbol']) ? $this->symbol = $_GET['symbol'] : $this->symbol = '';
  233.             isset($_GET['order_type'])? $this->order_type = $_GET['order_type'] : $this->order_type = '';
  234.  
  235.             if ($this->order_type === 'ORDER_TYPE_SELL') {
  236.                 $this->signal = 'PUT';
  237.             } else if ($this->order_type === 'ORDER_TYPE_SELL_LIMIT') {
  238.                 $this->signal = 'PUT';
  239.             } else if ($this->order_type === 'ORDER_TYPE_BUY') {
  240.                 $this->signal = 'CALL';
  241.             } else if ($this->order_type === 'ORDER_TYPE_BUY_LIMIT') {
  242.                 $this->signal = 'CALL';
  243.             } else {
  244.                 $this->signal = '';
  245.             }
  246.  
  247.         // https://api.sitename.ru/class.php?action=request&request=signal&order_type=ORDER_TYPE_SELL&symbol=frxAUDCAD
  248.  
  249.  
  250.  
  251.  
  252.         /*
  253.        
  254.         Что необходимо сделать перед отправкой сигнала:
  255.  
  256.         1. Проверить 'trade_in_expiration' => false, // разрешено отправлять новый сигнал по одной и той-же валютной паре, если время экспирации предыдущего контракта не вышло и результат не известен
  257.  
  258.         */
  259.  
  260.  
  261.  
  262.  
  263.  
  264.         $client = new \GuzzleHttp\Client();
  265.         $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);
  266.  
  267.         //echo $response->getStatusCode(); # 200
  268.         //echo $response->getHeaderLine('content-type'); # 'application/json; charset=utf8'
  269.         $response_body = json_decode($response->getBody()->getContents(), true);
  270.  
  271.         echo "<pre>";
  272.         print_r($response_body);
  273.         echo "</pre>";
  274.  
  275.  
  276. // Ответить в фейсбук
  277.  
  278.         }
  279.     }
  280.  
  281.    
  282.  
  283.  
  284.  
  285.     public function bet_info($binaryteam_betid, $apikey) {
  286.        
  287.      
  288.         $client = new \GuzzleHttp\Client();
  289.         $response = $client->request('GET', "https://api.binaryteam.ru/?request=report&key=".$apikey."&id=".$binaryteam_betid);
  290.         echo $response->getStatusCode(); # 200
  291.         echo $response->getHeaderLine('content-type'); # 'application/json; charset=utf8'
  292.         echo $response->getBody(); # '{"id": 1420053, "name": "guzzle", ...}'
  293.         $response_body = json_decode($response->getBody()->getContents());
  294.  
  295.  
  296.         echo "<pre>";
  297.         print_r($response_body);
  298.         echo "</pre>";
  299.  
  300.  
  301.      
  302.  
  303.  
  304.         $this->__gwt = $gwt[1];
  305.         $this->__tkn = $tkn[1];
  306.         $this->__group_id = $group_id[1];
  307.  
  308.         if(!$form_id[1] or empty($form_id[1]) or !$id[1] or empty($id[1]))
  309.         {
  310.             return false;
  311.         }
  312.  
  313.         return array('group_id' => $group_id[1], 'form_id' => $form_id[1], 'tkn' => $tkn[1], 'gwt' => $gwt[1], 'id' => $id[1]);
  314.     }
  315.  
  316.     private function login() {
  317.        
  318.     }
  319.  
  320.     static function auth($username, $password) {
  321.      
  322.     }
  323.  
  324.  
  325.  
  326.  
  327. }
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339. if ($_GET['action']) {
  340.     $info = new Request ();
  341. }
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351. switch($_GET['action']) {
  352.     case "install" :
  353.        
  354.  
  355.             $sql = "CREATE TABLE IF NOT EXISTS `signals_list` (
  356.               `id` int not null AUTO_INCREMENT,
  357.               `contract_id` int(30) not null,
  358.               `symbol` varchar(255) not null,
  359.               `bet` varchar(255) not null,
  360.               `is_signal` varchar(255) not null,
  361.               `time_start` varchar(255) not null,
  362.               `time_end` varchar(255) not null,
  363.               `quote_start` varchar(255) not null,
  364.               `quote_end` varchar(255) not null,
  365.               `amount` varchar(255) not null,
  366.               `duration` varchar(255) not null,
  367.               `payout` varchar(255) not null,
  368.               `payout_perc` varchar(255) not null,
  369.               `payment` varchar(255) not null,
  370.               `result` varchar(255) not null,
  371.               `result_code` varchar(255) not null,
  372.               `start` varchar(255) not null,
  373.               `timeout` varchar(255) not null,
  374.               `end` varchar(255) not null,
  375.               `user_id` int(30) not null,
  376.               `user_name` varchar(255) not null,
  377.               `signal_provider` varchar(255) not null,
  378.               `signal_id` varchar(255) not null,
  379.               `signal_name` varchar(255) not null,
  380.               `signal_from` varchar(255) not null,
  381.               `send_telegram` text not null,
  382.               `send_sms` text not null,
  383.               `bet_comment` text not null,
  384.               `timezone` varchar(255) not null,
  385.               PRIMARY KEY (id)
  386.               )
  387.             ";
  388.  
  389.             $result = $mysqli->query($sql);
  390.             //print_r($result) ;
  391.             if ($result) {
  392.                // echo "Создание таблицы завершено";
  393.                 //header('HTTP/1.1 200 OK');
  394.                 //header('Location: http://'.$_SERVER['HTTP_HOST'].'class.php?action=install');
  395.             }  else {
  396.                 echo "Таблицу создать не удалось";
  397.             }
  398.  
  399.             // if ($mysqli->query("SHOW TABLES LIKE signals_list")) {
  400.             //     echo "Таблица существует в БД";
  401.             // }
  402.  
  403.         break;
  404.  
  405.     case "request" :
  406.        
  407.         isset($_GET['request']) ? $request = $_GET['request'] : $request = '';
  408.         if ($request === 'signal') {
  409.  
  410.             foreach ( $users as $user ) {
  411.  
  412.                 $user = new Request ([
  413.                     'username' => $user['username'],
  414.                     'user_status' => $user['user_status'],
  415.                     'trading' => $user['trading'],
  416.                     'type_account' => $user['type_account'],
  417.                     'duration' => $user['duration'],
  418.                     'bet_amount' => $user['bet_amount'],
  419.                     'martingale' => $user['martingale'],
  420.                     'trade_in_expiration' => $user['trade_in_expiration'],
  421.                     'martingale_steps' => $user['martingale_steps'],
  422.                     'apikey' => $user['apikey'],
  423.                 ]);
  424.  
  425.                 // echo "<pre>";
  426.                 // print_r($user);
  427.                 // echo "</pre>";
  428.  
  429.                 $user->sendbet_api();
  430.             }
  431.  
  432.  
  433.  
  434.         }
  435.                    
  436.         break;
  437.  
  438.     case "dashboard" :
  439.  
  440.         $info->index();
  441.         break;
  442.  
  443.     default :
  444.  
  445.         $info->index();
  446.         break;
  447. }
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454. /*
  455.  
  456. {"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"}}
  457.  
  458.  
  459.  
  460.  
  461.  
  462. stdClass Object
  463. (
  464.     [request] => report
  465.     [params] => stdClass Object
  466.         (
  467.             [key] => 2101823462323f9e97107f9c9481162d
  468.             [id] => 15095069
  469.         )
  470.  
  471.     [answer] => stdClass Object
  472.         (
  473.             [profile] => pro
  474.             [contract_id] => 46557536688
  475.             [symbol] => frxEURUSD
  476.             [bet] => PUT
  477.             [is_signal] => 0
  478.             [time_start] => 1557235424
  479.             [time_end] => 1557264224
  480.             [quote_start] => 1.11803
  481.             [quote_end] => 0
  482.             [amount] => 30
  483.             [payout] => 58.23
  484.             [payout_perc] => 94
  485.             [payment] => 58.23
  486.             [result] => 0
  487.             [result_code] => 702
  488.             [real] => stdClass Object
  489.                 (
  490.                     [amount] => 0.50
  491.                     [currency] => USD
  492.                     [percent] => 0
  493.                     [depo_start] => 0.5
  494.                     [depo_min] => 0.5
  495.                     [depo_max] => 0.5
  496.                 )
  497.  
  498.             [demo] => stdClass Object
  499.                 (
  500.                     [amount] => 15642.44
  501.                     [currency] => USD
  502.                     [percent] => 0
  503.                     [depo_start] => 15730.7
  504.                     [depo_min] => 15642.4
  505.                     [depo_max] => 15732.4
  506.                 )
  507.  
  508.         )
  509.  
  510.     [time] => stdClass Object
  511.         (
  512.             [start] => 2019-05-07 17:55:27
  513.             [timeout] => 0.0432
  514.             [end] => 2019-05-07 14:55:27
  515.         )
  516.  
  517. )
  518.  
  519.  
  520.  
  521. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement