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

Bitcoinの自動売買のあれこれ

MT4 ストラテジーテスターのビジュアルモードのバックテストの高速化(バイナリーオプションのバックテスト検証)

本記事はバックテストの高速化のみの内容です。バイナリーの手法などは記載していません。

■本題
過去2回程バイナリーオプションのバックテストについて書いており、ビジュアルモードを使わない高速化についても書いてきましたが先日メチャ簡単な方法で高速(爆速)でビジュアルモードでのバックテストが出来る事を発見しました。
といいますか今まで気が付いていなかったのが本当に悔しい。
過去の"バイナリーオプション(ハイローオーストラリア)をMT4でバックテストする方法 その2"にて高速化の記事を書きましたがこんな面倒な事をしなくてもOK。
abitra.hatenablog.com



今回の方法は1分足でも早いです。


■バックテスト高速化の方法(ビジュアルモード)
ストラテジーテスターでビジュアルモードにチェックをして動かしてMT4アプリを最小化にする。

f:id:hogehoge_kato:20190624022646p:plain

または

f:id:hogehoge_kato:20190624022658p:plain

これだけ。

今までビジュアルモードでバックテストをしていた時は別の作業をしてバックテストが終わるのを待っていました。
終了までのバーを眺めて。


私は基本的にどんなアプリも最小化する事がないのですが、なんかのタイミングで最小化して放置していたら予定の時間よりも早く終わっていることに気が付きました。
最小化しているので終わっているタイミングが分からないので個人的な感覚ですが2-3時間掛かるバックテストが10-20分もあれば終了しています!! マジで速い。

ビジュアルモードでバックテストを行わないといけない人は是非一度騙されたと思って最小化して放置してみてください。ビックリしますよw
もしかしたら私だけ知らなかった説もあり、一人で興奮していますw


■まとめ
MT4のチャートの描写(過去の足の状況やら矢印やら)の影響が大きいんだろうなーと改めて感じました。
※例えば過去5年のバックテストを行った場合1-2年は爆速で終了しますが3年目以降はバックテストのスピードが落ちます。
今までもバックテスト中はローソク足の表示はやめたりインジゲーターは入れない様にしていましたが、一番の方法はMT4を画面に表示させない事なんだなーと。


↑これを書いてて思いましたが自動売買で動かしているMT4も画面表示させているけど本当は最小化して動かした方が高速に動くのかな。

バイナリーオプション(ハイローオーストラリア)をMT4でバックテストする方法 その2

先日紹介した方法ではストラテジーテスターでビジュアルモードを利用してCSVに書き込みエクセルで検証といった感じですが、今回はビジュアルモードを使わずに高速でバイナリーオプションのバックテスト検証の方法の案内。

先日の記事
abitra.hatenablog.com


今回の方法は一般的ではない+こんな方法しなくてもいいんじゃないか疑惑ですのでご了承下さいませ。
色々手間が発生するので正直おすすめ出来ないです。
1分足のバックテストはビジュアルモードを利用しないので爆速ですがw


■検証を行うにあたって
MQL4だけでは完結しません。rubyを利用しています。

1分足の検証などは圧倒的に早いのですが、5分以上になると手間とか考えると今までと同じ様なビジュアルモードで動かした方がいいかなーと。



■ビジュアルモードなしでバイナリーオプションのバックテストを行う方法(本題)

●重要
エントリーは注文内容によって把握します。


注文内容の前提を以下に定義します。

Highエントリーの場合の注文内容は"buy"
勝ちはlotを0.01
負けはlotを0.02
コマはlotを0.03(0.02でもいいかも)

Lowエントリーの場合の注文内容は"sell"
勝ちはlotを0.01
負けはlotを0.02
コマはlotを0.03(0.02でもいいかも)

この方法で注文して"結果"からコピーしてCSV保存して集計するといった感じです。
勘の良い方であれば上記定義でやってる事が分かるかと考えます。


残高は気にしません。
エントリーの注文内容が全てそれ以外は気にしなくてもいいです。
※lot数を1とかにしちゃうと残高不足でバックテストが途中で終わる可能性があるので最小の0.01にて。


参考までに前足が陽線陰線で注文を変えるソースで説明。
※勝ち負けはランダムです。

