Class: SBIClient::FX::FxSession
- Inherits:
-
Object
- Object
- SBIClient::FX::FxSession
- Defined in:
- lib/sbiclient.rb
Overview
FX取引のためのセッションクラス
Client#fx_sessionのブロックの引数として渡されます。詳細はClient#fx_sessionを参照ください。
Instance Method Summary collapse
-
#cancel_order(order_no) ⇒ Object
注文をキャンセルします。.
-
#initialize(client, order_password, top_page, options = {}) ⇒ FxSession
constructor
A new instance of FxSession.
-
#list_orders ⇒ Object
注文一覧を取得します。.
-
#list_positions ⇒ Object
建玉一覧を取得します。.
-
#list_rates ⇒ Object
レート一覧を取得します。.
-
#list_swaps ⇒ Object
スワップの一覧を取得します。.
-
#logout ⇒ Object
ログアウトします。.
-
#order(currency_pair_code, sell_or_buy, unit, options = {}) ⇒ Object
注文を行います。.
-
#settle(position_id, count) ⇒ Object
成り行きで決済注文を行います。.
Constructor Details
#initialize(client, order_password, top_page, options = {}) ⇒ FxSession
Returns a new instance of FxSession.
203 204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/sbiclient.rb', line 203 def initialize( client, order_password, top_page, ={} ) @client = client @order_password = order_password @options = # FXのトップ画面へ form = top_page.forms.first form.product_group = "sbi_fx_alpha" result = @client.submit(form, form..first) SBIClient::Client.error(result) unless result.content.toutf8 =~ /SBI FX α/ @links = result.links end |
Instance Method Details
#cancel_order(order_no) ⇒ Object
注文をキャンセルします。
- order_no
-
注文番号
- 戻り値
-
なし
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 |
# File 'lib/sbiclient.rb', line 498 def cancel_order( order_no ) raise "order_no is nil." unless order_no # 注文一覧 link = nil each_order_page {|result| SBIClient::Client.error( result ) if result.links.empty? # 対象となる注文をクリック link = result.links.find {|l| l.href =~ /[^"]*Id=([\d]+)[^"]*/ && $1 == order_no } link != nil } raise "illegal order_no. order_no=#{order_no}" unless link result = @client.click(link) SBIClient::Client.error( result ) if result.forms.empty? # キャンセル form = result.forms.first form.("tkF").each{|b| b.check if b.value == "kesi" } result = @client.submit(form) SBIClient::Client.error( result ) unless result.body.toutf8 =~ /注文確認/ form = result.forms.first form.ToriPs = @order_password result = @client.submit(form, form..find {|b| b.value=="注文取消" }) SBIClient::Client.error( result ) unless result.body.toutf8 =~ /取消を受付致しました/ end |
#list_orders ⇒ Object
注文一覧を取得します。
- 戻り値
-
注文番号をキーとするClickClientScrap::FX::Orderのハッシュ。
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 |
# File 'lib/sbiclient.rb', line 248 def list_orders( ) tmp = {} each_order_page {|result| list = result.body.toutf8.scan( /<A href="[^"]*&meigaraId=([a-zA-Z0-9\/]*)[^"]*">[^<]*<\/A>\s*<BR>\s*受付時間:<BR>\s*([^<]*)<BR>\s*注文パターン:([^<]+)<BR>\s*([^<]+)<BR>\s*注文番号:(\d+)<BR>\s*注文価格:([^<]+)<BR>(?:\s*トレール幅:([^<]*)<BR>)?\s*約定価格:([^<]*)<BR>\s*数量\(未約定\):<BR>\s*(\d+)\(\d+\)単位<BR>\s*発注状況:([^<]*)<BR>/) list.each {|i| pair = to_pair( i[0] ) order_type = to_order_type_code(i[2]) trade_type = i[3] =~ /^新規.*/ ? SBIClient::FX::TRADE_TYPE_NEW : SBIClient::FX::TRADE_TYPE_SETTLEMENT sell_or_buy = i[3] =~ /.*売\/.*/ ? SBIClient::FX::SELL : SBIClient::FX::BUY execution_expression = if i[3] =~ /.*\/指値/ SBIClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER elsif i[3] =~ /.*\/逆指値/ SBIClient::FX::EXECUTION_EXPRESSION_REVERSE_LIMIT_ORDER else SBIClient::FX::EXECUTION_EXPRESSION_MARKET_ORDER end order_no = i[4] rate = i[5].to_f trail_range = i[6].to_f if i[6] count = i[8].to_i tmp[order_no] = Order.new( order_no, trade_type, order_type, execution_expression, sell_or_buy, pair, count, rate, trail_range, i[9]) } false } return tmp end |
#list_positions ⇒ Object
建玉一覧を取得します。
- 戻り値
-
建玉IDをキーとするSBIClient::FX::Positionのハッシュ。
535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 |
# File 'lib/sbiclient.rb', line 535 def list_positions result = link_click( "6" ) result = link_click( "2", result.links ) tmp = {} each_page( result ) {|res| links = res.links.find_all {|l| l.href =~ /[^"]syoukai\/syoukaiTatigyoku.aspx\?[^"]*/ } links.each {|link| re = @client.click( link ) each_page( re ) {|r| positions = r.body.toutf8.scan(/\<A HREF="[^"]*&urikai=([^"&]*)&[^"]*meigaraId=([^"&]*)&[^"]*tId=([^"&]*)[^"]*">\s*([\/\s\:\d]*)<\/A>\s*<BR>\s*数量[^>]*>\s*(\d+)\((\d*)\)[^\:]*\:\s*([\d\.]+)<BR>[^>]*>[^>]*>([\d\+\-\.\,]+)</) positions.each {|i| sell_or_buy = i[0] == "1" ? SBIClient::FX::SELL : SBIClient::FX::BUY pair = to_pair( i[1] ) position_id = "#{i[0]}_#{pair}_#{i[2]}" date = DateTime.parse(i[3], "%Y/%m/%d %H:%M:%S") count = i[4].to_i rate = i[6].to_f profit_or_loss = i[7].gsub(/[\+\,]/, "").to_i tmp[position_id] = Position.new(position_id, pair, sell_or_buy, count, rate, profit_or_loss, date ) } false } } false } return tmp end |
#list_rates ⇒ Object
レート一覧を取得します。
- 戻り値
-
通貨ペアをキーとするSBIClient::FX::Rateのハッシュ。
219 220 221 222 223 224 225 226 227 228 229 230 231 |
# File 'lib/sbiclient.rb', line 219 def list_rates #スワップの定期取得 if !@last_update_time_of_swaps \ || Time.now.to_i - @last_update_time_of_swaps > (@options[:swap_update_interval] || 60*60) @swaps = list_swaps @last_update_time_of_swaps = Time.now.to_i end rates = {} each_rate_page {|page| collect_rate( page, rates ) } return rates end |
#list_swaps ⇒ Object
スワップの一覧を取得します。
- 戻り値
-
通貨ペアをキーとするSBIClient::FX::Swapのハッシュ。
236 237 238 239 240 241 242 |
# File 'lib/sbiclient.rb', line 236 def list_swaps swap = {} each_rate_page {|page| collect_swap( page, swap ) } return swap end |
#logout ⇒ Object
ログアウトします。
567 568 569 |
# File 'lib/sbiclient.rb', line 567 def logout link_click( "*" ) end |
#order(currency_pair_code, sell_or_buy, unit, options = {}) ⇒ Object
注文を行います。
- currency_pair_code
-
通貨ペアコード(必須)
- sell_or_buy
-
売買区分。SBIClient::FX::BUY,SBIClient::FX::SELLのいずれかを指定します。(必須)
- unit
-
取引数量(必須)
- options
-
注文のオプション。注文方法に応じて以下の情報を設定できます。
- <b>成り行き注文</b>※未実装 - なし - <b>通常注文</b> ※注文レートが設定されていれば通常取引となります。 - <tt>:rate</tt> .. 注文レート(必須) - <tt>:execution_expression</tt> .. 執行条件。SBIClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須) - <tt>:expiration_type</tt> .. 有効期限。SBIClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須) - <tt>:expiration_date</tt> .. 有効期限が「日付指定(SBIClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須) - <b>OCO注文</b> ※2つめの取引レートと2つめの取引種別が設定されていればOCO取引となります。 - <tt>:rate</tt> .. 注文レート(必須) - <tt>:execution_expression</tt> .. 執行条件。SBIClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須) - <tt>:second_order_sell_or_buy</tt> .. 2つめの取引種別(必須) ※1つめの取引種別と同じ値にすると2つめの注文は逆指値になります。同じでなければ両者とも指値になります。 - <tt>:second_order_rate</tt> .. 2つめの取引レート(必須) - <tt>:expiration_type</tt> .. 有効期限。SBIClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須) - <tt>:expiration_date</tt> .. 有効期限が「日付指定(SBIClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須) - <b>IFD注文</b> ※決済取引の指定があればIFD取引となります。 - <tt>:rate</tt> .. 注文レート(必須) - <tt>:execution_expression</tt> .. 執行条件。SBIClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須) - <tt>:expiration_type</tt> .. 有効期限。SBIClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須) - <tt>:expiration_date</tt> .. 有効期限が「日付指定(SBIClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須) - <tt>:settle</tt> .. 決済取引の指定。マップで指定します。 - <tt>:rate</tt> .. 決済取引の注文レート(必須) - <tt>:execution_expression</tt> .. 決済取引の執行条件。SBIClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須) - <b>IFD-OCO注文</b> ※決済取引の指定と逆指値レートの指定があればIFD-OCO取引となります。 - <tt>:rate</tt> .. 注文レート(必須) - <tt>:execution_expression</tt> .. 執行条件。SBIClient::FX::EXECUTION_EXPRESSION_LIMIT_ORDER等を指定します(必須) - <tt>:expiration_type</tt> .. 有効期限。SBIClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須) - <tt>:expiration_date</tt> .. 有効期限が「日付指定(SBIClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須) - <tt>:settle</tt> .. 決済取引の指定。マップで指定します。 - <tt>:rate</tt> .. 決済取引の注文レート(必須) - <tt>:stop_order_rate</tt> .. 決済取引の逆指値レート(必須) - <b>トレール注文</b> ※トレール幅の指定があればトレール取引となります。 - <tt>:rate</tt> .. 注文レート(必須) ※他の注文条件と違って<b>執行条件は逆指値で固定</b>です。 - <tt>:expiration_type</tt> .. 有効期限。SBIClient::FX::EXPIRATION_TYPE_TODAY等を指定します(必須) - <tt>:expiration_date</tt> .. 有効期限が「日付指定(SBIClient::FX::EXPIRATION_TYPE_SPECIFIED)」の場合の有効期限をDateで指定します。(有効期限が「日付指定」の場合、必須) - <tt>:trail_range</tt> .. トレール幅(必須)
- 戻り値
-
SBIClient::FX::OrderResult
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 |
# File 'lib/sbiclient.rb', line 321 def order ( currency_pair_code, sell_or_buy, unit, ={} ) # 取り引き種別の判別とパラメータチェック type = ORDER_TYPE_MARKET_ORDER if ( && [:settle] != nil ) if ( [:settle][:stop_order_rate] != nil) # 逆指値レートと決済取引の指定があればIFD-OCO取引 raise "options[:settle][:rate] is required." unless [:settle][:rate] type = ORDER_TYPE_IFD_OCO else # 決済取引の指定のみがあればIFD取引 raise "options[:settle][:rate] is required." unless [:settle][:rate] raise "options[:settle][:execution_expression] is required." unless [:settle][:execution_expression] type = ORDER_TYPE_IFD end raise "options[:rate] is required." unless [:rate] raise "options[:execution_expression] is required." unless [:execution_expression] raise "options[:expiration_type] is required." unless [:expiration_type] elsif ( && [:rate] != nil ) if ( [:second_order_rate] != nil && [:second_order_sell_or_buy] != nil ) # 逆指値レートが指定されていればOCO取引 raise "options[:execution_expression] is required." unless [:execution_expression] type = ORDER_TYPE_OCO elsif ( [:trail_range] != nil ) # トレール幅が指定されていればトレール取引 type = ORDER_TYPE_TRAIL else # そうでなければ通常取引 type = ORDER_TYPE_NORMAL raise "options[:execution_expression] is required." unless [:execution_expression] end raise "options[:expiration_type] is required." unless [:expiration_type] else # 成り行き type = ORDER_TYPE_MARKET_ORDER end #新規注文 result = link_click( "2" ) SBIClient::Client.error( result ) if result.forms.empty? form = result.forms.first form.meigaraId = currency_pair_code.to_s.insert(3, "/").to_sym form.("urikai").each {|b| b.check if b.value == ( sell_or_buy == SBIClient::FX::BUY ? "1" : "-1" ) } # 詳細設定画面へ result = @client.submit(form) SBIClient::Client.error( result ) if result.forms.empty? form = result.forms.first case type when ORDER_TYPE_MARKET_ORDER # 成り行き form.sikkouJyouken = "0" when ORDER_TYPE_NORMAL # 指値 set_expression( form, [:execution_expression] ) set_rate(form, [:rate]) set_expiration( form, ) # 有効期限 when ORDER_TYPE_OCO # OCO form.order = "3" result = @client.submit(form, form..find {|b| b.value=="選択" } ) form = result.forms.first set_expression( form, [:execution_expression] ) set_rate(form, [:rate]) form["urikai2"] = ( [:second_order_sell_or_buy] == SBIClient::FX::BUY ? "1" : "-1" ) result = @client.submit(form, form..find {|b| b.value=="次へ" }) form = result.forms.first SBIClient::Client.error( result ) unless result.body.toutf8 =~ /maisuu/ set_rate(form, [:second_order_rate], "2") set_expiration( form, ) # 有効期限 when ORDER_TYPE_IFD # IFD form.order = "2" result = @client.submit(form, form..find {|b| b.value=="選択" }) form = result.forms.first set_expression( form, [:execution_expression] ) set_rate(form, [:rate], "3") set_expression( form, [:settle][:execution_expression], "sikkouJyouken2" ) set_rate(form, [:settle][:rate], "1") set_expiration( form, ) # 有効期限 when ORDER_TYPE_IFD_OCO form.order = "4" result = @client.submit(form, form..find {|b| b.value=="選択" }) form = result.forms.first set_expression( form, [:execution_expression] ) set_rate(form, [:rate], "3") set_rate(form, [:settle][:rate], "1") set_rate(form, [:settle][:stop_order_rate], "2") set_expiration( form, ) # 有効期限 when ORDER_TYPE_TRAIL form.order = "6" result = @client.submit(form, form..find {|b| b.value=="選択" }) form = result.forms.first set_rate(form, [:rate], "1") set_trail(form, [:trail_range]) set_expiration( form, ) # 有効期限 else raise "unknown order type." end form.maisuu = unit.to_s form["postTorihikiPs"] = @order_password # 確認画面へ result = @client.submit( form, form..find {|b| b.value=="注文確認" } ) SBIClient::Client.error( result ) unless result.body.toutf8 =~ /注文確認/ result = @client.submit(result.forms.first) SBIClient::Client.error( result ) unless result.body.toutf8 =~ /注文番号\:[^\d]+(\d+)/ return OrderResult.new( $1 ) end |
#settle(position_id, count) ⇒ Object
成り行きで決済注文を行います。
- position_id
-
決済する建玉番号
- count
-
取引数量
- 戻り値
-
なし
440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 |
# File 'lib/sbiclient.rb', line 440 def settle ( position_id, count ) result = link_click( "6" ) result = link_click( "2", result.links ) #IDを解析 raise "illegal position_id. position_id=#{position_id}" unless position_id=~ /^(1|\-1)_([A-Z]{3})([A-Z]{3})_(\d*)$/ sell_or_buy = $1 pair = "#{$2}/#{$3}" id = $4 # 建玉一覧 form = result.forms.find{|f| f.name == "orderForm" } SBIClient::Client.error( result ) unless form form.meigaraId = pair result = @client.submit(form) link = result.links.find {|l| l.href =~ /syoukaiTatigyoku.aspx\?.*&urikai=#{sell_or_buy}/ } raise "position not found. position_id=#{position_id} body=#{result.body.toutf8}" unless link result = @client.click(link) # ポジション一覧 link = nil each_page( result ) {|r| link = r.links.find {|l| l.href =~ /syoukaiTatigyoku.aspx\?.*&tId=#{id}/ } link != nil } raise "position not found. position_id=#{position_id} body=#{result.body.toutf8}" unless link result = @client.click(link) form = result.forms.find{|f| f.name == "kessaiForm" } result = @client.submit(form, form..first) SBIClient::Client.error( result ) if result.forms.empty? form = result.forms.first form.sikkouJyouken = "0" form.maisuu = count form["postTorihikiPs"] = @order_password # 確認画面へ result = @client.submit( form, form..find {|b| b.value=="注文確認" } ) SBIClient::Client.error( result ) unless result.body.toutf8 =~ /注文確認/ result = @client.submit(result.forms[1], form..first ) SBIClient::Client.error( result ) unless result.body.toutf8 =~ /注文受付/ end |