読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

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

今日の気づき

たまに発生する以下のようなコードですが、 map = {} ... list = map[str] #ハッシュからリストを取得 if list == nil # リストが未作成であれば、 list = [] # リストを作成してハッシュに積む map[str] = list end list << number # リストに値を追加。 こ…

クリック証券で提供されている為替レートのヒストリカルデータを一括取得するスクリプト

クリック証券で提供されている、為替レートのヒストリカルデータを一括取得するスクリプトを書いてみました。クリック証券にアクセスしてデータのzipアーカイブを取得し、指定ディレクトリに展開します。 注意事項 ダウンロードするにはクリック証券のアカウ…

zipを展開するサンプル

rubyzipを使ってzipアーカイブを展開するサンプルです。 require 'rubygems' require 'zip/zip' #===zipファイルを展開する。 #zip:: zipファイル #dest:: 展開先ディレクトリ def extract( zip, dest ) FileUtils.makedirs(dest) Zip::ZipFile.foreach(zip)…

レート一覧を取得するサンプル

jijiがサポートする証券会社をもうひとつくらい増やそうかな、ということでSBI証券のスクレイピングクライアントに着手。ログイン・ログアウトとレート情報取得まで実装しました。→GitHub - unageanu/sbiclient 例によってGitHubで公開。gemの作成などは未で…

バックテストを実行して結果を取得するサンプル

jijiにバックテストを登録&実行して、結果を取得するスクリプトのサンプルです。 デモサイトに接続して、 パラメータの違う移動平均エージェントを2つ実行するバックテストを作成。 実行終了を待ち、結果を出力します。 いろいろいけてないところを隠蔽する…

バックテストを登録するスクリプトのサンプル

エージェントのバックテストでは、各種パラメータの組み合わせをいろいろと変えて動作を調整したい場合があります。(カーブフィティングとかいうやつてずね。)jijiでは複数のエージェントを一括でテスト可能ですが、UIからちまちま登録するのはなかなかメン…

利用可能なフォントのサンプル画像を作成するスクリプト

利用可能なフォントのサンプル画像を作成するスクリプトを書いてみました。 システムで利用可能なフォントの一覧を取得し、 各フォントで、指定された文字列を描画した画像を出力します。 require 'rubygems' require 'RMagick' size = 24 #サイズ color = "…

利用可能なフォントの一覧を取得する。

Magick#fontsで利用可能なフォントの一覧を取得できます。 require 'rubygems' require 'RMagick' #利用可能なフォントの一覧を表示する。 Magick.fonts {|f| puts f.name } 実行結果です。 AvantGarde-Book AvantGarde-BookOblique AvantGarde-Demi AvantGa…

画像をHTMLテーブルに変換するスクリプト

画像をHTMLテーブルに変換するスクリプトを書いてみました。特に使い道はありませんが・・・。 require 'rubygems' require 'RMagick' require 'erb' # 画像をテーブルに変換するスクリプト。 imgs = Magick::Image.read("./kitten.jpg") img = imgs.first e…

簡単なアニメーションGIFを作るサンプル

RMagickを使って簡単なアニメーションGIFを作るサンプルです。基本的な手順としては Magick::ImageListのインスタンスを作成 ImageListにアニメーションのフレームとなる画像を追加。 後は「ImageList.write」でリストをgif形式で保存すれば、アニメーション…

画像内で使用されている色の統計を取るサンプル

RMagickを使って、画像内で使用されている色の統計を取得するサンプルを書いてみました。使用されている色ごとに割合を算出し、使用量の多い順に出力します。 require 'rubygems' require 'RMagick' imgs = Magick::Image.read("./kitten.jpg") img = imgs.f…

Google翻訳APIで文字列の翻訳と言語の判定を行うモジュール

昨日の続き。Google翻訳APIでは文字列の言語を特定する機能も提供されているので、それを利用して元の言語を自動判定してから翻訳するようにしてみました。これで言語を気にせずにがしがし変換できます。ついでにto_itやto_frなど翻訳可能な言語に対応する変…

Google翻訳APIで文字列を翻訳するモジュールを書いた

