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

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

FX取引の残りの参照系APIを実装

FX取引のうち、残っていた参照系APIを実装。

  • 建玉一覧取得
  • 約定一覧取得
  • 余力情報の取得
  • お知らせ一覧取得

英訳するのが面倒になったので、レスポンスXMLの要素名をそのまま結果オブジェクトの属性として返すようにしました。

ダウンロード

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

使い方

require 'gmoclient'

c = GMO::Client.new
c.fx_session( <ユーザーID>, <パスワード> ) { | fx_session | 
  
  
  # 通貨ペア一覧取得
  # 引数で取得する通貨ペアコードを配列で指定
  # 指定しない場合すべての通貨ペアの情報を取得。
  puts "\n--- list_currency_pairs"
  list = fx_session.list_currency_pairs [GMO::USDJPY, GMO::EURJPY]
  list.each{ |currency_pair_code, value|  puts value }
  
  # レート一覧取得 
  puts "\n--- list_rates"
  list = fx_session.list_rates
  list.each{ |currency_pair_code, value|  puts value }
  
  # 成り行き注文
  puts "\n--- order - buy"
  puts fx_session.order( GMO::USDJPY, GMO::BUY, 2  )
  puts "\n--- order - sell"
  puts fx_session.order( GMO::USDJPY, GMO::SELL, 1, {
    :slippage=>99,
    :slippage_base_rate=>list[GMO::USDJPY].bid_rate
  })
  
  # 通常注文
  puts "\n--- order - basic sell"
  result = fx_session.order( GMO::USDJPY, GMO::SELL, 1, {
    :rate=>145.19,
    :execution_expression=>GMO::EXECUTION_EXPRESSION_LIMIT_ORDER,
    :expiration_type=>GMO::EXPIRATION_TYPE_SPECIFIED,
    :expiration_date=>DateTime.new( 2007, 11, 5, 0 )
  })
  puts result

  # 注文変更
  puts "\n--- edit_order"
  fx_session.edit_order( result.order_no, {
    :rate=>145.19,
    :expiration_type=>GMO::EXPIRATION_TYPE_TODAY
  })
  
  # 注文取消し
  puts "\n--- cancel_order"
  fx_session.cancel_order( result.order_no )
  
  # 注文一覧取得
  # 引数で、注文状態コード(必須)、通貨ペアコード、注文日期間開始日、注文日期間終了日を指定可能。
  puts "\n--- list_orders"
  list = fx_session.list_orders GMO::ORDER_CONDITION_ALL, GMO::EURJPY, Date.new( 2007, 10, 1 ), Date.new( 2007, 11, 1 )
  list.each{ |item|  puts item }  
  
  # 建玉一覧取得
  # 引数で、通貨ペアコードを指定可能。(省略可)
  puts "\n--- list_open_interests"
  list = fx_session.list_open_interests( GMO::EURJPY )
  list.each{ |item|  puts item }
  
  # 約定一覧取得
  # 引数で、取得期間(開始日,終了日)(必須)、通貨ペアコード、取引タイプ(新規Or決済)を指定可能。
  puts "\n--- list_execution_results"
  list = fx_session.list_execution_results( Date.new( 2007, 10, 1 ), Date.new( 2007, 11, 1 ) )
  list.each{ |item|  puts item }   
  list = fx_session.list_execution_results( Date.new( 2007, 10, 1 ), Date.new( 2007, 11, 1 ), GMO::TRADE_TYPE_NEW, GMO::EURJPY )
  list.each{ |item|  puts item }
  
  # 余力情報の取得
  puts "\n--- get_margin"
  puts fx_session.get_margin
  
  # お知らせ一覧取得
  puts "\n--- list_messages"
  list = fx_session.list_messages
  list.each{ |item|  puts item }
}

実行結果です

--- list_currency_pairs
@name=USDJPY, @trade_unit=10000, @tsukaPairCode=1, @currency_pair_code=1, @torihikiTani=10000, @min_trade_quantity=10000, @tsukaPairName=USDJPY, @minTorihikiSuryo=10000, @max_trade_quantity=3000000, @maxTorihikiSuryo=3000000