int start()
  {  
    int     StopLoss    = 20;
    int     TakeProfit  = 20;
    int     order_m_number = 99999;

    static datetime time111 = Time[0];
    if(Time[0] != time111) // 一回だけの処理
    {
      time111 = Time[0];
      int num = MathRand() % 2;  // 0 から 1
      if (Open[1] < Close[1]) // 陽線
      {
        if (num == 0) {// 勝ち lot を0.01に
          OrderSend( Symbol(), OP_SELL, 0.01, Bid, 30, Bid+(StopLoss*Point), Bid-(TakeProfit*Point), NULL, order_m_number, 0, clrDeepPink );
        } else if (num == 1) {// 負け lot を0.02
          OrderSend( Symbol(), OP_SELL, 0.02, Bid, 30, Bid+(StopLoss*Point), Bid-(TakeProfit*Point), NULL, order_m_number, 0, clrDeepPink );
        }        
      }
      else if (Open[1] > Close[1]) // 陰線
      {     
        if (num == 0) {// 勝ち lot を0.01に
          OrderSend( Symbol(), OP_BUY, 0.01, Ask, 30, Ask-(StopLoss*Point), Ask+(TakeProfit*Point), NULL, order_m_number, 0, clrDeepPink );
        } else if (num == 1) {// 負け lot を0.02
          OrderSend( Symbol(), OP_BUY, 0.02, Ask, 30, Ask-(StopLoss*Point), Ask+(TakeProfit*Point), NULL, order_m_number, 0, clrDeepPink );
        } 
      }
      else if (Open[1] == Close[1]) // コマ
      {
        OrderSend( Symbol(), OP_BUY, 0.03, Ask, 30, Ask-(StopLoss*Point), Ask+(TakeProfit*Point), NULL, order_m_number, 0, clrDeepPink );
      }
        
    }

    
    return(0);
  }


↑を動かすと注文され"結果"に注文履歴が表示されます。

結果の箇所で右クリックして"すべてコピー"を選択。

f:id:hogehoge_kato:20190618044430p:plain


テキストエディタにコピーしてCSVで保存。

f:id:hogehoge_kato:20190618044454p:plain


このままだと決済のデータが入っていたり日本時間ではないので管理しにくかったり余計な指値の金額など入っているので扱いやすいデータに精製してCSVに再出力します。

f:id:hogehoge_kato:20190618044508p:plain

精製はrubyを利用しています。
※夏時間の計算もしています。

require 'json'
require 'csv'
require 'time'

@csv_file_path = "C:/Users/xxxxxx/test_data/test_data.csv" # 保存したcsvのファイルパス

def summertime(csv_time)
  csv_time = Time.parse(csv_time)
  @time_x = 25200 # 冬時間
  if Time.parse("2005.3.13") <= csv_time && csv_time <= Time.parse("2005.11.6")    
    @time_x = 21600 # 夏時間
  elsif Time.parse("2006.3.12") <= csv_time && csv_time <= Time.parse("2006.11.5") 
    @time_x = 21600
  elsif Time.parse("2007.3.11") <= csv_time && csv_time <= Time.parse("2007.11.4")
      @time_x = 21600
  elsif Time.parse("2008.3.9")  <= csv_time && csv_time <= Time.parse("2008.11.2")
      @time_x = 21600
  elsif Time.parse("2009.3.8")  <= csv_time && csv_time <= Time.parse("2009.11.1")
      @time_x = 21600
  elsif Time.parse("2010.3.14") <= csv_time && csv_time <= Time.parse("2010.11.7")
      @time_x = 21600
  elsif Time.parse("2011.3.13") <= csv_time && csv_time <= Time.parse("2011.11.6")
      @time_x = 21600
  elsif Time.parse("2012.3.11") <= csv_time && csv_time <= Time.parse("2012.11.4")
      @time_x = 21600
  elsif Time.parse("2013.3.10") <= csv_time && csv_time <= Time.parse("2013.11.3")
      @time_x = 21600
  elsif Time.parse("2014.3.9")  <= csv_time && csv_time <= Time.parse("2014.11.2")
      @time_x = 21600
  elsif Time.parse("2015.3.8")  <= csv_time && csv_time <= Time.parse("2015.11.1")
      @time_x = 21600
  elsif Time.parse("2016.3.13") <= csv_time && csv_time <= Time.parse("2016.11.6")
      @time_x = 21600
  elsif Time.parse("2017.3.12") <= csv_time && csv_time <= Time.parse("2017.11.5")
      @time_x = 21600
  elsif Time.parse("2018.3.11") <= csv_time && csv_time <= Time.parse("2018.11.4")
      @time_x = 21600
  elsif Time.parse("2019.3.10") <= csv_time && csv_time <= Time.parse("2019.11.3")
      @time_x = 21600
  elsif Time.parse("2020.3.8")  <= csv_time && csv_time <= Time.parse("2020.11.1")
      @time_x = 21600
  elsif Time.parse("2021.3.14") <= csv_time && csv_time <= Time.parse("2021.11.7")
      @time_x = 21600
  elsif Time.parse("2022.3.13") <= csv_time && csv_time <= Time.parse("2022.11.6")
      @time_x = 21600
  elsif Time.parse("2023.3.12") <= csv_time && csv_time <= Time.parse("2023.11.5")
      @time_x = 21600
  elsif Time.parse("2024.3.10") <= csv_time && csv_time <= Time.parse("2024.11.3")
      @time_x = 21600
  elsif Time.parse("2025.3.9")  <= csv_time && csv_time <= Time.parse("2025.11.2")
      @time_x = 21600
  elsif Time.parse("2026.3.8")  <= csv_time && csv_time <= Time.parse("2026.11.1")
      @time_x = 21600
  elsif Time.parse("2027.3.14") <= csv_time && csv_time <= Time.parse("2027.11.7")
      @time_x = 21600
  elsif Time.parse("2028.3.12") <= csv_time && csv_time <= Time.parse("2028.11.5")
      @time_x = 21600
  elsif Time.parse("2029.3.11") <= csv_time && csv_time <= Time.parse("2029.11.4")
      @time_x = 21600
  elsif Time.parse("2030.3.10") <= csv_time && csv_time <= Time.parse("2030.11.3")
      @time_x = 21600
  elsif Time.parse("2031.3.9")  <= csv_time && csv_time <= Time.parse("2031.11.2")
      @time_x = 21600
  elsif Time.parse("2032.3.14") <= csv_time && csv_time <= Time.parse("2032.11.7")
      @time_x = 21600
  elsif Time.parse("2033.3.13") <= csv_time && csv_time <= Time.parse("2033.11.6")
      @time_x = 21600
  elsif Time.parse("2034.3.12") <= csv_time && csv_time <= Time.parse("2034.11.5")
      @time_x = 21600
  elsif Time.parse("2035.3.11") <= csv_time && csv_time <= Time.parse("2035.11.4")
      @time_x = 21600
  elsif Time.parse("2036.3.9")  <= csv_time && csv_time <= Time.parse("2036.11.2")
      @time_x = 21600
  elsif Time.parse("2037.3.8")  <= csv_time && csv_time <= Time.parse("2037.11.1")
      @time_x = 21600
  elsif Time.parse("2038.3.14") <= csv_time && csv_time <= Time.parse("2038.11.7")
      @time_x = 21600
  end