Google翻訳APIで文字列を翻訳するモジュールを書きました。 対象とする文字列と翻訳元/翻訳先言語を指定して呼び出すと、翻訳された文字列が返されます。 使用可能な言語はこの辺を参照。 プロキシが必要なら「Translate.set_proxy」で事前に設定してくださ…

画像にフィルタをかけるサンプル

RMagickを使って画像にエフェクトをかけるサンプルです。 require 'rubygems' require 'RMagick' imgs = Magick::Image.read("./kitten.jpg") img = imgs.first img = img.sketch( 5.0, 5.0, -45 ) # スケッチエフェクトを適用 img.write( "./sketched.jpg" …

RMagickで画像の種類とサイズを表示するサンプル

RMagickは画像処理ライブラリ「ImageMagick」のRubyインターフェイスです。これを使うと、 画像を解析して情報を取り出す。 画像を読み込んでエフェクトを適用する。 画像を新規に作成する。 といった操作がさくっと行えます。ということで、ローカルにイン…

余力情報の取得に対応

余力情報の取得に対応しました。 →Github - unageanu / clickclient_scrap モバトレ君の「口座/余力確認」ページで確認できる情報を取得できるようにしています。 サンプル $: << "../lib" require 'clickclient_scrap' require 'constants' # ログイン c = …

演算子式の戻り値

Rubyではいくつかの演算子はクラスのメソッドとして再定義することが可能です。ということは、演算子式の戻り値を変えてやれば、代入式の評価結果を変更できるんじゃね?と思いたって試してみましたがやはり不可でした。 class Foo def var=(value) return "v…

クロスアップ/クロスダウンを判定するユーティリティ

先行指標と遅行指標を受け取って、クロスアップ/クロスダウンを判定するユーティリティです。利用例と挙動の説明は以下。 require 'cross' cross = Cross.new # 先行指標、遅行指標を受け取って状態を返す。 # :cross .. クロスアップ、クロスダウン状態かど…

HTTPClient::Timeout

httpclient付属の「HTTPClient::Timeout」を使うと、処理が指定された期間で完了したかチェックして、完了しない場合エラーとする機能を簡単に実現できます。 同様の機能を提供する標準添付のライブラリとしてtimeout.rbがありますが、これと比較して以下の…

FireBugを1.4.0にするとWebrickサーバー上のJavaScriptファイルがデバッグできなくなった

FireBugを1.4.0にアップデートすると、Webrickサーバー上のJavaScriptファイルがデバッグできなくなってしまった。「スクリプト」タブからjsのソースを開こうとすると、 The resource from this URL is not text: http://127.0.0.1:7000/js/xxxx.jsとか言わ…

今日の罠

単純なif文ですが。 hash = {:a=>"a"} # ハッシュにキーがあり、且つ # 値がnilでなければ"aaa"を表示 if hash.key? :a && hash[:a] puts "aaa" else puts "bbb" end 実行結果です。条件を満たすハズなのにfalseと評価され"bbb"が出力されます。 bbb ぬー、…

Thread#raise

Thread#raiseで、任意のスレッドで強制的に例外を発生させることが可能です。 例外なので、スレッド内で捕捉(catch)して処理を振り別けることができます。 ensureブロックもちゃんと実行されます。 t = Thread.fork { begin p "start" i = 0 while true p i+…

includeしたmoduleのconst_missingが実行されるようにする。

昨日の続き。includeしたmoduleのconst_missingは実行されないわけですが、ふと思い立って以下のコードを試してみたら無事動作しました。戦略的には、 includeしたクラスでconst_missingを定義しておき、 その中で、includeしたモジュールから定義を探す。 …

includeしたmoduleのconst_missingは実行されないのか

モジュールで定義されていない定数を参照したとき、Module#const_missingが実行されます。 module A AAA = "AAA" def self.const_missing(id) return "BBB" if id == :BBB raise "not found." end end puts A::AAA puts A::BBB 実行結果です。 AAAは定数とし…

RSIを算出する

RSIを算出するクラスです。 module Signal #===一定期間のレートデータを元に値を算出するシグナルの基底クラス class RangeSignal include Signal def initialize( range=25 ) @datas = [] # レートを記録するバッファ @range = range end def next_data( d…

