unageanu-clickclient_scrap 0.1.1 → 0.1.2
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/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
|
|