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.
Files changed (3) hide show
  1. data/README +2 -0
  2. data/lib/clickclient_scrap.rb +136 -41
  3. metadata +2 -2
data/README CHANGED
@@ -8,7 +8,9 @@
8
8
  - ログイン
9
9
  - ログアウト
10
10
  - レート一覧の取得
11
+ - 注文一覧の取得
11
12
  - 指値注文
13
+ - OCO注文
12
14
 
13
15
  ===注意事項
14
16
  - スクレイピングによるアクセスのため、Webサイトの仕様変更等により
@@ -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
- raise "not supported yet." if type != ORDER_TYPE_NORMAL
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
- form["P003"] = options[:rate].to_s # レート
325
- form["P005"] = unit.to_s # 取り引き数量
326
- form["P002.0"] = sell_or_buy == ClickClient::FX::SELL ? "1" : "0" #売り/買い
327
-
328
- exp = options[:execution_expression]
329
- form["P004.0"] = exp == ClickClient::FX::EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER ? "2" : "1" #指値/逆指値
330
-
331
- # 有効期限
332
- case options[:expiration_type]
333
- when ClickClient::FX::EXPIRATION_TYPE_TODAY
334
- form["P008"] = "0"
335
- when ClickClient::FX::EXPIRATION_TYPE_WEEK_END
336
- form["P008"] = "1"
337
- when ClickClient::FX::EXPIRATION_TYPE_SPECIFIED
338
- form["P008"] = "3"
339
- raise "options[:expiration_date] is required." unless options[:expiration_date]
340
- form["P009.Y"] = options[:expiration_date].year
341
- form["P009.M"] = options[:expiration_date].month
342
- form["P009.D"] = options[:expiration_date].day
343
- form["P009.h"] = options[:expiration_date].respond_to?(:hour) ? options[:expiration_date].hour : "0"
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
- form["P008"] = "2"
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
- private
364
- # "USD/JPY"を:USDJPYのようなシンボルに変換します。
365
- def to_pair( str )
366
- str.gsub( /\//, "" ).to_sym
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.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-02-25 00:00:00 -08:00
12
+ date: 2009-04-08 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15