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.
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