end #summertime end


def refining #CSVの精製
  new_data = []
  CSV.foreach(@csv_file_path).each_with_index do |row, i| # mt4のバックデータ読み込み処理
    array = []
    if row[0].include?("buy")
        row = row[0].gsub!(/\t/, ',').split(',')
        summertime(row[1]) # 夏時間検証
        array << Time.parse(row[1]) + @time_x
        array << "high"
        if row[4] == "0.01"     #0.01は勝ち
            array << "win"
        elsif row[4] == "0.02"  # 0.02は負け
            array << "lose"
        elsif row[4] == "0.03"  #コマ
            array << "lose"
        end
        new_data << array
    elsif row[0].include?("sell")
        row = row[0].gsub!(/\t/, ',').split(',')
        summertime(row[1])
        array << Time.parse(row[1]) + @time_x
        array << "low"
        if row[4] == "0.01"     #0.01は勝ち
            array << "win"
        elsif row[4] == "0.02"  # 0.02は負け
            array << "lose"
        elsif row[4] == "0.03"  #コマ
            array << "lose"
        end
        new_data << array
    end
  end #CSV.foreach end
 

  CSV.open("refined.csv","wb") do |csv| #精製したデータの書き込み処理
    new_data.each do |csvArray|
      csv << csvArray
    end
  end

end

refining


f:id:hogehoge_kato:20190618044615p:plain

コマは負けにしています。



精製した後のcsvデータはエクセル(google スプレッドシート)などで自由に検証してやれば完了。

f:id:hogehoge_kato:20190618044630p:plain




■懸念点
途中で面倒になったのでプログラム書いていませんが、注文時間とエントリー時間は1足分ズレているのでそれを考慮してやる必要があります。ruby プログラムで修正してやればいいかなーと。

勝敗しか取得できないので値幅など取得したい他のデータなどが取得出来ません。注文のコメントが使えればなー
何かほかに良い方法がありそうだけど。。。うーん。とりまビジュアルモードを利用しなでもバイナリーオプションのバックテスト(過去検証)出来たって事で。

バイナリーオプション(ハイローオーストラリア)をMT4でバックテストする方法 その1

バイナリーオプション(ハイローオーストラリア)でバックテスト(過去検証)をする際、私はMT4を利用しています。

■ 検証方法流れ
1. 新しいロジックを思いつくと簡単にですが手動でラインや矢印など引いてみてイケてるか確認します。
参考としてZigzag(ジグザグ)とFibonacci(フィボナッチ)のV計算のバイナリーオプションの検証にて。

f:id:hogehoge_kato:20190617113222p:plain

2. MQL4で1のロジックを構築(インジケーター)

f:id:hogehoge_kato:20190617113234p:plain

3. 2のロジックをストラテジーテスターで動かし矢印、エントリー内容、CSV保存など行う。

f:id:hogehoge_kato:20190617114623p:plain

f:id:hogehoge_kato:20190617113250p:plain

4. CSVをエクセルなどで展開して集計と検証を行う。

f:id:hogehoge_kato:20190617113306p:plain

簡単に書くとこんな感じでしょうか。
実際MT4を利用したバイナリーオプションのバックテスト方法としてはストラテジーテスターでインジゲーターを設定して動かす感じです。