最小二乗法で配列内の値の傾きを得る関数

最小二乗法で配列内の値の傾きを得る関数です。このサイトを参考に実装しています。 #===最小二乗法で、配列内の値の傾きを得る。 #datas:: 値の配列 #戻り値:: 傾き。0より大きければ上向き。小さければ下向き。 def vector( datas ) # 最小二乗法を使う。 …

クリック証券アクセスプラグインのメモリリークをデバッグ中

先週公開したjiji用クリック証券アクセスプラグインですが、連続で2,3日動かしているとメモリ使用量が酷いことに・・・。申し訳ありません。 原因 ※注: 以下はWWW::Mechanize0.9.0 のソースを対象に調査した結果です。ということで、ツールを作って調査して…

Math#max

あれ、Math#maxってないんだっけ。どっかで見た覚えがあるんだが・・・と思ったらこれでした。最大の整数が欲しい場合は、これを使ってこんな感じで書くのがスマートかな。 a=3 b=7 c=5 # 最大の整数を得る。 p [a,b,c].max 実行結果です。 7

インスタンスの所有者を探索するクラス

任意のインスタンスの所有者(インスタンス変数としてインスタンスを保持するインスタンス)を探索するクラスを書いてみました。 ObjectSpaceを使ってインスタンスを列挙して、全ての所有インスタンスのIDを記録。 記録したデータを元に、逆引きで所有者の一覧…

クラスごとのインスタンスの数を数える関数

クラスごとのインスタンスの数を数える関数を書きました。 #インスタンスの数を数える def count_instance count = {} ObjectSpace.each_object {|object| clazz = object.class.to_s count[clazz] ||= 0 count[clazz] += 1 } return count end #インスタン…

指数移動平均を算出する

指数移動平均を算出するライブラリです。 ちょっとリファクタして、移動平均や加重移動平均と共通部分を親クラスに移動しています。ファイルも1つに統合して、APIも微妙に修正してます。 あと、加重移動平均の加重が逆(古いものを重視)だったのも修正してま…

加重移動平均を算出する

移動平均もいろいろあるなー。→Wikipedia - 移動平均普通の移動平均は作成済みなので、その次の加重移動平均を実装。 # 一定期間の加重移動平均を得る class WeightedMovingAverage def initialize( range=25 ) @rates = [] # レートを記録するバッファ @ran…

ボリンジャーバンドを算出する

クリック証券のスクレイピング版プラグインもだいぶできつつある(現在稼動テスト&デバッグ中)ので、ぼちぼち組み込みのライブラリを充実させて簡単にエージェントを作れるようにしていきたい。ということで、とりあえずボリンジャーバンドを算出するライブラ…

WWW::Mechanizeで「can't modify frozen object」のエラーが発生する

