システム部のNです。
いつも仕事と全然関係ないことをブログに書いていたのですが、このサイトは求人サイトですのでどういう仕事してるのか?ということが見てくださってる方々に分からないと駄目だろうというわけで、このブログにシステムに関係あることを書くようにシステム部のメンバーに言って最近みんなが書いてくれたので自分も何か書こうと思い考えました。
未経験者も募集しておりますので、自分が未経験者だったときにプログラムを覚えようと思った動機はなんだったか?
考えたところ、ギャンブルでした。
競馬の過去のデータを大量に集めれば傾向が分かり一定の基準で予想できるのではないか?
などと考えておりました。
結果は残念ながら成功には至りませんでした。
お金を稼ぐというような具体的な目的がないとなかなかプログラムを勉強して覚えようという気にならないです・・・。
そこで今なら何が良いか?
考えたところ仮想通貨とかどうでしょうか?・・・
残念ながら、仮想通貨の発掘(マイニング)で稼ぐのはもう手遅れですよね・・・。
すごい寒いところで発電して発掘しないと電気代が稼げないようです。
しかし、仮想通貨は市場が開かれており、無料で使えるAPIがあるのでプログラムを使って自動売買することで稼ぎが出せるかもしれません・・・。
ただ初心者がいきなり自動売買までプログラムを作るのは大変危険かもしれません。
とりあえずは、値段の動きを見て今後値段が上がっていくか?下がっていくか?そのタイミングが来たか?などをメールで自分の携帯に送信するプログラムが安全かもしれません。
仮想通貨は胡散臭いと思うのでしたら、MT4というソフトをWindowsにインストールして口座を作れば(デモ口座でもよし)外国為替FXなどの価格の取得や自動売買プログラムの作成も可能です。
(言語はMQ4というC++に近い文法の言語です)
MQ4はうちの会社の仕事とは全く関係ないので触れませんが、環境構築やテクニカル分析が組み込まれているのでいろんな手法を研究するのが容易です。
※ただ、MT4が使用可能な口座はスプレッドが広いため、やる気は起きないかもしれません。
外国為替FXでもOANDAという会社で30万円以上入金して口座を作れば、REST APIが使用可能とのことです。
※REST APIはhttpでデータを取得することが可能なAPIのことで、WEBサーバ上のphpなどから利用することが出来ます。
WEB APIとも呼びます。
(http通信が可能であれば何言語でも利用可能です)
今回のブログでは、WEB系プログラマに身近なphpと少しJavaScriptを組み合わせてビットコインの価格を取得して分析するために、まずはどういう環境を作ればいいかを記載したいと思います。
1.javascriptだけで開発する → 不可能
残念ながら出来ません。
ブラウザに実装されているJavaScriptにはajax(XMLHttpRequest)というhttp通信を行うオブジェクトは用意されているのですが、残念ながらセキュリティの問題により自分が管理していないサーバに対してajaxのリクエストを行うことが出来ません。
※初心者にはめちゃくちゃ難しくおすすめしませんが、Node.jsとかいうサーバサイドjsなら可能です・・・。
phpでやったほうが良いと思います。
2.php + javascriptでやる場合
個人がやるのはこっちの方法が安定稼動させやすいのではないかと思いますが、安定して稼動を目指すなら、自分専用で1台丸ごと使用可能な専用レンタルサーバで運用するのが良いです。
しかし、利用料が高くなります。
kagoyaサーバが専用プランのレンタルサーバだと安いと思います。
初心者で値段のチェックとメールを送信するだけくらいで利用する場合はレンタルサーバの共用プランでphpが利用可能な安いレンタルサーバがお金を無駄にせず無難と思います。
この用途で共用プランでおすすめのレンタルサーバはさくらサーバです。
・さくらサーバ(メールを送ってプログラムを起動する仕組みを組み込むことができる)
・コアサーバ(cronが利用可能です。しかし残念ながら、1時間に一回しか起動できないです・・・)
1時間に一回チェックするだけならば、コアサーバでcronからphpを起動するので良いですが、1時間に一回の値段チェックでは実用レベルにはならないと思います。
年間5万円くらい払っても惜しくないほどに、お金が稼げそうな自信がついたらkagoyaサーバの専用プランがおすすめです。
cronが1分に1回起動可能です。cronで1分に一回値段をチェックできます。
あと、専用プランなら、自分専用のIPアドレスを取得できます。
共用プランの場合、同じIPアドレスを複数の人が使っているため同じことをしている人が居た場合、相手側のサーバの(REST API提供側)アクセスが激しすぎる場合などにアクセスを拒否することがありえます。
記事がすごく長くなりそうなのでphpでREST APIを呼び出して、ローソク足のデータを取得する方法だけ記載します。
それができれば、あとは自宅のパソコンを付けっぱなしにしておいてphpとJavascriptで作成した画面にJavascriptのタイマーの処理を書いて1分ごとに自分が作ったPHPを呼び出すなどで良いかと思います。
ビットコインの値段を無料で取得できるAPIは調べれば色々ありますし、取引口座を作れば口座を作った会社が提供するAPIもあります。
ここでは口座を作らず、アカウント情報なども作らずにいきなり使える Cryptowatch API を紹介します。
https://cryptowat.ch/docs/api#market-ohlc
ドキュメントは残念ながら英語です。
下記のphpのプログラムをWEBサーバにおいて実行すればビットフライヤーのビットコインを円で買う場合の1分足のデータが10本取得できます。
Cryptowatch API の ohlcというAPIを呼び出しています。
ohlcとはOHLC とは 指定した時間帯の Open価格、High価格、Low価格、Close価格のことです。
このブログ書いてみて思いましたが、ちょっと初心者には難しすぎたかもしれません・・・。
あと、相場の知識もないとちょっと難しいですね・・・。
cryptowatchApi.php
1 |
<?php |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
// Cryptowatch APIを使うクラス class cryptowatchApi { public $url = 'https://api.cryptowat.ch'; public $ohlc_returns = 10;// 何本のローソク足データを取得するか? public $timeout = 5; // httpで最長5秒待つ // REST API用の共通関数 // php curlという関数が使えれば、WEBサーバから、 // よそのサーバにhttp通信を行うことが出来ます // curlが絶対にphpに組み込まれている保証はありませんが、 // さくらサーバ、コアサーバ、カゴヤサーバならつかえます public function req($method, $path, $aQuery=NULL) { $this->isRequest = TRUE; $timestamp = time(); if($aQuery&&count($aQuery)) { $path .= '?'; $i = 0; foreach($aQuery as $k=>$v) { if($i) { $path .= '&'; } $path .= $k.'='.$v; $i++; } $body = json_encode($aQuery); } $url = $this->url.$path; //echo $url; // dbg $curl = curl_init($url); $aOptions = array( CURLOPT_RETURNTRANSFER=>TRUE // curl_execのリターンがhtmlになる , CURLOPT_TIMEOUT=>$this->timeout , CURLOPT_HEADER=>TRUE // httpヘッダ付きのレスポンスになる ); if($method == 'POST') { $aOptions[CURLOPT_HTTPHEADER][] = 'Content-Type: application/json'; $aOptions[CURLOPT_POST] = TRUE; $aOptions[CURLOPT_SSL_VERIFYPEER] = FALSE; // オレオレ証明書対策 $aOptions[CURLOPT_SSL_VERIFYHOST] = FALSE; $aOptions[CURLOPT_POSTFIELDS] = $body; } else { $aOptions[CURLOPT_HTTPGET] = TRUE; } curl_setopt_array($curl, $aOptions); $http_res = curl_exec($curl); $this->http_res_hdr = curl_getinfo($curl); // 'http_code' curl_close($curl); return $http_res; } // httpヘッダのログつきのファイルから // httpのbody部分(htmlのbodyではない!)を取得 public function getJsonBody($http_response) { $http_response = str_replace("\r", '', $http_response); list($http_header, $html) = explode("\n\n", $http_response); return $html; } // OHLC とは 指定した時間帯の Open価格、High価格、Low価格、Close価格のこと // それを取得します public function ohlc($Year=NULL, $Month=NULL, $Day=NULL, $Hour=NULL, $Minute=NULL) { $aQuery = array(); // REST APIに渡すパラメータを格納する配列 // どの時間足のデータを取得するか? $periods = 60; // 60 1分足 //$periods = 300; // 300 5分足 //$periods = 900; // 900 15分足 //$periods = 1800; // 1800 30分足 //$periods = 3600; // 3600 1時間足 //$periods = 7200; // 7200 2時間足 //$periods = 14400; // 14400 4時間足 //$periods = 21600; // 21600 6時間足 //$periods = 43200; // 43200 12時間足 //$periods = 86400; // 86400 1日足 //$periods = 259200; // 259200 3日足 //$periods = 604800; // 604800 1週間足 // どの時間足のデータを取得するか? $aQuery['periods'] = $periods; $Hour = empty($Hour ) ? date('G') : $Hour ; // 省略すると現在時間を指定 $Minute = empty($Minute ) ? date('i') : $Minute ; // 省略すると現在時間を指定 $Month = empty($Month ) ? date('n') : $Month ; // 省略すると現在時間を指定 $Day = empty($Day ) ? date('j') : $Day ; // 省略すると現在時間を指定 $Year = empty($Year ) ? date('Y') : $Year ; // 省略すると現在時間を指定 $before = mktime($Hour, $Minute, 0, $Month, $Day, $Year); $returns = $this->ohlc_returns; // キリのいいところから始まるように整形 $before = ceil($before/($returns*$periods)) * ($returns*$periods); $after = $before - $returns*$periods; // 期間を指定 $aQuery['before'] = $before; $aQuery['after'] = $after; $exchange = 'bitflyer'; // ビットフライヤー取引所を指定 $pair = 'btcjpy'; // ビットコイン円の相場 if( $http_response = $this->req('GET', '/markets/'.$exchange.'/'.$pair.'/ohlc', $aQuery) ) { if($this->http_res_hdr['http_code']=='200') { // このコメントを外して、保存すべきファイル名を指定すれば、取得したデータを保存できます // file_put_contents($http_log_path, $http_response, LOCK_EX); } else { $this->isReqError = TRUE; echo '通信エラーが発生しました http_code:'.$this->http_res_hdr['http_code']; } } else { echo '通信エラーが発生しました'; } $json = $this->getJsonBody($http_response); // jsonという形式でデータが取得できる $aJson = json_decode($json, TRUE); // jsonをphpの配列に変換 return $aJson; } } ///////////////////////////// // 上記クラスを使う実装部分 ///////////////////////////// $cryptowatchApi = new cryptowatchApi(); // jsonという形式でデータが取得できて、それをphpの配列に格納された状態で取得できます $aJson = $cryptowatchApi->ohlc(); // jsonを配列変換したデータの中身がどうなっているのか見る var_dump($aJson); |