--- list_rates
@bid_high=88.47, @bidHigh=88.47, @tsukaPair=, @sell_swap=-178, @kaiSwap=175, @day_before_to=6.0, @currency_pair_code=5, @zenjitsuhi=6, @buy_swap=175, @uriSwap=-178, @ask_rate=88.45, @ask=88.45, @days_of_grant=1, @fuyoNissu=1, @bid_low=88.22, @bidLow=88.22, @bid_rate=88.38, @bid=88.38, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=0.8196, @bidHigh=0.8196, @tsukaPair=, @sell_swap=-23, @kaiSwap=20, @day_before_to=2.0, @currency_pair_code=11, @zenjitsuhi=2, @buy_swap=20, @uriSwap=-23, @ask_rate=0.8198, @ask=0.8198, @days_of_grant=1, @fuyoNissu=1, @bid_low=0.8175, @bidLow=0.8175, @bid_rate=0.8179, @bid=0.8179, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=112.0, @bidHigh=112.0, @tsukaPair=, @sell_swap=-111, @kaiSwap=108, @day_before_to=7.0, @currency_pair_code=6, @zenjitsuhi=7, @buy_swap=108, @uriSwap=-111, @ask_rate=111.98, @ask=111.98, @days_of_grant=1, @fuyoNissu=1, @bid_low=111.68, @bidLow=111.68, @bid_rate=111.92, @bid=111.92, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=1.6546, @bidHigh=1.6546, @tsukaPair=, @sell_swap=-74, @kaiSwap=71, @day_before_to=4.0, @currency_pair_code=12, @zenjitsuhi=4, @buy_swap=71, @uriSwap=-74, @ask_rate=1.6544, @ask=1.6544, @days_of_grant=1, @fuyoNissu=1, @bid_low=1.6526, @bidLow=1.6526, @bid_rate=1.6538, @bid=1.6538, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=121.66, @bidHigh=121.66, @tsukaPair=, @sell_swap=-161, @kaiSwap=159, @day_before_to=18.0, @currency_pair_code=1, @zenjitsuhi=18, @buy_swap=159, @uriSwap=-161, @ask_rate=121.79, @ask=121.79, @days_of_grant=1, @fuyoNissu=1, @bid_low=121.4, @bidLow=121.4, @bid_rate=121.64, @bid=121.64, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=99.02, @bidHigh=99.02, @tsukaPair=, @sell_swap=-46, @kaiSwap=42, @day_before_to=18.0, @currency_pair_code=7, @zenjitsuhi=18, @buy_swap=42, @uriSwap=-46, @ask_rate=99.04, @ask=99.04, @days_of_grant=1, @fuyoNissu=1, @bid_low=98.63, @bidLow=98.63, @bid_rate=98.99, @bid=98.99, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=2.4298, @bidHigh=2.4298, @tsukaPair=, @sell_swap=-205, @kaiSwap=200, @day_before_to=-11.0, @currency_pair_code=13, @zenjitsuhi=-11, @buy_swap=200, @uriSwap=-205, @ask_rate=2.4275, @ask=2.4275, @days_of_grant=1, @fuyoNissu=1, @bid_low=2.4256, @bidLow=2.4256, @bid_rate=2.4267, @bid=2.4267, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=163.8, @bidHigh=163.8, @tsukaPair=, @sell_swap=-147, @kaiSwap=143, @day_before_to=33.0, @currency_pair_code=2, @zenjitsuhi=33, @buy_swap=143, @uriSwap=-147, @ask_rate=163.83, @ask=163.83, @days_of_grant=1, @fuyoNissu=1, @bid_low=163.39, @bidLow=163.39, @bid_rate=163.78, @bid=163.78, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=17.19, @bidHigh=17.19, @tsukaPair=, @sell_swap=-390, @kaiSwap=370, @day_before_to=6.0, @currency_pair_code=8, @zenjitsuhi=6, @buy_swap=370, @uriSwap=-390, @ask_rate=17.25, @ask=17.25, @days_of_grant=1, @fuyoNissu=1, @bid_low=17.12, @bidLow=17.12, @bid_rate=17.18, @bid=17.18, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=1.2285, @bidHigh=1.2285, @tsukaPair=, @sell_swap=-104, @kaiSwap=100, @day_before_to=-3.0, @currency_pair_code=14, @zenjitsuhi=-3, @buy_swap=100, @uriSwap=-104, @ask_rate=1.23, @ask=1.23, @days_of_grant=1, @fuyoNissu=1, @bid_low=1.2264, @bidLow=1.2264, @bid_rate=1.2273, @bid=1.2273, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=240.33, @bidHigh=240.33, @tsukaPair=, @sell_swap=-306, @kaiSwap=301, @day_before_to=30.0, @currency_pair_code=3, @zenjitsuhi=30, @buy_swap=301, @uriSwap=-306, @ask_rate=240.37, @ask=240.37, @days_of_grant=1, @fuyoNissu=1, @bid_low=239.86, @bidLow=239.86, @bid_rate=240.29, @bid=240.29, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=1.3454, @bidHigh=1.3454, @tsukaPair=, @sell_swap=64, @kaiSwap=-68, @day_before_to=6.0, @currency_pair_code=9, @zenjitsuhi=6, @buy_swap=-68, @uriSwap=64, @ask_rate=1.3463, @ask=1.3463, @days_of_grant=1, @fuyoNissu=1, @bid_low=1.344, @bidLow=1.344, @bid_rate=1.345, @bid=1.345, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=99.88, @bidHigh=99.88, @tsukaPair=, @sell_swap=-152, @kaiSwap=148, @day_before_to=18.0, @currency_pair_code=4, @zenjitsuhi=18, @buy_swap=148, @uriSwap=-152, @ask_rate=99.8, @ask=99.8, @days_of_grant=1, @fuyoNissu=1, @bid_low=99.49, @bidLow=99.49, @bid_rate=99.74, @bid=99.74, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z
@bid_high=1.9733, @bidHigh=1.9733, @tsukaPair=, @sell_swap=-3, @kaiSwap=-2, @day_before_to=-5.0, @currency_pair_code=10, @zenjitsuhi=-5, @buy_swap=-2, @uriSwap=-3, @ask_rate=1.9747, @ask=1.9747, @days_of_grant=1, @fuyoNissu=1, @bid_low=1.9719, @bidLow=1.9719, @bid_rate=1.9723, @bid=1.9723, @date=2007-06-12T00:00:00Z, @hasseibi=2007-06-12T00:00:00Z

