unageanu-clickclient_scrap 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +2 -0
- data/lib/clickclient_scrap.rb +136 -41
- metadata +2 -2
data/README
CHANGED
data/lib/clickclient_scrap.rb
CHANGED
@@ -140,13 +140,6 @@ module ClickClient
|
|
140
140
|
ORDER_TYPE_OCO = "21"
|
141
141
|
# 注文タイプ: IFD-OCO
|
142
142
|
ORDER_TYPE_IFD_OCO = "31"
|
143
|
-
|
144
|
-
# 執行条件: 成行
|
145
|
-
EXECUTION_EXPRESSION_MARKET_ORDER = 0
|
146
|
-
# 執行条件: 指値
|
147
|
-
EXECUTION_EXPRESSION_LIMIT_ORDER = 1
|
148
|
-
# 執行条件: 逆指値
|
149
|
-
EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER = 2
|
150
143
|
|
151
144
|
# 有効期限: 当日限り
|
152
145
|
EXPIRATION_TYPE_TODAY = 0
|
@@ -157,6 +150,29 @@ module ClickClient
|
|
157
150
|
# 有効期限: 日付指定
|
158
151
|
EXPIRATION_TYPE_SPECIFIED = 3
|
159
152
|
|
153
|
+
# 注文状況: すべて
|
154
|
+
ORDER_CONDITION_ALL = ""
|
155
|
+
# 注文状況: 注文中
|
156
|
+
ORDER_CONDITION_ON_ORDER = "0"
|
157
|
+
# 注文状況: 取消済
|
158
|
+
ORDER_CONDITION_CANCELED = "1"
|
159
|
+
# 注文状況: 約定
|
160
|
+
ORDER_CONDITION_EXECUTION = "2"
|
161
|
+
# 注文状況: 不成立
|
162
|
+
ORDER_CONDITION_FAILED = "3"
|
163
|
+
|
164
|
+
# トレード種別: 新規
|
165
|
+
TRADE_TYPE_NEW = "新規"
|
166
|
+
# トレード種別: 決済
|
167
|
+
TRADE_TYPE_SETTLEMENT = "決済"
|
168
|
+
|
169
|
+
# 執行条件: 成行
|
170
|
+
EXECUTION_EXPRESSION_MARKET_ORDER = "成行"
|
171
|
+
# 執行条件: 指値
|
172
|
+
EXECUTION_EXPRESSION_LIMIT_ORDER = "指値"
|
173
|
+
# 執行条件: 逆指値
|
174
|
+
EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER = "逆指値"
|
175
|
+
|
160
176
|
#=== FX取引のためのセッションクラス
|
161
177
|
#Client#fx_sessionのブロックの引数として渡されます。詳細はClient#fx_sessionを参照ください。
|
162
178
|
class FxSession
|
@@ -223,8 +239,7 @@ module ClickClient
|
|
223
239
|
#unit:: 取引数量(必須)
|
224
240
|
#options:: 注文のオプション。注文方法に応じて以下の情報を設定できます。
|
225
241
|
# - <b>成り行き注文</b>
|
226
|
-
# - <tt>:slippage</tt> .. スリッページ (オプション)
|
227
|
-
# - <tt>:slippage_base_rate</tt> .. スリッページの基準となる取引レート(スリッページが指定された場合、必須。)
|
242
|
+
# - <tt>:slippage</tt> .. スリッページ (オプション)。何pips以内かを整数で指定します。
|
228
243
|
# - <b>通常注文</b> ※注文レートが設定されていれば通常取引となります。
|
229
244
|
# - <tt>:rate</tt> .. 注文レート(必須)
|
230
245
|
# - <tt>:execution_expression</tt> .. 執行条件。ClickClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須)
|
@@ -265,7 +280,7 @@ module ClickClient
|
|
265
280
|
|
266
281
|
# 取り引き種別の判別とパラメータチェック
|
267
282
|
type = ORDER_TYPE_MARKET_ORDER
|
268
|
-
if ( options[:settle] != nil )
|
283
|
+
if ( options && options[:settle] != nil )
|
269
284
|
if ( options[:settle][:stop_order_rate] != nil)
|
270
285
|
# 逆指値レートと決済取引の指定があればIFD-OCO取引
|
271
286
|
raise "options[:settle][:rate] is required." if options[:settle][:rate] == nil
|
@@ -283,7 +298,7 @@ module ClickClient
|
|
283
298
|
raise "options[:settle][:sell_or_buy] is required." if options[:settle][:sell_or_buy] == nil
|
284
299
|
raise "options[:settle][:unit] is required." if options[:settle][:unit] == nil
|
285
300
|
raise "options[:settle][:expiration_type] is required." if options[:expiration_type] == nil
|
286
|
-
elsif ( options[:rate] != nil )
|
301
|
+
elsif ( options && options[:rate] != nil )
|
287
302
|
if ( options[:stop_order_rate] != nil )
|
288
303
|
# 逆指値レートが指定されていればOCO取引
|
289
304
|
type = ORDER_TYPE_OCO
|
@@ -296,12 +311,8 @@ module ClickClient
|
|
296
311
|
else
|
297
312
|
# 成り行き
|
298
313
|
type = ORDER_TYPE_MARKET_ORDER
|
299
|
-
if ( options[:slippage] != nil )
|
300
|
-
raise "if you use a slippage, options[:slippage_base_rate] is required." if options[:slippage_base_rate] == nil
|
301
|
-
end
|
302
314
|
end
|
303
|
-
|
304
|
-
|
315
|
+
|
305
316
|
# レート一覧
|
306
317
|
result = @client.click( @links.find {|i|
|
307
318
|
i.attributes["accesskey"] == "1"
|
@@ -321,28 +332,29 @@ module ClickClient
|
|
321
332
|
# 詳細設定画面へ
|
322
333
|
result = @client.submit(form)
|
323
334
|
form = result.forms.first
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
335
|
+
case type
|
336
|
+
when ORDER_TYPE_MARKET_ORDER
|
337
|
+
# 成り行き
|
338
|
+
form["P002"] = unit.to_s # 取り引き数量
|
339
|
+
form["P005.0"] = sell_or_buy == ClickClient::FX::SELL ? "1" : "0" #売り/買い
|
340
|
+
form["P007"] = options[:slippage].to_s if ( options && options[:slippage] != nil ) # スリッページ
|
341
|
+
when ORDER_TYPE_NORMAL
|
342
|
+
# 指値
|
343
|
+
form["P003"] = options[:rate].to_s # レート
|
344
|
+
form["P005"] = unit.to_s # 取り引き数量
|
345
|
+
form["P002.0"] = sell_or_buy == ClickClient::FX::SELL ? "1" : "0" #売り/買い
|
346
|
+
exp = options[:execution_expression]
|
347
|
+
form["P004.0"] = exp == ClickClient::FX::EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER ? "2" : "1" #指値/逆指値
|
348
|
+
set_expiration( form, options, "P008", "P009" ) # 有効期限
|
349
|
+
when ORDER_TYPE_OCO
|
350
|
+
# OCO
|
351
|
+
form["P003"] = options[:rate].to_s # レート
|
352
|
+
form["P005"] = options[:stop_order_rate].to_s # 逆指値レート
|
353
|
+
form["P007"] = unit.to_s # 取り引き数量
|
354
|
+
form["P002.0"] = sell_or_buy == ClickClient::FX::SELL ? "1" : "0" #売り/買い
|
355
|
+
set_expiration( form, options, "P010", "P011" ) # 有効期限
|
344
356
|
else
|
345
|
-
|
357
|
+
raise "not supported yet."
|
346
358
|
end
|
347
359
|
|
348
360
|
# 確認画面へ
|
@@ -353,6 +365,68 @@ module ClickClient
|
|
353
365
|
# TODO 結果を返す・・・どうするかな。
|
354
366
|
end
|
355
367
|
|
368
|
+
# 有効期限を設定する
|
369
|
+
#form:: フォーム
|
370
|
+
#options:: パラメータ
|
371
|
+
#input_type:: 有効期限の種別を入力するinput要素名
|
372
|
+
#input_date:: 有効期限が日付指定の場合に、日付を入力するinput要素名
|
373
|
+
def set_expiration( form, options, input_type, input_date )
|
374
|
+
case options[:expiration_type]
|
375
|
+
when ClickClient::FX::EXPIRATION_TYPE_TODAY
|
376
|
+
form[input_type] = "0"
|
377
|
+
when ClickClient::FX::EXPIRATION_TYPE_WEEK_END
|
378
|
+
form[input_type] = "1"
|
379
|
+
when ClickClient::FX::EXPIRATION_TYPE_SPECIFIED
|
380
|
+
form[input_type] = "3"
|
381
|
+
raise "options[:expiration_date] is required." unless options[:expiration_date]
|
382
|
+
form["#{input_date}.Y"] = options[:expiration_date].year
|
383
|
+
form["#{input_date}.M"] = options[:expiration_date].month
|
384
|
+
form["#{input_date}.D"] = options[:expiration_date].day
|
385
|
+
form["#{input_date}.h"] = options[:expiration_date].respond_to?(:hour) ? options[:expiration_date].hour : "0"
|
386
|
+
else
|
387
|
+
form[input_type] = "2"
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
#
|
392
|
+
#=== 注文一覧を取得します。
|
393
|
+
#
|
394
|
+
#order_condition_code:: 注文状況コード(必須)
|
395
|
+
#currency_pair_code:: 通貨ペアコード
|
396
|
+
#戻り値:: 注文番号をキーとするClickClient::FX::Orderのハッシュ。
|
397
|
+
#
|
398
|
+
def list_orders( order_condition_code=ClickClient::FX::ORDER_CONDITION_ALL, currency_pair_code=nil )
|
399
|
+
|
400
|
+
result = @client.click( @links.find {|i|
|
401
|
+
i.attributes["accesskey"] == "2"
|
402
|
+
})
|
403
|
+
form = result.forms.first
|
404
|
+
form["P001"] = "" # TODO currency_pair_codeでの絞り込み
|
405
|
+
form["P002"] = order_condition_code
|
406
|
+
#puts result.body.toutf8
|
407
|
+
list = result.body.toutf8.scan( /<a href="[^"]*GKEY=([a-zA-Z0-9]*)">([A-Z]{3}\/[A-Z]{3}) ([^<]*)<\/a><br>[^;]*;([^<]*)<font[^>]*>([^<]*)<\/font>([^@]*)@([\d\.]*)([^\s]*) ([^<]*)<br>/m )
|
408
|
+
tmp = {}
|
409
|
+
list.each {|i|
|
410
|
+
order_no = i[0]
|
411
|
+
order_type = to_order_type_code(i[2])
|
412
|
+
trade_type = i[3] == "新" ? ClickClient::FX::TRADE_TYPE_NEW : ClickClient::FX::TRADE_TYPE_SETTLEMENT
|
413
|
+
pair = to_pair( i[1] )
|
414
|
+
sell_or_buy = i[4] == "売" ? ClickClient::FX::SELL : ClickClient::FX::BUY
|
415
|
+
count = pair == :ZARJPY ? i[5].to_i/10 : i[5].to_i
|
416
|
+
rate = i[6].to_f
|
417
|
+
execution_expression = if i[7] == "指"
|
418
|
+
ClickClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER
|
419
|
+
elsif i[7] == "逆"
|
420
|
+
ClickClient::FX::EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER
|
421
|
+
else
|
422
|
+
ClickClient::FX::EXECUTION_EXPRESSION_MARKET_ORDER
|
423
|
+
end
|
424
|
+
tmp[order_no] = Order.new( order_no, trade_type, order_type, execution_expression, sell_or_buy, pair, count, rate, i[8])
|
425
|
+
}
|
426
|
+
return tmp
|
427
|
+
end
|
428
|
+
|
429
|
+
|
356
430
|
# ログアウトします。
|
357
431
|
def logout
|
358
432
|
@client.click( @links.find {|i|
|
@@ -360,17 +434,38 @@ module ClickClient
|
|
360
434
|
})
|
361
435
|
end
|
362
436
|
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
437
|
+
private
|
438
|
+
# "USD/JPY"を:USDJPYのようなシンボルに変換します。
|
439
|
+
def to_pair( str )
|
440
|
+
str.gsub( /\//, "" ).to_sym
|
441
|
+
end
|
442
|
+
|
443
|
+
# 注文種別を注文種別コードに変換します。
|
444
|
+
def to_order_type_code( order_type )
|
445
|
+
return case order_type
|
446
|
+
when "成行注文"
|
447
|
+
ClickClient::FX::ORDER_TYPE_MARKET_ORDER
|
448
|
+
when "通常注文"
|
449
|
+
ClickClient::FX::ORDER_TYPE_NORMAL
|
450
|
+
when "OCO注文"
|
451
|
+
ClickClient::FX::ORDER_TYPE_OCO
|
452
|
+
when "IFD注文"
|
453
|
+
ClickClient::FX:: ORDER_TYPE_IFD
|
454
|
+
when "IFD-OCO注文"
|
455
|
+
ClickClient::FX:: ORDER_TYPE_IFD_OCO
|
456
|
+
else
|
457
|
+
raise "illegal order_type. order_type=#{order_type}"
|
367
458
|
end
|
459
|
+
end
|
368
460
|
end
|
369
461
|
|
370
462
|
#=== スワップ
|
371
463
|
Swap = Struct.new(:pair, :sell_swap, :buy_swap)
|
372
464
|
#=== レート
|
373
465
|
Rate = Struct.new(:pair, :bid_rate, :ask_rate, :sell_swap, :buy_swap )
|
466
|
+
#===注文
|
467
|
+
Order = Struct.new(:order_no, :trade_type, :order_type, :execution_expression, :sell_or_buy, :pair, :count, :rate, :order_state )
|
468
|
+
|
374
469
|
end
|
375
470
|
end
|
376
471
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unageanu-clickclient_scrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masaya Yamauchi
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-04-08 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|