Bitcoin 裁定取引と自動取引 abitra.netのブログ

Bitcoinの自動売買のあれこれ

ruby seleniumのThread処理のエラー処理方法

自分用メモ

先日紹介したseleniumのThread処理のエラー処理方法。
"ruby seleniumで複数のブラウザで並行処理を行う方法 バイナリーオプションで同時に複数の通貨ペアエントリー"
abitra.hatenablog.com



バイナリーオプションのハイローオーストラリアのサイトは時々思い通りには動かないので注意が必要。
プログラム的には細かくパーツ毎にプログラムを分けて、その分けたパーツ毎にエラー処理をいれるといった方法がいいのかなーと考えています。

Threadのエラー処理は少し注意が必要


初っ端から言い訳ですw
私はガチプログラマーでは御座いませんので今回の方法は最適ではないかもしれませんのでご了承下さいませ。


私はバイナリーオプション(ハイローオーストラリア)のエントリーはThreadを立ち上げて動かしています。
理由は同じ時間足で同時に複数通貨ペアのエントリーがあるので、その対応にって感じです。


バイナリーオプションの自動売買はseleniumで運用しています。
seleniumは時々止まる。。。エラーを起こす。。。
この原因はよく分かりませんがw
対応としてはエラーを起こした場合は再度ブラウザを読み込みを行う。又はエントリー機会を逃したとしてエントリーを諦める。


特にバイナリーオプション及びFXの場合はエントリータイミングを逃すと同じ機会は訪れないのでエラー処理の対応次第でエントリー回数が変わってきます。


例えば "USDJPYでエントリー条件が110円以上で10分後締め" のエントリー条件とした場合。
エラーなどでブラウザが止まったりしても9分間の時間的な余裕があります。
その間にエラー処理して再度ブラウザの更新などすればOK。

9分間のうちに110円以上になればエントリーはいつでもいいのでねー


エラー処理でエントリー出来ない例としてはハイローオーストラリアのターボ取引とかは対応は難しいかもしれないので注意が必要。
エラー処理するとどんなに早くても1-2秒は余計に時間が掛かります。
その間に有利な条件になればいいのですがターボの場合は判断が難しい。


エラー処理 例 beginとretry

基本的にエラーを起こした場合
私はbeginとretryでエラーを処理しています。


※以下コードは全てloop処理で動かしていると考えて下さいませ。


こんな感じ。

def hogehoge
  begin
	#ここに処理をいれる

  rescue #エラーの処理
	#エラーが起きた時
    retry
  end #beginのend
 end

こんな感じでbeginでエントリー処理囲ってしまってretryで処理していました。

Threadの問題点

Threadで立ち上げて処理はjoinしてあげないとThreadでエラーを起こしても無視されてしまいます。
動かし始めはこの処理を知らなかったのでThreadの立ち上げを諦めようかと考えました。
エラー処理しようにもエラーが返ってこないのでretryが出来ない。。。

def hogehoge
  begin
    aiueo =[["aaaa","bbbb"],["cccc", "dddd"]]
    aiueo.count.times do |n|
      t = Thread.new do
          aaa = aiueo[n][1]
          p aaa
      end #thread end
      t.join # ←ここのjoinが重要
    end #count end
  rescue #このメソッドエラーの処理
    retry
  end #beginのend
end


このt.join がないとThreadでエラーを起こしても何もなかった事にされますw


Thread内でbeginのretryをしたらどうなるの?

ではThreadないでbeginとretryをしたらどうなるのか?

def hogehoge
  begin
    aiueo =[["aaaa","bbbb"],["cccc", "dddd"]]
    aiueo.count.times do |n|
      t = Thread.new do
      	begin
          aaa = aiueo[n][1]
        rescue
          retry
        end
      end #thread end
      t.join # ←ここのjoinはいらない
    end #count end
  rescue #このメソッドエラーの処理
    retry
  end #beginのend
end


問題なくretryが動きます。この場合はjoinは不要でThreadが立ち上がっている限り動きます。
ですが個人的には一応joinを入れてエラー処理を二重にしています。


これらの方法がベストかどうなのかは分かりませんが、今の所良い感じ。
気を付ける点としてはスクレイピング時のretryの回数制限。個人的にですが3回以上のretryは止めています。


理由は特にありませんが常にハイローオーストラリアのサイトでretryし続けるはさすがにアレな気がします。
またエラー処理して即retryするのも何となく嫌な気がするのでsleep処理などで1-2秒程時間を開けています。
この辺りは個人的な考えなので気にしなくても良いかもですが、無茶はしない方がいいよって気がします。

焦ってエントリーするよりもエントリー機会はまた訪れると考えてエラー処理からのretryは程ほどに。