clickclient_scrap 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/jiji_plugin.rb CHANGED
@@ -8,24 +8,29 @@ require 'thread'
8
8
  class ClickSecuritiesPlugin
9
9
  include JIJI::Plugin::SecuritiesPlugin
10
10
 
11
+ def initialize( demo=false )
12
+ @demo = demo
13
+ end
14
+
11
15
  #プラグインの識別子を返します。
12
16
  def plugin_id
13
- :click_securities
17
+ @demo ? :click_securities_demo : :click_securities
14
18
  end
19
+
15
20
  #プラグインの表示名を返します。
16
21
  def display_name
17
- "CLICK Securities"
22
+ @demo ? "CLICK Securities DEMO" : "CLICK Securities"
18
23
  end
19
24
  #「jiji setting」でユーザーに入力を要求するデータの情報を返します。
20
25
  def input_infos
21
- [ Input.new( :user, "Please input a user name of CLICK Securities.", false, nil ),
22
- Input.new( :password, "Please input a password of CLICK Securities.", true, nil ),
26
+ [ Input.new( :user, "Please input a user name of CLICK Securities#{ @demo ? " DEMO" : "" }.", false, nil ),
27
+ Input.new( :password, "Please input a password of CLICK Securities#{ @demo ? " DEMO" : "" }.", true, nil ),
23
28
  Input.new( :proxy, "Please input a proxy. example: http://example.com:80 (default: nil )", false, nil ) ]
24
29
  end
25
30
 
26
31
  #プラグインを初期化します。
27
32
  def init_plugin( props, logger )
28
- @session = ClickSecuritiesPluginSession.new( props, logger )
33
+ @session = ClickSecuritiesPluginSession.new( props, logger, @demo )
29
34
  end
30
35
  #プラグインを破棄します。
31
36
  def destroy_plugin
@@ -85,10 +90,11 @@ private
85
90
  end
86
91
 
87
92
  class ClickSecuritiesPluginSession
88
- def initialize( props, logger )
93
+ def initialize( props, logger, demo=false )
89
94
  @props = props
90
95
  @logger = logger
91
96
  @m = Mutex.new
97
+ @demo = demo
92
98
  end
93
99
  def method_missing( name, *args )
94
100
  @m.synchronize {
@@ -117,7 +123,7 @@ class ClickSecuritiesPluginSession
117
123
  if @props.key?(:proxy) && @props[:proxy] != nil && @props[:proxy].length > 0
118
124
  proxy = @props[:proxy]
119
125
  end
120
- @client ||= ClickClientScrap::Client.new( proxy )
126
+ @client ||= ClickClientScrap::Client.new( proxy, @demo )
121
127
  @session ||= @client.fx_session( @props[:user], @props[:password] )
122
128
  rescue
123
129
  @logger.error $!
@@ -130,4 +136,7 @@ end
130
136
  JIJI::Plugin.register(
131
137
  JIJI::Plugin::SecuritiesPlugin::FUTURE_NAME,
132
138
  ClickSecuritiesPlugin.new )
133
-
139
+
140
+ JIJI::Plugin.register(
141
+ JIJI::Plugin::SecuritiesPlugin::FUTURE_NAME,
142
+ ClickSecuritiesPlugin.new( true ) )
@@ -0,0 +1,5 @@
1
+
2
+ # ※「../etc」ディレクトリにuser,passファイルを作成し、
3
+ # ユーザー名,パスワードを設定しておくこと。
4
+ USER=IO.read("../etc/user")
5
+ PASS=IO.read("../etc/pass")
@@ -0,0 +1,24 @@
1
+
2
+ $: << "../lib"
3
+
4
+ require 'clickclient_scrap'
5
+ require 'constants'
6
+
7
+ # ログイン
8
+ c = ClickClientScrap::Client.new
9
+ c.fx_session( USER, PASS ) {|session|
10
+
11
+ # 与力を取得
12
+ margin = session.get_margin
13
+ puts <<-STR
14
+ 時価評価の総額 : #{margin.market_value}
15
+ 建玉の評価損益 : #{margin.appraisal_profit_or_loss_of_open_interest}
16
+ 口座残高 : #{margin.balance_in_account}
17
+ 証拠金の維持率 : #{margin.guarantee_money_maintenance_ratio}
18
+ 余力 : #{margin.margin}
19
+ 拘束されている証拠金 : #{margin.freezed_guarantee_money}
20
+ 必要な証拠金 : #{margin.required_guarantee_money}
21
+ 注文中の証拠金 : #{margin.ordered_guarantee_money}
22
+ 振替可能額 : #{margin.transferable_money_amount}
23
+ STR
24
+ }
@@ -0,0 +1,25 @@
1
+
2
+ $: << "../lib"
3
+
4
+ require 'clickclient_scrap'
5
+ require 'constants'
6
+
7
+ # ログイン
8
+ c = ClickClientScrap::Client.new
9
+ c.fx_session( USER, PASS ) {|session|
10
+
11
+ # 建玉一覧を取得
12
+ list = session.list_open_interests
13
+ list.each_pair {|k,v|
14
+ puts <<-STR
15
+ ---
16
+ open_interest_id : #{v.open_interest_id}
17
+ sell_or_buy : #{v.sell_or_buy}
18
+ pair : #{v.pair}
19
+ count : #{v.count}
20
+ rate : #{v.rate}
21
+ profit or loss : #{v.profit_or_loss}
22
+
23
+ STR
24
+ }
25
+ }
@@ -0,0 +1,28 @@
1
+
2
+ $: << "../lib"
3
+
4
+ require 'clickclient_scrap'
5
+ require 'constants'
6
+
7
+ # ログイン
8
+ c = ClickClientScrap::Client.new
9
+ c.fx_session( USER, PASS ) {|session|
10
+
11
+ # 注文一覧を取得
12
+ orders = session.list_orders
13
+ orders.each_pair {|k,v|
14
+ puts <<-STR
15
+ ---
16
+ order_no : #{v.order_no}
17
+ trade_type : #{v.trade_type}
18
+ order_type : #{v.order_type}
19
+ execution_expression : #{v.execution_expression}
20
+ sell_or_buy : #{v.sell_or_buy}
21
+ pair : #{v.pair}
22
+ count : #{v.count}
23
+ rate : #{v.rate}
24
+ order_state : #{v.order_state}
25
+
26
+ STR
27
+ }
28
+ }
@@ -0,0 +1,16 @@
1
+
2
+ $: << "../lib"
3
+
4
+ require 'clickclient_scrap'
5
+ require 'constants'
6
+
7
+ # ログイン
8
+ c = ClickClientScrap::Client.new
9
+ c.fx_session( USER, PASS ) {|session|
10
+
11
+ # レート一覧を取得
12
+ rates = session.list_rates
13
+ rates.each_pair {|k,v|
14
+ puts "#{k} : #{v.bid_rate} : #{v.ask_rate} : #{v.sell_swap} : #{v.buy_swap}"
15
+ }
16
+ }
@@ -0,0 +1,21 @@
1
+
2
+ $: << "../lib"
3
+
4
+ require 'clickclient_scrap'
5
+ require 'constants'
6
+
7
+ # ログイン
8
+ c = ClickClientScrap::Client.new
9
+ c.fx_session( USER, PASS ) {|session|
10
+
11
+ #成り行き注文
12
+ session.order( ClickClientScrap::FX::USDJPY, ClickClientScrap::FX::BUY, 1)
13
+ session.order( ClickClientScrap::FX::USDJPY, ClickClientScrap::FX::SELL, 1)
14
+
15
+ # 建玉一覧を取得
16
+ list = session.list_open_interests
17
+ list.each_pair {|k,v|
18
+ # すべて決済
19
+ session.settle( v.open_interest_id, v.count )
20
+ }
21
+ }
@@ -0,0 +1,36 @@
1
+
2
+ $: << "../lib"
3
+
4
+ require 'clickclient_scrap'
5
+ require 'constants'
6
+
7
+ # ログイン
8
+ c = ClickClientScrap::Client.new
9
+ c.fx_session( USER, PASS ) {|session|
10
+
11
+ # レートを取得
12
+ rates = session.list_rates
13
+ rates.each_pair {|k,v|
14
+ puts "#{k} : #{v.bid_rate} : #{v.ask_rate} : #{v.sell_swap} : #{v.buy_swap}"
15
+ }
16
+
17
+ order_ids = []
18
+
19
+ ##OCO注文
20
+ order_ids << session.order( ClickClientScrap::FX::EURJPY, ClickClientScrap::FX::BUY, 1, {
21
+ :rate=>rates[ClickClientScrap::FX::EURJPY].ask_rate - 0.5, # 指値レート
22
+ :stop_order_rate=>rates[ClickClientScrap::FX::EURJPY].ask_rate + 0.5, # 逆指値レート
23
+ :execution_expression=>ClickClientScrap::FX::EXECUTION_EXPRESSION_LIMIT_ORDER, # 執行条件: 指値
24
+ :expiration_type=>ClickClientScrap::FX::EXPIRATION_TYPE_TODAY # 有効期限: 当日限り
25
+ })
26
+ order_ids << session.order( ClickClientScrap::FX::EURJPY, ClickClientScrap::FX::SELL, 1, {
27
+ :rate=>rates[ClickClientScrap::FX::EURJPY].ask_rate + 0.5, # 指値レート
28
+ :stop_order_rate=>rates[ClickClientScrap::FX::EURJPY].ask_rate - 0.5, # 逆指値レート
29
+ :execution_expression=>ClickClientScrap::FX::EXECUTION_EXPRESSION_LIMIT_ORDER, # 執行条件: 指値
30
+ :expiration_type=>ClickClientScrap::FX::EXPIRATION_TYPE_SPECIFIED, # 有効期限: 指定
31
+ :expiration_date=>Date.today+2 # 2日後
32
+ })
33
+
34
+ # すべての注文をキャンセル
35
+ order_ids.each{|id| session.cancel_order(id.order_no) }
36
+ }
@@ -0,0 +1,64 @@
1
+
2
+ $: << "../lib"
3
+
4
+ require 'clickclient_scrap'
5
+ require 'constants'
6
+
7
+ # ログイン
8
+ c = ClickClientScrap::Client.new
9
+ c.fx_session( USER, PASS ) {|session|
10
+
11
+ # レートを取得
12
+ rates = session.list_rates
13
+ rates.each_pair {|k,v|
14
+ puts "#{k} : #{v.bid_rate} : #{v.ask_rate} : #{v.sell_swap} : #{v.buy_swap}"
15
+ }
16
+
17
+ order_ids = []
18
+
19
+ ## 指値注文
20
+ order_ids << session.order( ClickClientScrap::FX::EURJPY, ClickClientScrap::FX::BUY, 1, {
21
+ :rate=>rates[ClickClientScrap::FX::EURJPY].ask_rate - 0.5, # 指値レート
22
+ :execution_expression=>ClickClientScrap::FX::EXECUTION_EXPRESSION_LIMIT_ORDER, # 執行条件: 指値
23
+ :expiration_type=>ClickClientScrap::FX::EXPIRATION_TYPE_TODAY # 有効期限: 当日限り
24
+ })
25
+ order_ids << session.order( ClickClientScrap::FX::EURJPY, ClickClientScrap::FX::SELL, 1, {
26
+ :rate=>rates[ClickClientScrap::FX::EURJPY].ask_rate + 0.5, # 指値レート
27
+ :execution_expression=>ClickClientScrap::FX::EXECUTION_EXPRESSION_LIMIT_ORDER, # 執行条件: 指値
28
+ :expiration_type=>ClickClientScrap::FX::EXPIRATION_TYPE_WEEK_END # 有効期限: 週末まで
29
+ })
30
+
31
+ # 逆指値注文
32
+ order_ids << session.order( ClickClientScrap::FX::EURJPY, ClickClientScrap::FX::BUY, 1, {
33
+ :rate=>rates[ClickClientScrap::FX::EURJPY].ask_rate + 0.5, # 逆指値レート
34
+ :execution_expression=>ClickClientScrap::FX::EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER, # 執行条件: 逆指値
35
+ :expiration_type=>ClickClientScrap::FX::EXPIRATION_TYPE_INFINITY # 有効期限: 無限
36
+ })
37
+ order_ids << session.order( ClickClientScrap::FX::EURJPY, ClickClientScrap::FX::SELL, 1, {
38
+ :rate=>rates[ClickClientScrap::FX::EURJPY].ask_rate - 0.5, # 逆指値レート
39
+ :execution_expression=>ClickClientScrap::FX::EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER, # 執行条件: 逆指値
40
+ :expiration_type=>ClickClientScrap::FX::EXPIRATION_TYPE_SPECIFIED, # 有効期限: 指定
41
+ :expiration_date=>Date.today+2 # 2日後
42
+ })
43
+
44
+ # 注文一覧を取得
45
+ orders = session.list_orders
46
+ orders.each_pair {|k,v|
47
+ puts <<-STR
48
+ ---
49
+ order_no : #{v.order_no}
50
+ trade_type : #{v.trade_type}
51
+ order_type : #{v.order_type}
52
+ execution_expression : #{v.execution_expression}
53
+ sell_or_buy : #{v.sell_or_buy}
54
+ pair : #{v.pair}
55
+ count : #{v.count}
56
+ rate : #{v.rate}
57
+ order_state : #{v.order_state}
58
+
59
+ STR
60
+ }
61
+
62
+ # すべての注文をキャンセル
63
+ order_ids.each{|id| session.cancel_order(id.order_no) }
64
+ }
@@ -0,0 +1,18 @@
1
+
2
+ $: << "../lib"
3
+
4
+ require 'clickclient_scrap'
5
+ require 'constants'
6
+
7
+ # ログイン
8
+ c = ClickClientScrap::Client.new
9
+ c.fx_session( USER, PASS ) {|session|
10
+
11
+ # 建玉一覧を取得
12
+ list = session.list_open_interests
13
+ list.each_pair {|k,v|
14
+ # すべて決済
15
+ session.settle( v.open_interest_id, v.count )
16
+ }
17
+
18
+ }
@@ -0,0 +1,43 @@
1
+ $: << "../lib"
2
+
3
+ require 'clickclient_scrap'
4
+ require 'common'
5
+
6
+ describe "cancel_order" do
7
+ include TestBase
8
+
9
+ it "複数のページがあってもキャンセルできる" do
10
+ do_test {|s|
11
+ 10.times{|i|
12
+ @order_ids << @s.order( ClickClientScrap::FX::USDJPY, ClickClientScrap::FX::BUY, 1, {
13
+ :rate=>@rates[ClickClientScrap::FX::USDJPY].ask_rate - 0.5,
14
+ :execution_expression=>ClickClientScrap::FX::EXECUTION_EXPRESSION_LIMIT_ORDER,
15
+ :expiration_type=>ClickClientScrap::FX::EXPIRATION_TYPE_TODAY
16
+ })
17
+ }
18
+ 10.times{|i|
19
+ @order_ids << @s.order( ClickClientScrap::FX::EURJPY, ClickClientScrap::FX::BUY, 1, {
20
+ :rate=>@rates[ClickClientScrap::FX::EURJPY].ask_rate - 0.5,
21
+ :stop_order_rate=>@rates[ClickClientScrap::FX::EURJPY].ask_rate + 0.5,
22
+ :expiration_type=>ClickClientScrap::FX::EXPIRATION_TYPE_TODAY
23
+ })
24
+ }
25
+
26
+ # 末尾から消していき、すべて削除できればOK。
27
+ @order_ids.reverse.each {|id|
28
+ @s.cancel_order(id.order_no)
29
+ @order_ids.pop
30
+ }
31
+ @s.list_orders(ClickClientScrap::FX::ORDER_CONDITION_ON_ORDER).size.should == 0
32
+ }
33
+ end
34
+
35
+ it "削除対象が存在しない" do
36
+ do_test {|s|
37
+ proc {
38
+ @s.cancel_order("not found")
39
+ }.should raise_error( RuntimeError, "illegal order_no. order_no=not found" )
40
+ }
41
+ end
42
+
43
+ end
data/specs/common.rb ADDED
@@ -0,0 +1,30 @@
1
+
2
+ # ※「../etc」ディレクトリにuser,passファイルを作成し、
3
+ # ユーザー名,パスワードを設定しておくこと。
4
+ USER=IO.read("../etc/user")
5
+ PASS=IO.read("../etc/pass")
6
+ DEMO_USER=IO.read("../etc/demo_user")
7
+ DEMO_PASS=IO.read("../etc/demo_pass")
8
+
9
+
10
+ # ベース
11
+ module TestBase
12
+ # 通常/デモのそれぞれのセッションでブロックを実行する。
13
+ def do_test
14
+ [{:c=>ClickClientScrap::Client.new, :p=>PASS, :u=>USER },
15
+ {:c=>ClickClientScrap::Client.new(nil, true), :p=>DEMO_PASS, :u=>DEMO_USER }].each {|i|
16
+ @s = i[:c].fx_session( i[:u], i[:p] )
17
+ @rates = @s.list_rates
18
+ @order_ids = []
19
+ begin
20
+ yield @s
21
+ ensure
22
+ begin
23
+ @order_ids.each {|order| @s.cancel_order(order.order_no) } if @s
24
+ ensure
25
+ @s.logout if @s
26
+ end
27
+ end
28
+ }
29
+ end
30
+ end
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $: << "../lib"
4
+
5
+ require "rubygems"
6
+ require "logger"
7
+ require 'clickclient_scrap'
8
+ require "common"
9
+ require 'jiji/plugin/plugin_loader'
10
+ require 'jiji/plugin/securities_plugin'
11
+
12
+ # jijiプラグインのテスト
13
+ # ※実際に取引を行うので注意!
14
+ describe "market order" do
15
+ before(:all) {
16
+ # ロード
17
+ JIJI::Plugin::Loader.new.load
18
+ @logger = Logger.new STDOUT
19
+ }
20
+ it "jiji pluginのテスト(DEMO)" do
21
+ plugins = JIJI::Plugin.get( JIJI::Plugin::SecuritiesPlugin::FUTURE_NAME )
22
+ plugin = plugins.find {|i| i.plugin_id == :click_securities_demo }
23
+
24
+ plugin.should_not be_nil
25
+ plugin.display_name.should == "CLICK Securities DEMO"
26
+
27
+ begin
28
+ plugin.init_plugin( {:user=>DEMO_USER, :password=>DEMO_PASS}, @logger )
29
+
30
+ # 利用可能な通貨ペア一覧とレート
31
+ pairs = plugin.list_pairs
32
+ rates = plugin.list_rates
33
+ pairs.each {|p|
34
+ # 利用可能とされたペアのレートが取得できていることを確認
35
+ p.name.should_not be_nil
36
+ p.trade_unit.should_not be_nil
37
+ rates[p.name].should_not be_nil
38
+ rates[p.name].bid.should_not be_nil
39
+ rates[p.name].ask.should_not be_nil
40
+ rates[p.name].sell_swap.should_not be_nil
41
+ rates[p.name].buy_swap.should_not be_nil
42
+ }
43
+ sleep 1
44
+
45
+ 3.times {
46
+ rates = plugin.list_rates
47
+ pairs.each {|p|
48
+ # 利用可能とされたペアのレートが取得できていることを確認
49
+ p.name.should_not be_nil
50
+ p.trade_unit.should_not be_nil
51
+ rates[p.name].should_not be_nil
52
+ rates[p.name].bid.should_not be_nil
53
+ rates[p.name].ask.should_not be_nil
54
+ rates[p.name].sell_swap.should_not be_nil
55
+ rates[p.name].buy_swap.should_not be_nil
56
+ }
57
+ sleep 3
58
+ }
59
+
60
+ # 売り/買い
61
+ sell = plugin.order( :EURJPY, :sell, 1 )
62
+ buy = plugin.order( :EURJPY, :buy, 1 )
63
+ sell.position_id.should_not be_nil
64
+ buy.position_id.should_not be_nil
65
+
66
+ # 約定
67
+ plugin.commit sell.position_id, 1
68
+ plugin.commit buy.position_id, 1
69
+ ensure
70
+ plugin.destroy_plugin
71
+ end
72
+ end
73
+
74
+ it "jiji pluginのテスト" do
75
+ plugins = JIJI::Plugin.get( JIJI::Plugin::SecuritiesPlugin::FUTURE_NAME )
76
+ plugin = plugins.find {|i| i.plugin_id == :click_securities }
77
+
78
+ plugin.should_not be_nil
79
+ plugin.display_name.should == "CLICK Securities"
80
+
81
+ begin
82
+ plugin.init_plugin( {:user=>USER, :password=>PASS}, @logger )
83
+
84
+ # 利用可能な通貨ペア一覧とレート
85
+ pairs = plugin.list_pairs
86
+ rates = plugin.list_rates
87
+ pairs.each {|p|
88
+ # 利用可能とされたペアのレートが取得できていることを確認
89
+ p.name.should_not be_nil
90
+ p.trade_unit.should_not be_nil
91
+ rates[p.name].should_not be_nil
92
+ rates[p.name].bid.should_not be_nil
93
+ rates[p.name].ask.should_not be_nil
94
+ rates[p.name].sell_swap.should_not be_nil
95
+ rates[p.name].buy_swap.should_not be_nil
96
+ }
97
+ sleep 1
98
+
99
+ 3.times {
100
+ rates = plugin.list_rates
101
+ pairs.each {|p|
102
+ # 利用可能とされたペアのレートが取得できていることを確認
103
+ p.name.should_not be_nil
104
+ p.trade_unit.should_not be_nil
105
+ rates[p.name].should_not be_nil
106
+ rates[p.name].bid.should_not be_nil
107
+ rates[p.name].ask.should_not be_nil
108
+ rates[p.name].sell_swap.should_not be_nil
109
+ rates[p.name].buy_swap.should_not be_nil
110
+ }
111
+ sleep 3
112
+ }
113
+
114
+ # 売り/買い
115
+ sell = plugin.order( :EURJPY, :sell, 1 )
116
+ buy = plugin.order( :EURJPY, :buy, 1 )
117
+ sell.position_id.should_not be_nil
118
+ buy.position_id.should_not be_nil
119
+
120
+ # 約定
121
+ plugin.commit sell.position_id, 1
122
+ plugin.commit buy.position_id, 1
123
+ ensure
124
+ plugin.destroy_plugin
125
+ end
126
+ end
127
+ end