ストラテジーテスターでインジゲーターを動かすとこんな感じです。

f:id:hogehoge_kato:20190617120217g:plain


分かりにくいと思いますがジグザクの頂点にフィボナッチを引いて特定のフィボナッチ値にタッチでエントリーした場合のバックテストです。
矢印、エントリー価格、勝敗、CSVでのエントリーデータ保存を行っています。


■検証など
私の場合はHighの勝率とLowの勝率、時間帯の勝率、エントリー値を各時間足で検証しています。
下記の様なバイナリーオプション用のバックテスト解析ツールも利用しようかと考えたのですがHighとLow毎の勝率がなかったり、ちょっとした事が出来ない可能性があるので結局エクセル(googleスプレッドシート)で行っています。


バイナリーオプションシグナルバックテスト解析ツール BOAnalyzer
www.gogojungle.co.jp


↑利用していませんが、これが悪いとかではありません。
私の検証したい事と会わなかっただけです。例えば曜日別損益データは素晴らしいなーと考えています。



■ 備考
ストラテジーテスターで動かすコツとしてビジュアルモードで動かす。
正確にはコツではなく仕様上(ビジュアルモードにしないとエントリーのCSV保存が出来ない。) によるもの。

f:id:hogehoge_kato:20190617114539p:plain
エキスパートアドバイザは何も記載していない空のEAを利用。その他ローソク足の表示などもビジュアルモードでは動きが遅くなるので使わない。



■ここから 次回ブログ予告

で、ここまで書いてておもったのですがビジュアルモードを利用しないでバイナリーオプションのバックテストを行えないか考えました。
方法としてはエキスパートアドバイザの注文を利用して何とかならないかなー的な。

と言うのも先日2009年~2018年のバイナリーオプションの1分足のバックテスト行ったのですがビジュアルモードだとめちゃくちゃ時間が掛かる。(1分足だから余計にね。)
あるロジックで2014年~2018年のデータが良かったので2009年からも一応調べておくかーの流れ。

最初は注文のコメントにカンマ区切りでデータ入れて注文履歴からデータをコピーすればイケるんじゃね?と考えたのですがダメでしたw
バックテストの結果では注文内容しかデータ取れません。

もしうまくいったら次回ブログにその方法書きます!!失敗したらこの予告は忘れて下さい。
注文方法と注文ロットをコントロールすればイケる気がする。気がするだけ。(ブログ執筆現在2019年6月17日まだテストしていません)

もしビジュアルモード以外でバイナリーオプションのバックテスト検証している方いれば是非ご教授下さいませ。
おねしゃす!!

****************************

追記 2019年6月19日

ビジュアルモードなしでもバイナリーオプションのバックテストを行えました。
若干無理やりですのであまり参考にならないかもですが。。。 よろしければどうぞー
abitra.hatenablog.com

****************************

Tick Data Suite(TDS)の買取型ライセンス購入イカ!!

先日ブログで書いたTDS(Tick Data Suite)のLifetime package (買取型ライセンス)を購入しました。


MT4 1分足のモデリング品質を25%=>99.9%にする方法
abitra.hatenablog.com



最初は毎月又は年単位のライセンスでもいいかなーとも考えましたが数年単位で考えると買取ライセンスかなーって。

話はズレますが個人的な感覚ですが仕事道具などに関する事では10万円以下は何も考えずに買っちゃった方がいい気がする。
特に時間短縮できそうなガジェット&ツール系。(と言いつつ実際は悩むんですけどねw)


購入先は以下URLから行いました。
Tick Data Suite 日本語版発売キャンペーン!【期間限定】
https://www.eaika.tokyo/entry/2019/05/23/222922www.eaika.tokyo



■購入方法の詳細

購入するパッケージを選択

f:id:hogehoge_kato:20190613160319p:plain


必要情報などを入力。
この時にクーポンコードの入力を忘れずに!! 忘れると割引出来ないですw

f:id:hogehoge_kato:20190613160343p:plain


購入完了するとメールアドレスに注文の詳細とライセンスキーが届きます。

購入完了画面
f:id:hogehoge_kato:20190613160504p:plain

ライセンスキーの案内メール
f:id:hogehoge_kato:20190613160526p:plain



通常の人はライセンスキーと同時にアプリをダウンロード出来るのでダウンロードしてライセンスキーを入力して利用開始かと考えます。
私の場合はトライアルを利用していたので一旦"TDSサービスを停止"を選択する必要があります。(これしないと購入したラインセンスキーを入力(更新)できませんでした。)

f:id:hogehoge_kato:20190613160603p:plain



一旦TDS落として、再度立ち上げて購入したライセンスキーを入力して更新。
ライセンス状況が有効を確認。

f:id:hogehoge_kato:20190613161014p:plain

購入したライセンスキー入力後

f:id:hogehoge_kato:20190613160620p:plain