久々にちょっと早く帰れたので、jijiのクリック証券プラグインを作っていたわけですが、レート情報を取ってくるところで以下のエラーが起きる。 , [2009-06-03T02:25:04.651000 #7420] ERROR -- : can't modify frozen object (TypeError) /usr/lib/ruby/1.8…

WWW::Mechanizeを0.9.2でIconv::InvalidEncodingエラー

WWW::Mechanizeを0.9.2にupdateすると、以下のエラーになってクリック証券スクレイピングライブラリが動作しなくなった・・・。 Iconv::InvalidEncoding: invalid encoding ("Windows-31J", "UTF-8") /usr/lib/ruby/gems/1.8/gems/mechanize-0.9.2/lib/www/m…

%記法

Rubyには「%記法」と呼ばれる文字列リテラルや正規表現リテラルを記述する別の記法があります。名前は聞いたことあったけど使ったことはなかったのですが、説明を読んでみると使いこなせばスマートな記述ができそう。ということで、便利そうな使い道をまとめ…

今日見つけたコード

なんだこのrescueと思ったら、 def foo # 処理 rescue LoadError # なんだこれ end メソッド定義の一部でした。こういう書き方もできるのかー。 def foo puts "start" raise "test" puts "end" rescue puts "rescue" ensure puts "ensure" end foo 実行結果…

今日見つけたコード

↓の場合は改行が文の区切りにならないのか。ふむ。 puts "<abc>". gsub(/</, ''). gsub(/>/, '') 実行結果です。 abc

Sinatraを0.9.2にupdateするとWEBrickで動作しなくなった

Sinatraを0.9.2にupdateすると、以下のエラーになって組み込みのWEBrickで動かなくなってしまった。 /usr/lib/ruby/gems/1.8/gems/sinatra-0.9.2/lib/sinatra/base.rb:930:in `detect_rack_handler': Server handler (thin,mongrel,webrick) not found. (Run…

今日見つけたコード

ヒアドキュメントの識別子の後(↓の例では「 puts (<<-HTML).gsub(/^ {2}/, '') <html> <head>...</head> <body>...</body> </html> HTML 実行結果です。「gsub(/^ {2}/, '')」により先頭のインデントが消えています。ふむ。 <html> <head>...</head> <body>...</body> </html>

Kernel#autoload

Kernel#autoloadで任意の定数を参照した場合に、指定したファイルをrequireするように設定できます。 # 定数Fooを参照した場合に、fooをrequireする autoload :Foo, "foo" module Var # 定数Var::Hogeを参照した場合に、var/hoge をrequireする autoload :Ho…

Basic認証を行う簡単なサンプル

SinatraのFAQにBasic認証を行うサンプルがあったので試してみます。といっても、「set Rack::Auth::Basic」を呼び出すだけ。 require 'rubygems' require 'sinatra' # 認証を設定。 # ユーザー名が「foo」,「var」の場合のみアクセスを許可する。 use Rack::…

Kernel#y

yamlをrequireすると、引数で指定されたオブジェクトをyaml形式で出力する「Kernel#y」メソッドが追加されます。Kernelに追加されるので、組み込み関数として使えます。 require 'yaml' list = [ { :name => "mii", :age=>1 }, { :name => "tora", :age=>0 }…

セッションを使う簡単なサンプル

SinatraでSessionを使う簡単なサンプルです。手順は以下。 「set :sessions, true」でセッションを有効化。(このへんに説明があります。) 後は、「session[]」でセッションの値にアクセス可能です。 ちなみに、sessionはSinatra::Helpersモジュールで定義さ…

Sinatraで遊んでみる

Sinatraは、Rubyで簡単にWebApplicationを作成できるDSL(ドメイン特化言語)です。 インストール $ gem install sinatra シンプルなサンプル 以下は、"/"にGETでアクセスされた場合、"Hello World"を返すWebサーバーを起動するだけの単純なサンプルです。 req…

指定されたコンテキストでのローカル変数の一覧を取得する関数

指定されたコンテキストでのローカル変数の一覧(名前と値のハッシュ)を取得する関数を書きました。戦略は以下です。 「eval( "local_variables", binding )」でbindingでのローカル変数名一覧を取得。 Kernel#local_variablesは現在のスコープで定義されてい…

今日見つけたコード

今日見つけたコード。なんだコレ、と思ったらシングルトンインスタンスの作成でした。 class Kitten # なんだコレと思ったらシングルトンインスタンスの作成だった。 Singleton = new def meow puts "meow" end end # シングルトンインスタンスを使う。 Kitt…

成り行きでの決済注文に対応

成り行きでの決済注文に対応しました。 →Github - unageanu / clickclient_scrap 指値、逆指値やOCOでの決済は未実装です。 サンプル 以下は、建玉一覧を取得し、すべての建玉を決済するサンプルです。 $: << "../lib" require 'clickclient_scrap' require …

建玉一覧の取得に対応

建玉一覧の取得に対応しました。 →Github - unageanu / clickclient_scrap 高速化のため、注文一覧と同じく一覧画面から取得できる情報のみを返します。 サンプル $: << "../lib" require 'clickclient_scrap' require 'constants' # ログイン c = ClickClie…

通常注文のキャンセル機能を実装

通常注文のキャンセル機能を実装しました。 →Github - unageanu / clickclient_scrap また、注文APIの戻り値として注文番号を返す処理も実装しました。注文→(返された注文番号を引数として)注文をキャンセル、が可能です。なお、通常注文以外の注文(成り行き…