LoginSignup
33
33

More than 5 years have passed since last update.

リアルタイム為替レートをとってみた

Last updated at Posted at 2015-01-30

最近、インベスターZというマンガに影響され投資に興味を持った。
証券口座作ってみたりして遊んでいると、FXの口座は開設するといくらかキャッシュバックがもらえるところが多いことに気づき、DMM.com証券とか開いてみた。

お仕事はプログラマをやっているということで、やっぱシステムトレードとかそういうの興味を持ってしまう。世の中には為替取引をREST APIで提供している企業があるらしい。APIがあるなら繋ぎたい。そう思うのがWebエンジニアである。(タブン)

OANDAというところがREST APIを提供している

最近サイトのリニューアルをしたらしい。
http://markezine.jp/release/detail/468817

口座開設しないとAPIたたけないんだろうなーと思っていたが、sandboxでは必要ないらしい。(※なお、ガチ環境でやるときは25万円入金している状態でアクセストークンの発行を行わないといけない。)

FXはキャッシュバックの半分が吹っ飛んでいる程度に負けているのであんまやる気しないんですが、為替レート、jsonで取れるならとってみたい。

JavaのサンプルをScalaに書き換えてみた

javaのサンプルがここに。mavenとjavaがあれば動かせられる。
https://github.com/oanda/java-api-streaming

そんまま真似してscalaで書いてみた。
sbtがあれば動くはず。
https://github.com/oshiro-kazuma/oanda-scala-stream-api

おっおっおっ

取れとる・・・
USD_JPYとEUR_JPYを取得してみた。

sbt "run-main PriceStream"
{"tick":{"instrument":"EUR_JPY","time":"2015-01-29T15:30:09.099175Z","bid":142.564,"ask":142.584}}
{"tick":{"instrument":"USD_JPY","time":"2015-01-29T15:30:38.746838Z","bid":114.86,"ask":114.874}}
{"tick":{"instrument":"USD_JPY","time":"2015-01-29T15:30:41.068148Z","bid":114.859,"ask":114.875}}
{"tick":{"instrument":"EUR_JPY","time":"2015-01-29T15:30:42.749457Z","bid":142.564,"ask":142.585}}
{"tick":{"instrument":"USD_JPY","time":"2015-01-29T15:31:06.279973Z","bid":114.861,"ask":114.875}}
{"tick":{"instrument":"EUR_JPY","time":"2015-01-29T15:31:06.333618Z","bid":142.565,"ask":142.588}}
{"tick":{"instrument":"EUR_JPY","time":"2015-01-29T15:31:06.334019Z","bid":142.566,"ask":142.587}}
{"tick":{"instrument":"EUR_JPY","time":"2015-01-29T15:31:06.437200Z","bid":142.565,"ask":142.588}}
{"tick":{"instrument":"EUR_JPY","time":"2015-01-29T15:31:06.814322Z","bid":142.566,"ask":142.587}}

そ、、それで・・・?

そ、、そそれだけです。

scalaでBufferedReaderをうまいこと回す方法を学べたのは良かったかと。

// print realtime prices
Stream.continually(br.readLine())
  .takeWhile(_ ne null)
  .filterNot(_.contains("heartbeat"))
  .foreach(println)

と思ったが、こっちのほうが断然良かった。

val bs: BufferedSource = Source.fromInputStream(entity.getContent)
bs.getLines()
  .filter(!_.contains("heartbeat"))
  .foreach(println)

初めは以下っぽく書いていたんですがscalaでコレは辛いかな、と思い。

var line: String = ""
while ({line = br.readLine()); line != null}) { // do something } 

Dispatch使ったほうが3倍簡単でした

object Hoge extends App {

  import dispatch._, Defaults._
  import scala.concurrent.duration._

  val endpoint = "http://stream-sandbox.oanda.com/v1/prices?instruments=USD_JPY"
  val request = Http(url(endpoint) > as.stream.Lines(printer))

  def printer(line: String) = line match {
    case l if l.contains("heartbeat") => // nothing to do.
    case l => println(l)
  }

  Await.result(request, Duration.Inf)

}
33
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
33