データがダウンロード出来るか確認。


f:id:hogehoge_kato:20190613160644p:plain



ありがとうイカさん。
f:id:hogehoge_kato:20190613162012j:plain

FX ドテン君 フォワードテスト 2019年6月11日の直近状況

自分用メモ
4時間足は安定して利益が出ている。
1時間足はマイナス。

f:id:hogehoge_kato:20190611143405p:plain

4時間足は利益が出てるといっても満足の出来る結果とは違うかな。

両足共に1週間ほどはレンジで大きなトレンドは出ていないのでジワジワと資産を減らしていくので我慢のしどころかなーと。

■本番運用への思考
レンジと判断したら裁量で決済していくのも良い気がする。ただその方向性だと目指している投資スタイルとは違うので出来る限り裁量は行わない方向を検討。

エントリーのタイミングは自動でいい所でエントリー出来ている。

現状のドテン狙いだと利益取れる所で取れていない。対策としては裁量決済又は自動売買であればトレール幅での決済かな。

出来る限り人の手を介さないで運用したいのが第一条件なのでトレール幅を検討してもいいかも。
ただその場合は利益を最大化出来ない可能性もあるのでバックテストで検証。

現状4-5通貨を同時で運用しているが1-2通貨にしてLotを上げる戦略もいいかもしれない。

とりま今はテストなので我慢我慢。


今週は"短期ボラティリティに基づくオープニング・レンジ・ブレイクアウト"のEAを作成してみる予定。
係数はとりま1.6にて。
過去足は5足
時間足は1時間足、4時間足
通貨はUSDJPY
調整は最適化にて様子を見ていければなーと。

ドテン君と似たロジックなのでレンジへの対策をどうすればいいのか考えないとです。

バイナリーオプション(ハイローオーストラリア)で自動売買(Selenium)ツール作成の方法 その2

バイナリーオプション(ハイローオーストラリア)で自動売買(Selenium)ツール作成の方法 その2



前回(バイナリーオプション(Highlow オーストラリア)で自動売買(Selenium)のやり方 その1 - Bitcoin 裁定取引と自動取引 abitra.netのブログ)で環境設定が出来たかと思いますので、今回は簡単なロジックでハイローオーストラリアで自動売買を行うプログラムを作成したいと考えます。
※MT4との連携は今回は行いません。もしMT4との連携した自動売買システム作成を希望する方はコメントにご連絡下さいませー有効なロジックであれば無料で検証及び自動売買まで作成しちゃいます。


予め説明すると今回の私が提供するロジックをお勧めしてはいません。
個人的にマーチンを利用する方法はいずれ破綻する可能性を含んでいると考えますので。
今回ブログ作成にあたり分かりやすいかなーって事で構築します。

マーチンを完全否定もできないのですが資金管理をしっかり出来る方でないとダメかと。


■作成内容
Seleniumを利用してハイローオーストラリアで自動売買を行います。

■ロジック
1) ランダムで1000円でエントリー
2) 勝ったらOK
3) 負けたらマーチン 1000円=>2000円=>4000円=>8000円=>16000円=>32000円=>64000円=>128000円

これを繰り返すロジックです。

※今回は検証しませんが複利を効かせたいのであれば勝った時は2回目は1回目の利益を乗せてエントリーすると良いかも。
※倍率2倍以上でないと高回数になるとマーチン成立がしないのですが今回は無視でw

■エントリー足
1分のターボ

■エントリー通貨ペア
GBPJPY

USDJPYでもいいですがGBPJPYの方が値動き激しい気がするので何となく今回はGBPJPYを設定。
理由としては引き分け負けなので値動き激しい方が引き分けになる確率が低いんじゃないかなーって感じ
(実際引き分け率などを検証しないと何ともです。MT4のバックテストでM1のコマ数を検証すればある程度分かるかもですが今回は気にせず感覚で通貨ペアを設定)

■口座
デモ口座

■その他、備考
本ソースには取引時間処理、その他ペア選択、エントリー時間確認、エラー処理、取引ログ保存、取引通知(メール送信)などは含めていませんのでご了承下さいませ。(自身のプログラムであれば入れるのですが書きだすと長くなるのでブログ用に今回は端折ってます。)
一応それっぽくプログラム書いていますが私自身ガチのプログラマーでは御座いませんしプログラム制作会社等で働いた事がないので変なロジックや糞プログラムになっている可能性が高いのでご了承下さいませ。(独学で誰にもソースコードを見てもらった事が無いので正直メッチャ自信ないですw)


ソースコードの流れ
1) トップページから"クイックデモ"選択
f:id:hogehoge_kato:20190610154308p:plain

2) キャッシュバックの案内の取引を始める選択

f:id:hogehoge_kato:20190610154321p:plain

3) Turbo選択
4) GBP/JPYを選択

f:id:hogehoge_kato:20190610154335p:plain