--- order - buy
@open_interest_no=10000000001, @tategyokuBango=10000000001, @order_no=10000000001, @chumonBango=10000000001

--- order - sell
@open_interest_no=10000000001, @tategyokuBango=10000000001, @order_no=10000000001, @chumonBango=10000000001

--- order - basic sell
@open_interest_no=, @order_no=10000000001, @chumonBango=10000000001

--- edit_order

--- cancel_order

--- list_orders
@expiration_date=, @hatchuSuryo=10000, @trade_quantity=10000.0, @fuseiritsuRiyu=0, @agreement_rate=, @order_no=10000000001, @hatchuNichiji=2007-05-29T13:17:00Z, @expiration_type=0, @baibai=0, @sell_or_buy=0, @chumonJotai=20, @chumonBango=10000000001, @failure_reason=0, @shikko=1, @execution_expression=1, @yakujoNichiji=, @torihiki=0, @trade_type=0, @yukoNichiji=, @order_state=20, @chumonRate=121.0, @rate=121.0, @yakujoRate=, @henkoTorikeshiKano=1, @agreement_date=, @date=2007-05-29T13:17:00Z, @enable_change_or_cancel=true, @yukoKigen=0
@expiration_date=, @hatchuSuryo=10000, @trade_quantity=10000.0, @fuseiritsuRiyu=0, @agreement_rate=, @order_no=10000000002, @hatchuNichiji=2007-05-29T13:17:00Z, @expiration_type=0, @baibai=1, @sell_or_buy=1, @chumonJotai=10, @chumonBango=10000000002, @failure_reason=0, @shikko=1, @execution_expression=1, @yakujoNichiji=, @torihiki=1, @trade_type=1, @yukoNichiji=, @order_state=10, @chumonRate=122, @rate=122.0, @yakujoRate=, @henkoTorikeshiKano=1, @agreement_date=, @date=2007-05-29T13:17:00Z, @enable_change_or_cancel=true, @yukoKigen=0
@expiration_date=, @hatchuSuryo=10000, @trade_quantity=10000.0, @fuseiritsuRiyu=0, @agreement_rate=, @order_no=10000000003, @hatchuNichiji=2007-05-29T13:17:00Z, @expiration_type=0, @baibai=1, @sell_or_buy=1, @chumonJotai=10, @chumonBango=10000000003, @failure_reason=0, @shikko=1, @execution_expression=1, @yakujoNichiji=, @torihiki=1, @trade_type=1, @yukoNichiji=, @order_state=10, @chumonRate=120, @rate=120.0, @yakujoRate=, @henkoTorikeshiKano=1, @agreement_date=, @date=2007-05-29T13:17:00Z, @enable_change_or_cancel=true, @yukoKigen=0

--- list_open_interests
@suryo=10000, @tategyokuBango=10000000001, @tsukaPair=, @hyokaRate=121.09, @currency_pair_code=1, @baibai=0, @chumonKano=1, @tategyokuRate=121.15, @yakujoNichiji=2007-05-29T13:17:00Z, @hyokaSoneki=-600, @chumonSuryo=0, @ruikeiSwap=1404

