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

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

Rulang BridgeでRubyからErlangを呼び出してみた

Rulang BridgeというRuby から Erlang の関数を呼び出すライブラリを見つけたので使ってみました。

これを使うと、Rubyのプログラムからあらかじめ起動しておいたErlangサーバーにアクセスし、Erlangの関数を実行することができます。自作の関数も実行できます(ただし、Erlangサーバー側でロードしておく必要があります)。また、やりとりはTCP/IP上で行われているようなのでそれぞれ別ノードで起動してもOK(のはず)。

使い方

使い方は次の通りです。

  1. サーバーとするErlangシェルを起動。
  • ErlangシェルでRulangサーバーを起動。
    • 引数で待ち受けポートを指定する。
    • このとき、必要であれば自作の関数をロードしておく。
  1. クライアントとするRubyスクリプトでRulangBridge::Rulangのインスタンスを生成。
    • 引数で、モジュール名、ホスト名、ポートを指定する。
    • 1モジュールに付き、1インスタンスが必要。
  2. 生成したRulangBridge::Rulangインスタンスメソッドを実行。

Usageがわかりやすいので、悩むことはないかと。

1&2.サーバーとするErlangシェルの実行とRulangサーバーの起動。

Erlangシェルを立ち上げて、そこでRulangサーバーを起動します。

>erl
Eshell V5.5.4  (abort with ^G)
1> c(rulang).                   % rulangをコンパイル
{ok,rulang}
2> rulang:start_server(9900).   % Rulangサーバーを起動。引数でポートを指定する。
[Start Rulang Server]
<0.36.0>
3> c(sample).                   % クライアントから呼び出すコードを読み込んでおく。
{ok,sample}

読み込んだsample.erlは次の通り。複利計算プログラムです。

-module(sample).      
-export([compound/3]).

% BaseをRateでYear年間運用した際の複利を計算する。
compound( Base, Rate, Year ) ->
  if
    Year==0 -> Base;
    Year/=0 -> compound(Base+Base*Rate, Rate, Year-1)
  end.

3&4.クライアント側のスクリプトを作成。

RulangBridge::Rulangのインスタンスを生成してメソッドを呼び出せばOK。

require 'rulang'

# RulangBridge::Rulangのインスタンスを作成。
# 引数で呼び出す関数のモジュール名と接続先ホスト、ポートを指定する。
rulang = RulangBridge::Rulang.new("sample", "localhost", 9900)
puts rulang.compound( 10000, 0.1, 10 ) # sample:compound()を実行して結果を返す。

実行結果です。

25937.4

おー、すげー。

非同期での関数呼び出し

非同期での関数呼び出しもサポートされています。手順は次の通り。

  1. RulangBridge::Rulang.newの第4引数をtrueにしてインスタンスを生成。
  2. メソッド呼び出し時に引数にProcを追加する。
    • 非同期処理の完了後、Erlang関数の実行結果を引数としてProcが実行される。
    • 関数の戻り値はThreadになるので、それを使って処理の待ち合わせなどができる。
require 'rulang'

# 非同期呼び出しのサンプル。
# 第4引数をtrueにする。
rulang = RulangBridge::Rulang.new("sample", "localhost", 9900, true)

# Erlang関数の引数+Procを指定して関数を実行
# 非同期実行完了後、実行結果を引数としてProcが実行される。
# 関数の戻り値はThreadになる。
thread = rulang.compound( 10000, 0.1, 10, proc { |x|
  puts x
  puts "b"
})
puts "a"
thread.join

実行結果です。

a
25937.4
b