5) エントリー金額入力
6) ランダムでHigh 又は Low を選択
7) 今すぐ購入選択

f:id:hogehoge_kato:20190610154409p:plain

8) 勝ったか負けたかを口座残高から判断

f:id:hogehoge_kato:20190610154423p:plain

9) 5~8を繰り返す

こんな感じかな。


以下rubyソースコード 2019年6月10日現在デモ口座での動作は確認出来ています。
ハイローオーストラリアは時々ソースコードを変更してくるので今後も以下コードが動くなどの保証は出来ませんのでご了承下さいませ。
上記にも書いていますがブログ用にエラー処理などは入れていませんが何も問題なければ動き続けてくれると思いますw

もしここはこうした方が良いなどあればコメント下さいませ。あくまで参考コードなので。。。一応うまくいくと利益出るかもしれませんw

一応私が動かした感じだと1時間で約10000円程の利益が出ています。運が良かった可能性大なので期待はしない方が良いですかねー


require 'selenium-webdriver'

def high_low_purchase(driver, wait, high_low_xxx, entry_price)
    if high_low_xxx == "high"
      puts "Highを選択, エントリープライスは #{entry_price}"
      driver.find_element(:xpath, "//input[@class='number-only eng first-child last-child']").clear # 金額を数値を消す 
      driver.find_element(:xpath, "//input[@class='number-only eng first-child last-child']").send_keys(entry_price) # 金額を入力
      driver.find_element(:xpath, "//div[@id='up_button']").click #Highを選択
      driver.find_element(:xpath, "//a[@class='invest investNow_disabled button']").click #購入クリック
    elsif high_low_xxx == "low"
      puts "Lowを選択, エントリープライスは #{entry_price}"
      driver.find_element(:xpath, "//input[@class='number-only eng first-child last-child']").clear # 金額を数値を消す
      driver.find_element(:xpath, "//input[@class='number-only eng first-child last-child']").send_keys(entry_price) # 金額を入力 
      driver.find_element(:xpath, "//div[@id='down_button']").click #Lowを選択
      driver.find_element(:xpath, "//a[@class='invest investNow_disabled button']").click #購入クリック
    end
end



def scraping
  url = 'https://jp.trade.highlow.net/' #デモ
  driver = Selenium::WebDriver.for :firefox# ブラウザ起動
  wait = Selenium::WebDriver::Wait.new(timeout: 1000)
  driver.navigate.to url
  puts "サイトにアクセス開始"
  driver.manage.timeouts.implicit_wait = 1000
  puts "======スクレイピング開始======#{Time.now.strftime("%Y-%m-%d %H:%M:%S")}======"
  puts "デモクリック"
  wait.until { driver.find_element(:xpath, "//a[@class='highlight hidden-xs outlineNone']").displayed? } #要素の確認
  driver.find_element(:xpath, "//a[@class='highlight hidden-xs outlineNone']").click #demoをクリック
  puts "取引を始めるをクリック"
  wait.until { driver.find_element(:xpath, "//a[@class='exit-onboarding btn btn-default btn-extruded last-child']").displayed? } #要素の確認
  driver.find_element(:xpath, "//a[@class='exit-onboarding btn btn-default btn-extruded last-child']").click#取引を始めるのクリック
  puts "Turboタグをクリック"
  sleep(1)
  wait.until { driver.find_element(:xpath, "//*[@id='assetsGameTypeZoneRegion']/ul/li[3]").displayed? }
  driver.find_element(:xpath, "//*[@id='assetsGameTypeZoneRegion']/ul/li[3]").click #turboのタブをクリック
  puts "1分足をクリック"
  wait.until { driver.find_element(:xpath, "//*[@id='assetsCategoryFilterZoneRegion']/div/div[3]").displayed? }
  driver.find_element(:xpath, "//*[@id='assetsCategoryFilterZoneRegion']/div/div[3]").click#1分足のタブをクリック


  puts "全ての資産タブをクリック"
  wait.until { driver.find_element(:xpath, "//div[@id='highlow-asset-filter']").displayed? }
  driver.find_element(:xpath, "//div[@id='highlow-asset-filter']").click#全ての資産タブを選択
  puts "GBP/JPYの通貨ペアを入力して選択"
  wait.until { driver.find_element(:xpath, "//*[@id='searchBox']").displayed? }
  driver.find_element(:xpath, "//*[@id='searchBox']").send_keys("GBP/JPY")
  wait.until { driver.find_element(:xpath, "//*[@id='assetsFilteredList']/div").displayed? }
  driver.find_element(:xpath, "//*[@id='assetsFilteredList']/div").click

  martin = 1 #初期のマーチン設定

  loop do #取引を常に行う
    #残高確認
    wait.until { driver.find_element(:xpath, "//span[@class='balance-display balanceValue balanceArea last-child']").displayed? }
    zandaka1 = driver.find_element(:xpath, "//span[@class='balance-display balanceValue balanceArea last-child']").text
    zandaka2 = driver.find_element(:xpath, "//span[@class='cashback-balance balance-display last-child']").text
    if zandaka2.empty?
      zandaka_x = zandaka1.delete("¥").delete(",").to_i
    else
      zandaka_x = zandaka1.delete("¥").delete(",").to_i + zandaka2.delete("¥").delete(",").to_i
    end

    high_low_xxx = ["high", "low"].sample #ランダムでhigh or lowを返す
    # エントリー金額の設定
    if martin == 1
      entry_price = 1000
    elsif martin >= 129 #8回以上のマーチンは20万円のエントリー金額を超えるのでまた1000円からやり直し 
      entry_price = 1000
    else
      entry_price = 1000 * martin
    end 

    high_low_purchase(driver, wait, high_low_xxx, entry_price) # エントリー
    sleep(80) #エントリー結果の確認待ち時間

    #残高確認
    zandaka1 = driver.find_element(:xpath, "//span[@class='balance-display balanceValue balanceArea last-child']").text
    zandaka2 = driver.find_element(:xpath, "//span[@class='cashback-balance balance-display last-child']").text
    if zandaka2.empty?
      puts "現在の口座残高 : " + zandaka1.to_s
      zandaka_y = zandaka1.delete("¥").delete(",").to_i
    else
      puts "現在の口座残高 : " + zandaka1.to_s + "  キャッシュバック金額 : " + zandaka2.to_s
      zandaka_y = zandaka1.delete("¥").delete(",").to_i + zandaka2.delete("¥").delete(",").to_i
    end

    #マーチン設定など
    if zandaka_x < zandaka_y
      martin = 1
      puts "勝ち!! うほー今夜は焼肉だ!!"
    elsif zandaka_x == zandaka_y #エントリー出来ていない場合は何もしない。
    else
      martin = martin * 2
      puts "負け くそー次はマーチンで倍掛けだ!!"
    end
  end

