読者です 読者をやめる 読者になる 読者になる

はい!今やってます!

Work Pertly, Live Idly

【大人の自由研究】RestAPIを使ったFX自動取引で不労所得を実現する[FX][PHP][RestAPI]

はじめに

FXは世界中で取引される為替の変動を予測しながら差額で利益を生み出す事が可能な大人の遊びです。
土日を除く平日の24時間マーケットが開き、相場が変動しています。 世の中にはFXで生計を立てるような人もおり、数多くの書籍やテクニカルと呼ばれる指標、過去のデータから導き出された取引手法が存在し連日テレビCMが放送される等人気があります。今回は大人の夏の自由研究と称してFXの自動取引に手を出してみました。

f:id:yuji_ueda:20150821002702j:plain

FXはギャンブルなのか

FXといえばその手軽さやレバレッジという信用取引のような仕組みから、為替の荒波に飲まれて資産を失う人が少なくありません。 10万円の資金を元手に数億円を手にした人や、その逆で用意した数千万円を数日で失った人もいます。
私も怖いというのが第一印象でしたが、スキャルピングと呼ばれるデイトレーディング手法やスイングトレードと呼ばれる短期の売買については比較的ギャンブル性が高いと感じた一方で、 自動取引で取引ロジックを明確にし、そのロジックのみに取引を依存することで個人の裁量を減らす事が出来れば、ギャンブル性を下げる事が出来るのでは無いかと考えました。 長期的に取引を続ける事で、そのロジック自体の効果を検証する事が可能なのも自動取引の魅力です。

FXの自動取引を取り巻く事情

「わざわざWEBのAPIを使って自動取引をする必要は無いのではないか」と思われる方がいるかも知れません。
実際の所、多くの取引会社ではMT4(Meta Trader 4)と呼ばれるツールEA(Expert Adviser)を組み合わせたFXの自動取引の仕組みの導入が可能です。 MT4は様々なテクニカル指標をグラフィカルに表示出来る取引ツールなのですが、更に重要なのがこのEA。 EAというのが自動売買のロジックの部分を担っています。様々なEAがパッケージとして有料/無料で配布され、ポータルサイトではそのパフォーマンスが検証されています。 EAはMQL4というプログラミング言語で書かれますが、RestAPIを使えばプログラミング言語に依存せず取引ロジックを書けるのが特徴です。

OANDAのRestAPI

このOANDAという会社ではRestAPIで取引が出来る仕組みが提供されていました。
秒間リクエスト制限は15で、クライアントアクセスだけならHTTPのリクエストヘッダTokenを渡してアクセスするだけで注文決済等の処理が可能です。 APIの仕様についても上手くドキュメントがまとめられており、サンドボックス環境デモ環境でプログラムを検証出来る点も魅力的です。 www.oanda.jp

API Document

FXの基本について

FXでは口座開設費取引手数料スプレッドスワップ等の費用が掛かります。 各項目の説明についてはその他に譲りますが、他にもレバレッジ等の基本項目については抑えておくべきでしょう。
OANDAは口座開設費/取引手数料無料、スプレッドがUSD/JPY0.4銭と業界最狭水準、約定能力が高い(成り行きならスリッページが発生しない)という点で取引会社としても比較的優れていると言えます。

今回実現したいロジック

こちらのYoutubeの動画がわかりやすいですが、

www.youtube.com

FXの取引では基本的な短期と中期の移動平均線の交わり、いわゆるゴールデンクロス/デッドクロスから売りと買いを決定し、注文するという取引手法を実現したいと思います。 基本的な処理は下記の通り

  1. マーケットが開いている事を確認する(API:/prices)
  2. 移動平均線を取得する(API:/candles)
  3. 注文/決済を実行する(API:/accounts)

環境/構成

今回DigitalOceanのVPSを1インスタンス借りて、PHPのプログラムをcrontabから実行するという方法で動かしています。 f:id:yuji_ueda:20150821001825p:plain

APIリクエスト部分

マーケットが空いている事を確認する部分のプログラムサンプル

define("API_URL", "https://api-fxpractice.oanda.com/v1");
define("INSTRUMENT", "USD_JPY");
define("PERSONAL_ACCESS_TOKEN", "(ここにはパーソナルアクセストークンを設定して下さい)");

function isMarketOpen(){

    $market_open_flag = 1;

    $api_string = "prices";
    $params["instruments"] = INSTRUMENT;
    $data = callApi($api_string, $params, "GET");

    if(array_key_exists("status", $data["prices"][0])){
        if($data["prices"][0]["status"] == "halted"){
            $market_open_flag = 0;
        }
    }
    return $market_open_flag;
}

function callApi($api_string, $params, $curl_method){

    $curl = curl_init();
    $query = http_build_query($params);

    $token = PERSONAL_ACCESS_TOKEN;
    $auth_header = [
    'Authorization: Bearer '.$token,
    ];
    curl_setopt($curl, CURLOPT_HTTPHEADER, $auth_header);

    switch($curl_method){
        case "GET":
            doGetSetting($curl, $api_string, $query);
            break;
        case "POST":
            doPostSetting($curl, $api_string, $query);
            break;
        case "DELETE":
            doDeleteSetting($curl, $api_string);
            break;
    }

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);// 実行結果を文字列として取得
    $res = curl_exec($curl);
    $response_header = curl_getinfo($curl);
    curl_close($curl);// コネクションを切断
    $code = $response_header["http_code"];
    if ($code >= 400) { // もしエラーなら
        exit();
    }
    return $data = json_decode($res, true); // APIの実行結果を$dataに格納
}

function doGetSetting($curl, $api_string, $query){
    curl_setopt($curl, CURLOPT_URL, API_URL."/$api_string?".$query);  
}

function doPostSetting($curl, $api_string, $query){
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_URL, API_URL."/$api_string");
    curl_setopt($curl, CURLOPT_POSTFIELDS, $query);   
}

function doDeleteSetting($curl, $api_string){
    curl_setopt($curl, CURLOPT_URL, API_URL."/$api_string");
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
}

結果

OANDAのRestAPIを使う事で為替の動向に応じた注文を入れる事が出来ました。 1,2週間デモ口座で動かしてみた感想ですが、移動平均線のみに頼ったロジックでは上手く儲けを出すことが出来ませんでした。
好きなプログラミング言語で書けるという以外にもサーバ上で定期的に動かす事が出来るのでラップトップを常時稼働させておく必要が無いというのもメリットでした。 cronだと1分おきの値動きしか追えないという問題があるので、環境をもう少し考えた方がいいかなというのも感想です。