PageRenderTime 54ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/themes/jupiter-child/HTA-assets/includes/HTA-GetFillData_OLD.php

https://bitbucket.org/awylie199/s5t
PHP | 270 lines | 176 code | 59 blank | 35 comment | 70 complexity | 5ccfab8a4dcd651ad29f31ca1dbae787 MD5 | raw file
Possible License(s): LGPL-2.1, MPL-2.0-no-copyleft-exception, Apache-2.0, LGPL-3.0, MIT, BSD-3-Clause
  1. <?php
  2. date_default_timezone_set('UTC');
  3. $output = array();
  4. require ("Constants.php");
  5. if (isset($_POST) && isset($_POST['Broker']) && isset($_POST['Account']) && isset($_POST['Contracts']) && isset($_POST['StartDate']) && isset($_POST['EndDate'])) {
  6. $mysqliConn = @new MySQLi(PROD_DB_HOST, PROD_DB_USERNAME_USER, PROD_DB_PASSWORD_USER, PROD_DB_NAME);
  7. if ($mysqliConn->connect_errno) {
  8. // Error in connection
  9. $output['OutputType'] = "ERROR";
  10. $output['Data'] = $mysqliConn->connect_error;
  11. } else {
  12. // Connected
  13. $output['OutputType'] = "DATA";
  14. $Broker = strtolower( $mysqliConn->real_escape_string($_POST['Broker']) );
  15. $Account = $mysqliConn->real_escape_string($_POST['Account']);
  16. $ListOfContracts = $_POST['Contracts'];
  17. $StartDate = $_POST['StartDate'];
  18. $EndDate = $_POST['EndDate'];
  19. // Iterate DB and get all fills within a certain timeframe for all contracts selected
  20. $AllDataArray = array();
  21. $DistinctContracts = array();
  22. $AllFills = array();
  23. foreach ($ListOfContracts as $key=>$Contract) {
  24. $FillsArray = array();
  25. // Find the opening fill after the Start Date
  26. $query = "SELECT FillID FROM fills_" . $Broker . " WHERE Account='$Account' AND Contract='$Contract' AND TimestampUTC <= '$EndDate' AND TimestampUTC >= '$StartDate' AND (TypeOfTrade='O' || TypeOfTrade='S') ORDER BY FillID ASC LIMIT 1";
  27. $results = $mysqliConn->query($query);
  28. if ($results != NULL && $results->num_rows > 0) {
  29. $StartingFillIDOBJ = $results->fetch_assoc();
  30. $results->free();
  31. // If an opening fill is found, then try to find the Closing fill (if it exists)
  32. $queryClosingFill = "SELECT FillID FROM fills_" . $Broker . " WHERE Account='$Account' AND Contract='$Contract' AND TimestampUTC <= '$EndDate' AND TimestampUTC >= '$StartDate' AND (TypeOfTrade='C' || TypeOfTrade='S') ORDER BY FillID DESC LIMIT 1";
  33. $resultsClosingFill = $mysqliConn->query($queryClosingFill);
  34. if ($resultsClosingFill != NULL && $resultsClosingFill->num_rows > 0) {
  35. $EndingFillFillIDOBJ = $resultsClosingFill->fetch_assoc();
  36. $resultsClosingFill->free();
  37. $StartingFill = $StartingFillIDOBJ['FillID'];
  38. $EndingFill = $EndingFillFillIDOBJ['FillID'];
  39. // If an opening and closing (CLOSE or SPLIT) fill exists, find all the fills inclusive and inbetween the opening and closing fill
  40. if (intval($StartingFill) < intval($EndingFill)) {
  41. array_push($DistinctContracts, $Contract);
  42. $GetFillsQuery = "SELECT FillID, OrderID, Contract, Side, Quant, TimestampUTC, Price, ContractsHeld, TypeOfTrade, HighSince, LowSince FROM fills_" . $Broker . " WHERE Account='$Account' AND Contract='$Contract' AND FillID >= '$StartingFill' AND FillID <= '$EndingFill' ORDER BY FillID ASC";
  43. $FillResults = $mysqliConn->query($GetFillsQuery);
  44. if ($FillResults != NULL && $FillResults->num_rows > 0) {
  45. while ($fill = $FillResults->fetch_assoc()) {
  46. $fill['FillID'] = intval($fill['FillID']);
  47. $fill['Quant'] = intval($fill['Quant']);
  48. $fill['ContractsHeld'] = intval($fill['ContractsHeld']);
  49. $fill['Price'] = floatval($fill['Price']);
  50. $fill['HighSince'] = floatval($fill['HighSince']);
  51. $fill['LowSince'] = floatval($fill['LowSince']);
  52. array_push($FillsArray, $fill);
  53. array_push($AllFills, $fill);
  54. }
  55. $FillResults->free();
  56. //$output["Fills-$Contract"] = $FillsArray;
  57. // From fills create Trades
  58. $TradesArray = FillsToTrades($FillsArray);
  59. $AllDataArray = array_merge($AllDataArray, $TradesArray);
  60. }
  61. }
  62. }
  63. }
  64. }
  65. // Operations
  66. usort($AllDataArray, "SortTradesByFirstFillASC"); // Sort the trades by opening trade date/time ASC
  67. $output['Data'] = $AllDataArray; // Assign to Data
  68. // This section gets the contract details from the "admin_contracts" table and sends to user (info such as TickSize, ContractSize, etc.)
  69. $ContractDetailsArray = array();
  70. // Determine Distinct Base Contracts
  71. $DistinctBASEContracts = array();
  72. if (count($DistinctContracts) > 0) {
  73. foreach ($DistinctContracts as $cont) {
  74. $baseContract = substr($cont, 0, strlen($cont)-2);
  75. if (!in_array($baseContract, $DistinctBASEContracts)) {
  76. // if the base contract does not exist in $dDistinctBASEContracts then add it
  77. array_push($DistinctBASEContracts, $baseContract);
  78. }
  79. }
  80. if (count($DistinctBASEContracts) > 0) {
  81. $ContractDetailsQuery = "SELECT Contract, BaseContract, TickSize, ContractSize FROM admin_contracts WHERE BaseContract in ('" . implode("', '", $DistinctBASEContracts) . "')";
  82. $ContractQueryResults = $mysqliConn->query($ContractDetailsQuery);
  83. if ($ContractQueryResults != NULL && $ContractQueryResults->num_rows > 0) {
  84. while ($row = $ContractQueryResults->fetch_assoc()) {
  85. if ($row['TickSize'] != NULL) $row['TickSize'] = floatval($row['TickSize']);
  86. if ($row['ContractSize'] != NULL) $row['ContractSize'] = floatval($row['ContractSize']);
  87. array_push($ContractDetailsArray, $row);
  88. }
  89. }
  90. $output['ContractDetails'] = $ContractDetailsArray;
  91. $output['query'] = $ContractDetailsQuery;
  92. }
  93. }
  94. // Close DB Connection
  95. $mysqliConn->close();
  96. // Calculate day metrics from all fills, sort fills by date ascending
  97. usort($AllFills, "SoftFillsByTimestampUTCASC");
  98. // Trade Metrics
  99. $FirstFillDateTimeUTC = NULL; // for date range
  100. $LastFillDateTimeUTC = NULL; // for date range
  101. $DaysTradedArray = array(); // a temp array which holds arrays of array("Date"=>YY-MM-DD, array of products traded) -> this will also feed "Max Products Traded Per Day" and "Days Traded"
  102. if (count($AllFills) > 0) {
  103. foreach ($AllFills as $key=>$fill) {
  104. $fillTimestampUTC = DateTime::createFromFormat("Y-m-d H:i:s e", ($fill['TimestampUTC']) . " UTC");
  105. $fillTimestampEST = DateTime::createFromFormat("Y-m-d H:i:s e", ($fill['TimestampUTC']) . " UTC")->setTimezone(new DateTimeZone('America/New_York'));
  106. $fillDate = $fillTimestampEST->format('Y-m-d');
  107. // Determine first / last fill dates
  108. if ($FirstFillDateTimeUTC == NULL) {
  109. $FirstFillDateTimeUTC = $fillTimestampUTC;
  110. $LastFillDateTimeUTC = $fillTimestampUTC;
  111. } else {
  112. if ($fillTimestampUTC > $LastFillDateTimeUTC) $LastFillDateTimeUTC = $fillTimestampUTC;
  113. if ($fillTimestampUTC < $FirstFillDateTimeUTC) $FirstFillDateTimeUTC = $fillTimestampUTC;
  114. }
  115. if (count($DaysTradedArray) == 0) {
  116. array_push( $DaysTradedArray, array("Date"=>$fillDate, "Products"=>array($fill['Contract'])) );
  117. } else {
  118. $LastDateTradedObject = $DaysTradedArray[ count($DaysTradedArray)-1 ];
  119. if ($LastDateTradedObject['Date'] == $fillDate)
  120. array_push($LastDateTradedObject['Products'], $fill['Contract']);
  121. else
  122. array_push($DaysTradedArray, array("Date"=>$fillDate, "Products"=>array($fill['Contract'])) );
  123. }
  124. }
  125. foreach ($DaysTradedArray as $array) {
  126. $array['Products'] = array_unique($array['Products']);
  127. }
  128. $output['FirstFillTimestampUTC'] = $FirstFillDateTimeUTC->format("Y-m-d H:i:s");
  129. $output['LastFillTimestampUTC'] = $LastFillDateTimeUTC->format("Y-m-d H:i:s");
  130. $output['DaysAndProductsTradedArray'] = $DaysTradedArray;
  131. }
  132. }
  133. } else {
  134. $output['OutputType'] = "ERROR";
  135. $output['Data'] = "Post metrics not correctly set.";
  136. }
  137. // Code returns here
  138. echo json_encode($output);
  139. exit();
  140. /*
  141. ** No more code executed beyond this point
  142. */
  143. // Functions
  144. function SortTradesByFirstFillASC($TradeA, $TradeB) {
  145. // Sort trades by date of the first fill ASC
  146. if (count($TradeA) > 0 && count($TradeB) > 0) {
  147. return strtotime($TradeA[0]['TimestampUTC']) > strtotime($TradeB[0]['TimestampUTC']);
  148. } else {
  149. return 0;
  150. }
  151. }
  152. function SoftFillsByTimestampUTCASC ($FillA, $FillB) {
  153. if ($FillA != NULL && $FillB != NULL)
  154. return strtotime($FillA['TimestampUTC']) > strtotime($FillB['TimestampUTC']);
  155. else
  156. return 0;
  157. }
  158. function FillsToTrades ($ArrayOfFills) {
  159. // Create array of trades from array of fills
  160. $outputArray = array();
  161. // Iterate fills to create trades
  162. $AllTrades = array();
  163. $singleTrade = array();
  164. $position = 0;
  165. $count = count($ArrayOfFills);
  166. foreach ($ArrayOfFills as $index=>$fill) {
  167. $TypeOfTrade = strtoupper($fill['TypeOfTrade']);
  168. $Quant = ($fill['Side'] == "Buy") ? intval($fill['Quant']) : -intval($fill['Quant']);
  169. $ContractsHeld = intval($fill['ContractsHeld']);
  170. if ($TypeOfTrade == 'O') {
  171. // Opening trade
  172. $singleTrade = array($fill);
  173. } else if ($TypeOfTrade == '-') {
  174. // Continuation Trade
  175. array_push($singleTrade, $fill);
  176. } else if ($TypeOfTrade == 'C') {
  177. // Closing trade -> flat
  178. array_push($singleTrade, $fill);
  179. array_push($AllTrades, $singleTrade);
  180. } else if ($TypeOfTrade == 'S') {
  181. // Closing trade -> split trade flips the position
  182. // Find out if the SPLIT is the first trade, last trade, or in the middle.
  183. // If first, the initial part of the split should be ignored
  184. // If last, the last part of the split should be ignored
  185. if ($index == 0) {
  186. // SPLIT is first trade
  187. $fill['Quant'] = abs($ContractsHeld);
  188. $singleTrade = array($fill);
  189. array_push($singleTrade, $fill);
  190. } else if ($index >= $count-1) {
  191. // SPLIT is last trade
  192. $oldPosition = $ContractsHeld - $Quant;
  193. $fill['Quant'] = abs($oldPosition);
  194. array_push($singleTrade, $fill);
  195. array_push($AllTrades, $singleTrade);
  196. } else {
  197. // SPLIT is in the middle
  198. $oldPosition = $ContractsHeld - $Quant;
  199. $fill['Quant'] = abs($oldPosition);
  200. array_push($singleTrade, $fill);
  201. array_push($AllTrades, $singleTrade);
  202. $fill['Quant'] = abs($ContractsHeld);
  203. $singleTrade = array($fill);
  204. }
  205. } else {
  206. // Errors
  207. }
  208. }
  209. return $AllTrades;
  210. }
  211. ?>