end # scraping end

scraping


f:id:hogehoge_kato:20190610155102p:plain


f:id:hogehoge_kato:20190610155111p:plain


f:id:hogehoge_kato:20190610155120p:plain



私自身が実践で投入するかといわれると少し修正(エントリーのタイミングなど修正)してしばらくデモ口座で回してみて判断します。
テクニカル、ファンダメンタルズをガン無視したランダムでのエントリーなので良くも悪くも運が大きく、その運をマーチンでカバーしている感じかな。

■懸念点
このままで動かす事はないのですが、もしデモ口座で良い感じ成果が出てリアル口座で動かそうとなった時の懸念点など。
1) 取引回数クソ多い問題。
単純にですが15時間動かすとして80秒間隔でエントリーしていると約675回/日エントリーする事になりますwこれはさすがにやり過ぎかなーと。

2) マーチン前提なのでいつか連続9回負けの可能性があり、その時は今までの利益でカバー出来るか分かりません。しかもそれは連続で起こる可能性もあり。

3) そもそも自動売買はハイローオーストラリにとってNG行為なのでバレる可能性あり。エントリーが高頻度だと余計に。。。(個人的に垢バンは利益額とは考えますが)


■対策など
いくつか思いつきますが、ここらへんはノウハウになってくるので機会があればーでw

■自動売買ツールについて
上記コードでの不具合や損失などの保証は出来ませんのでご理解の上ご利用下さいませ。

またこんなロジックあるんだけど自動売買出来ない?などご質問あればお気軽にコメント下さいませー一緒に儲けましょう!!w

バイナリーオプション(Highlow オーストラリア)で自動売買(Selenium)のやり方 その1

自分用メモ

新しいパソコン購入したのでプログラムの環境構築やらを色々しており、ついでにハイローオーストラリアの自動売買のやり方のご紹介。
あくまで私の方法であってこの方法が完璧ではないと考えます。(もっとクールなやり方あれば教えて下さい。)

※MT4のシグナルの配信との組み合わせアレコレは別途時間があれば書くかも、今回はハイローオーストラリアの自動売買のやり方。

■対象の方
ハイローオーストラリアの自動売買を構築したい人
MT4などでシグナルは出せるんだけどバイナリーの注文は手動の人


■プログラム経験など
少しは必要ですが基礎的な知識があれば大丈夫かと考えます。


■どんな事が出来る。
ブラウザ操作の殆どは可能かと考えます。
googleの認証などが出来ませが。。。(一応突破する方法もあるのですがお金が掛かります。)


■使用するプログラムや環境など
Windows (本当はMacの方が良いのですがMT4などwindowsがメインなので今回はwindowsで)
Ruby ロジックのプログラム
Selenium ブラウザを操作するプログラム
Chrome ブラウザ
Firefox ブラウザ
Chrome又はFirefoxどちらでもいいです。