--- list_execution_results
@yakujoSuryo=100000, @tsukaPair=, @currency_pair_code=1, @kessaiSoneki=-14000, @baibai=1, @kessaiTaisho=10000000001, @chumonBango=10000000003, @tategyokuRate=121.7, @tesuryo=0, @yakujoNichiji=2007-05-29T13:17:00Z, @torihiki=1, @ukewatashibi=2007-05-31T00:00:00Z, @yakujoRate=121.56, @ruikeiSwap=0
@yakujoSuryo=100000, @tsukaPair=, @currency_pair_code=1, @kessaiSoneki=-14000, @baibai=1, @kessaiTaisho=10000000001, @chumonBango=10000000003, @tategyokuRate=121.7, @tesuryo=0, @yakujoNichiji=2007-05-29T13:17:00Z, @torihiki=1, @ukewatashibi=2007-05-31T00:00:00Z, @yakujoRate=121.56, @ruikeiSwap=0

--- get_margin
@settlement_profit_or_loss_of_next_business_day=0, @kessaiSonekiT2=0, @yoryoku=7733760, @appraisal_profit_or_loss_of_open_interest=-290000, @genkinZandaka=9251160, @freezed_guarantee_money=1211600, @transferable_money_amount=7733760, @hitsuyoShokokin=1211600, @shokokinIjiritsu=738.3, @settlement_profit_or_loss_of_today=0, @kessaiSonekiT1=0, @guarantee_money_list=@guarantee_money=12116, @tsukaPairCode=1, @currency_pair_code=1, @torihikiShokokin=12116@guarantee_money=16261, @tsukaPairCode=2, @currency_pair_code=2, @torihikiShokokin=16261@guarantee_money=24063, @tsukaPairCode=3, @currency_pair_code=3, @torihikiShokokin=24063@guarantee_money=9929, @tsukaPairCode=4, @currency_pair_code=4, @torihikiShokokin=9929@guarantee_money=8794, @tsukaPairCode=5, @currency_pair_code=5, @torihikiShokokin=8794@guarantee_money=11175, @tsukaPairCode=6, @currency_pair_code=6, @torihikiShokokin=11175@guarantee_money=9865, @tsukaPairCode=7, @currency_pair_code=7, @torihikiShokokin=9865@guarantee_money=16930, @tsukaPairCode=8, @currency_pair_code=8, @torihikiShokokin=16930@guarantee_money=16259, @tsukaPairCode=9, @currency_pair_code=9, @torihikiShokokin=16259@guarantee_money=24062, @tsukaPairCode=10, @currency_pair_code=10, @torihikiShokokin=24062@guarantee_money=9918, @tsukaPairCode=11, @currency_pair_code=11, @torihikiShokokin=9918@guarantee_money=16259, @tsukaPairCode=12, @currency_pair_code=12, @torihikiShokokin=16259@guarantee_money=24058, @tsukaPairCode=13, @currency_pair_code=13, @torihikiShokokin=24058@guarantee_money=12110, @tsukaPairCode=14, @currency_pair_code=14, @torihikiShokokin=12110, @market_value=8945360, @kozaZandaka=9235360, @swap_profit_or_loss=-15800, @margin=7733760, @kosokuShokokin=1211600, @shokokinStatus=1, @balance_of_cach=9251160, @kessaiSonekiT=0, @ordered_guarantee_money=0, @guarantee_money_maintenance_ratio=738.3, @torihikiShokokinList=
    , @tategyokuHyokaSoneki=-290000, @settlement_profit_or_loss_of_next_next_business_day=0, @swapSoneki=-15800, @furikaeKano=7733760, @balance_in_account=9235360, @shimegoFurikae=0, @required_guarantee_money=1211600, @guarantee_money_status=1, @chumonShokokin=0, @jikaHyokaSogaku=8945360

--- list_messages
@riyo=0, @text=お知らせ内容の本文です。, @title=2007年05月18日(金)お知らせ内容のタイトル, @taishosha=1

あとがき

先週、

注文時のレスポンスが固定で注文番号が0固定・・なのはいいんだけど、それを指定して注文キャンセルや注文変更を行うと「不正な注文番号」のエラーになる。

とか書きましたが、クライアント側のレスポンス解析コードのバグでした。申し訳ありません。ローカルサーバーからはちゃんと有効な注文番号が返されてきます。