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

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

テストケースをちょっと書いた

GMOインターネット証券WebServiceクライアントに以下のテストケースを追加しました。

  • 通貨ペア一覧取得
  • レート一覧取得
  • お知らせ一覧取得
  • 通常取引(注文/注文情報取得/キャンセル) ※一部のみ

実際のWebサービスに接続してテストします。注文は約定しないように、指値で現在値より5円安い価格を指定して試しています。問題は成り行きと決済注文。どうしたものか。

ダウンロード

一応公開。こちらからどうぞ。
※実際のWebサービスでの動作は未検証です。ローカルサーバーでの動作のみ確認しています。

テストケース

こんな感じです。

#!/usr/bin/ruby

$: << "../src"

require "runit/testcase"
require "runit/cui/testrunner"
require "gmoclient"

#gmoclientの参照系テスト。
#以下のテストを実際のサーバーに接続し行う。
#実行前にユーザー名/パスワードを設定しておくこと。
#
#- 通貨ペア一覧取得
#- レート一覧取得
#- お知らせ一覧取得
#
class GmoClient_FxTest <  RUNIT::TestCase
  
  # ユーザー名
  USER_NAME = "user_id"
  # パスワード
  PASSWORD  = "password"
  
  CURRENCY_PAIRS = [
    GMO::FX::USDJPY, GMO::FX::EURJPY, GMO::FX::GBPJPY,
    GMO::FX::AUDJPY, GMO::FX::NZDJPY, GMO::FX::CADJPY,
    GMO::FX::CHFJPY, GMO::FX::ZARJPY, GMO::FX::EURUSD,
    GMO::FX::GBPUSD, GMO::FX::AUDUSD, GMO::FX::EURCHF,
    GMO::FX::GBPCHF, GMO::FX::USDCHF]  
  
  def setup
    @client = GMO::Client.new
  end

  def teardown
  end
  
  # 通貨ペア一覧取得のテスト
  def test_list_currency_pairs
    @client.fx_session(USER_NAME, PASSWORD){|fx|
      # 全一覧取得
      list = fx.list_currency_pairs
      CURRENCY_PAIRS.each {|code|
        info = list[code]
        assert_valid_currency_pair( info, code )
      }
      
      # GMO::FX::EURJPY, GMO::FX::CADJPY, GMO::FX::AUDUSDを取得
      list = fx.list_currency_pairs( [GMO::FX::EURJPY, GMO::FX::CADJPY, GMO::FX::AUDUSD] )
      assert_equals list.size, 3
      assert_valid_currency_pair( list[GMO::FX::EURJPY], GMO::FX::EURJPY )
      assert_valid_currency_pair( list[GMO::FX::CADJPY], GMO::FX::CADJPY )
      assert_valid_currency_pair( list[GMO::FX::AUDUSD], GMO::FX::AUDUSD )
    }
  end
  
  # 現在のレート一覧取得のテスト
  def test_list_rates
    @client.fx_session(USER_NAME, PASSWORD){|fx|
      list = fx.list_rates
      CURRENCY_PAIRS.each {|code|
        info = list[code]
        assert_valid_rate( info, code )
      }
    }
  end
  
  # お知らせ一覧取得のテスト
  def test_list_messages
    @client.fx_session(USER_NAME, PASSWORD){|fx|
      list = fx.list_messages
      list.each {|msg|
        assert_not_nil msg.text
        assert_not_nil msg.title
      }
    }
  end
  
  # 通常注文の発注、変更、キャンセルのテスト
  def test_basic_order
    @client.fx_session(USER_NAME, PASSWORD){|fx|
      list = fx.list_rates
      
      # 注文
      result = fx.order( GMO::FX::USDJPY, GMO::FX::BUY, 1, {
        :rate=>list[GMO::FX::USDJPY].bid - 5, # bid-5円で注文。5円急落しないと約定しないので大丈夫?
        :execution_expression=>GMO::FX::EXECUTION_EXPRESSION_LIMIT_ORDER,
        :expiration_type=>GMO::FX::EXPIRATION_TYPE_TODAY
      })
      assert_not_nil result.order_no
      begin 
      
        # 注文確認
        orders = fx.list_orders( GMO::FX::ORDER_CONDITION_ALL, GMO::FX::USDJPY)
        order = orders[result.order_no]
        assert_equals order.order_no, result.order_no
        assert_equals order.enable_change_or_cancel, true
        assert_equals order.trade_type, GMO::FX::TRADE_TYPE_NEW
        assert_equals order.sell_or_buy, GMO::FX::BUY
        assert_equals order.trade_quantity, 10000 # USDJPNなので1万単位
        assert_equals order.rate, list[GMO::FX::USDJPY].bid - 5
        assert_equals order.execution_expression, GMO::FX::EXECUTION_EXPRESSION_LIMIT_ORDER
        assert_not_nil order.date
        assert_equals order.expiration_type, GMO::FX::EXPIRATION_TYPE_TODAY
        assert_nil order.expiration_date
        assert_equals order.order_state, GMO::FX::ORDER_STATE_RECEIVED
        assert_not_nil order.failure_reason, GMO::FX::FAILURE_REASON_NOT_FAILED
        assert_nil order.settlement_rate
        assert_nil order.settlement_date
        
      ensure
        # キャンセル
        fx.cancel_order result.order_no
      end
    }
  end    
  
private
  # 通貨ペアコードに値が設定されているか評価する
  def assert_valid_currency_pair( info, code )
    assert_equals code, info.currency_pair_code
    assert_not_nil info.name
    assert_not_nil info.max_trade_quantity.to_i
    assert_not_nil info.min_trade_quantity.to_i
    assert_not_nil info.trade_unit.to_i
  end
  
  # レートに値が設定されているか評価する
  def assert_valid_rate( info, code )
    assert_equals code, info.currency_pair_code
    assert_not_nil info.bid.to_f
    assert_not_nil info.ask.to_f
    assert_not_nil info.day_before_to.to_f
    assert_not_nil info.bid_high.to_f
    assert_not_nil info.bid_low.to_f
    assert_not_nil info.sell_swap.to_i
    assert_not_nil info.buy_swap.to_i
    assert_not_nil info.date
    assert_not_nil info.days_of_grant.to_i
  end
end

RUNIT::CUI::TestRunner.run(GmoClient_FxTest.suite)