私の場合は普段のブラウザはChromeなのでSeleniumFirefoxにしています。
違いは特になく好みの問題かと。
firefoxの方は直近のバージョンで大きく仕様が変わったりしている様なので時期(バージョン)によっては躓く可能性が高い。又は前のバージョンを落としてくるなど手間が発生する可能性が高い。
一旦環境構築して動く様になればバージョンを上げなければ問題ないかと。

1. ブラウザのダウンロード
 Chrome又はFirefoxのブラウザをダウンロードしてインストール。

Chrome
https://www.google.com/intl/ja/chrome/

Firefox
https://www.mozilla.org/ja/firefox/new/

2, Ruby のダウンロード

RubyとDevkitをダウンロード
https://rubyinstaller.org/downloads/

バージョンは2.5.5(x64)
PCによってはx86
Devkitが必要になるので一緒にダウンロードできるRuby+Devkit 2.5.5-1 (x64) でいいかなーと。

f:id:hogehoge_kato:20190610013811p:plain


3. Rubyのインストール
Rubyをダウンロードすると "rubyinstaller-devkit-2.5.5-1-x64.exe" があると思うのでインストール。

インストール完了後にコマンドプロンプトを起動して


C:\Users>ruby -v

Rubyがインストールされているか確認。
こんな感じだとOK。

f:id:hogehoge_kato:20190610013831p:plain


4. selenium webdriverのインストール

コマンドプロンプトで以下を入力


gem install selenium-webdriver


ファイヤーウォールでブロックなんちゃら出る場合もあるが、アクセスを許可するでOK
しばらくするとコマンドプロンプトに色々ダウンロードされている様な文字がでるので完了まで待つ。

最後に x(数値) gems installed と表示されると完了。

確認でコマンドプロンプトで "gem list"でselenium webdriverが入っているか確認。


f:id:hogehoge_kato:20190610013904p:plain

↑インストールされている事が確認できればOK



5-1. ChromeDriverのインストール(Chromeの場合)
https://sites.google.com/a/chromium.org/chromedriver/downloads

5-2. Geckodriverのインストール(Firefoxの場合)
https://github.com/mozilla/geckodriver/releases

自身で使用するブラウザによってChromeDriver又はGeckodriverをダウンロードおよびインストールする。

今回はChromeをご案内 Chromeのバージョン: 75.0.3770.80だったのでChromeDriverも75を選択してダウンロード。

f:id:hogehoge_kato:20190610013930p:plain

f:id:hogehoge_kato:20190610013945p:plain

f:id:hogehoge_kato:20190610013955p:plain


ダウンロードしたzipを解凍してchromedriver.exeがあるのでC:\Ruby23\binにコピペ。

Geckodriverの場合も同じでダウンロードしてruby/binに解凍したのをコピペ。

f:id:hogehoge_kato:20190610014014p:plain

これで基本的な準備は完了。

6. seleniumが使えるか確認

require 'selenium-webdriver'

def test 
  url = 'https://env.b4iine.net/' #デモ

  driver = Selenium::WebDriver.for :chrome # ブラウザ起動
  # driver = Selenium::WebDriver.for :firefox # ブラウザ起動 fifefoxの場合はこちらを利用
  wait = Selenium::WebDriver::Wait.new(timeout: 100)
  driver.navigate.to url
  puts "サイトにアクセス開始"
  driver.manage.timeouts.implicit_wait = 100
  ip_x = driver.find_element(:xpath, "/html/body/div[1]/div[3]/div[2]/p[2]/span").text
  useragent = driver.find_element(:xpath, "/html/body/div[1]/div[3]/div[11]/p[2]").text
  
  puts ip_x
  puts useragent
  puts "20秒待機"
  sleep(20)
  puts "ブラウザ落とす"
  driver.quit

end

test

上記コードをselenium_test.rbで保存してコマンドプロンプトで実行


ruby selenium_test.rb

こんな感じでブラウザが立ち上がるのであれば成功。
サイトアクセス先はIPなどを確認するサイトです。
そのサイトにアクセスして自身のIPとUser agentを取得してコマンドプロンプトに表示させます。
20秒間ブラウザを立ち上げて自動的に閉じます。

Seleniumを利用してサイトにアクセスした場合は”Chromeは自動テストソフトウェアによって制御されています。”と表示されます。
f:id:hogehoge_kato:20190610014611p:plain

コマンドプロンプトに自身のIP情報など表示されます。
f:id:hogehoge_kato:20190610014632p:plain


seleniumを利用せずに自身でサイトにアクセスすると何も表示されません。

f:id:hogehoge_kato:20190610014622p:plain


上記プログラムが動作すればハイローオーストラリアの自動売買の下準備完了。

次回実際にハイローオーストラリアの自動売買(selenium)を実際に動かしていきたいと思います。(デモ口座でね。)


****************************

追記 2019年6月11日
ハイローオーストラリア用の自動売買のサンプルプログラム作成しましたので宜しければどうぞー

バイナリーオプション(ハイローオーストラリア)で自動売買(Selenium)ツール作成の方法 その2
abitra.hatenablog.com

****************************