無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

為替レートをJSON-RPCで取得するサンプル

jijiで収集された為替レートを再利用するには、CSVファイルに保存されたデータを利用するほか、jijiが提供するJSON-RPCインターフェイスを利用して取得することもできます。
具体的には、以下のような本文を、「http://:/json/rate」にpostすればOK。

{"method":"list", "params":["<通貨ペア>","<4本値>",<開始日時>,<終了日時>]}
  • 通貨ペアは「EURJPY」「AUGJPY」などの文字列で指定します。
  • 4本値は「"1m", "5m", "10m", "30m", "1h", "6h", "1d", "2d", "5d"」のいずれかが指定可能。
  • 期間(開始日時,終了日時)は、1970-01-01からの経過秒数で指定します。(ミリ秒ではないのでご注意)

レスポンスとして、レートデータを配列で含むjsonデータが返されてきます。※実際には改行されていません。

[{"error":null, "result":[
    [127.28,127.6,127.63,127.04,1238421600,1238425200],
    [127.58,128.07,128.08,127.31,1238425200,1238428800],
    [127.99,128.23,128.3,127.9,1238428800,1238432400],
    [128.24,127.63,128.29,127.55,1238432400,1238436000],
    [127.64,127.76,127.89,127.58,1238436000,1238439600],
    [127.75,128.29,128.29,127.75,1238439600,1238443200],
    [128.33,128.34,128.35,128.15,1238443200,1238446800],
    .. 省略
]}]

rubyで取得するサンプル

rubyで接続してデータを取得するサンプルを書いてみました。デモサイトに接続して、2009-4-1の1時間足を取得します。

#!/usr/bin/ruby --

require "rubygems"
require "cgi"
require 'httpclient'
require "json/lexer"
require "json/objects"


# クライアント
class JsonRpcRequestor
  def initialize( name, host="http://localhost:8080", proxy=nil )
    @client = HTTPClient.new( proxy, "JsonClientLib")
    @client.set_cookie_store("cookie.dat")
    @name = name
    @host = host
  end
  def method_missing( name, *args )
    body = CGI.escape("{\"method\":#{name.to_s},\"params\":#{args.to_json}}")
    result = @client.post("#{@host}/json/#{@name}", body )
    json = JSON::Lexer.new(result.content).nextvalue[0]
    if json["error"]
      raise json["error"]
    else
      json["result"]
    end
  end
end

time = Time.local(2009, 4, 1).to_i
client = JsonRpcRequestor.new("rate", "http://unageanu.homeip.net/jiji-demo")
client.list( "EURJPY", "1h", time-24*60*60, time ).each {|rate|
  p rate
}

実行結果です。

[127.28, 127.6, 127.63, 127.04, 1238421600, 1238425200]
[127.58, 128.07, 128.08, 127.31, 1238425200, 1238428800]
[127.99, 128.23, 128.3, 127.9, 1238428800, 1238432400]
[128.24, 127.63, 128.29, 127.55, 1238432400, 1238436000]
[127.64, 127.76, 127.89, 127.58, 1238436000, 1238439600]
[127.75, 128.29, 128.29, 127.75, 1238439600, 1238443200]
[128.33, 128.34, 128.35, 128.15, 1238443200, 1238446800]
[128.34, 128.64, 128.66, 128.34, 1238446800, 1238450400]
[128.64, 128.45, 128.91, 128.34, 1238450400, 1238454000]
[128.46, 128.45, 128.57, 128.23, 1238454000, 1238457600]
[128.48, 129.42, 129.71, 128.4, 1238457600, 1238461200]
[129.39, 129.97, 130.03, 129.39, 1238461200, 1238464800]
[129.95, 129.95, 130.1, 129.75, 1238464800, 1238468400]
[129.95, 130.33, 130.63, 129.77, 1238468400, 1238472000]
[130.33, 130.01, 130.33, 129.72, 1238472000, 1238475600]
[130.0, 129.52, 130.06, 129.36, 1238475600, 1238479200]
[129.5, 130.11, 130.53, 129.45, 1238479200, 1238482800]
[130.11, 130.48, 130.53, 129.79, 1238482800, 1238486400]
[130.48, 130.43, 130.77, 130.36, 1238486400, 1238490000]
[130.42, 130.73, 130.84, 130.35, 1238490000, 1238493600]
[130.72, 131.18, 131.26, 130.6, 1238493600, 1238497200]
[131.18, 130.96, 131.55, 130.9, 1238497200, 1238500800]
[131.01, 131.34, 131.34, 131.0, 1238500800, 1238504400]
[131.34, 131.34, 131.34, 131.34, 1238504400, 1238508000]
[131.34, 131.07, 131.34, 130.69, 1238508000, 1238511600]

ちなみに

jijiでは、このインターフェイスを利用してレートデータを取得し、ローソク足チャートの表示を行っています。というか、サーバーのすべての機能はJSON-RPCで呼び出せるWebサービスになっていて、UIではJavaScriptなどでそれを呼び出しています。

サーバーサイドの実装は、RubyクラスをJSONでアクセスできるWebサービス化するで書いたやつです。また、JavaScriptActionScript版のクライアントは、JSONBrokerのJavaScriptクライアントを書いたJSONBrokerのActionScript版クライアントを書いたにあります。