aleksv11

tz_example_no_martingale

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