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

Bitcoinの自動売買のあれこれ

TMシグナルインジケーターの全通貨バックテスト検証及び評価レビューなど その2 それと5分足次足の○○秒前測定

前回はUSDJPYの1通貨のバックテストを行いましたが他の通貨のヒストリカルデータのダウンロードも完了したので全ての通貨をバックテスト。


"TMシグナルインジケーターのバックテスト検証及び評価など バイナリーオプション用"
abitra.hatenablog.com




TMシグナルインジケーターの全16通貨のバックテスト及び検証が完了しました。
全てMT4でバックテストで行ったので時間が掛かりました。。。期間は2014年から約5年程なのですがMomentをtrueとfalseに設定しての検証なので同じ通貨を2回検証してといった感じ。

条件など

通貨ペア : EURJPY,EURUSD,AUDJPY,AUDUSD,AUDNZD,CADJPY,USDCAD,NZDUSD,CHFJPY,USDCHF,EURAUD,GBPJPY,GBPUSD,EURGBP,GBPAUD
時間 M5(5分足)
ヒストリカルデータ Dukascopy
期間 2014/1/1 - 2018/12/30 5年程
Moment false, true


バックテストのデータは適当に時期をみて公開しようかな。
簡単に結果を伝えておくと時間帯などきちんと考慮して運用出来ればいい結果です。
※時間帯は考慮しなくてもある程度良い結果になるますが市場の特性などを考えて時間帯をみるとより良い結果になります。(まぁあたりまえかw)
Momentはtrueの方が成果が良いです。


ますますロジックが気になります。
今回改めて感じたのはMT4だとバックテストの時間が掛かるので5分足以上バックテストはエクセル又はスプレッドシートにて検証した方がいいのかな。
即エントリーのターボだとMT4になりますがそれ以外はエクセルの方が複数の条件を一括でバックテスト出来ていいかも。
PCのコア数もMT4だと生かせていない問題もあるし。。。

TMシグナルインジゲータの運用について

現在デモ取引で自動売買のテストを行っています。
Momentはtrueにて運用。
そこでMomentをtrueにして問題になってくるのがアラートが出ても一瞬だけ矢印とアラートが出てすぐに消える問題。
Momentをfalseにしておくと確定してのアラートなので消える問題は気にしなくてもいいのですがね。


裁量で行っているのであれば消える問題は関係ないです。
目視で確認すればいいのでw


自動売買の場合は矢印が表示されているのかどうなのかをエントリー直前で判断しておかないといけません。
私は足の終わる15秒前に矢印があるかどうかを判断しています。

○○秒前に矢印の有無を判定するmql4プログラム

例 5分足で15秒前の場合。

int remaining_time = 0;
int start(){
	remaining_time = (Time[0]+1*Period()*60 - TimeCurrent());
	if ( remaining_time < 15) {
	 // ここに足が終わる15秒以内で行う処理
	 // iCustomでTMシグナルインジゲータを読み込み。
	}
}


たったこれだけです。


※ 注意 正確には15秒前でないのでご了承下さいませ。インジゲータで動かしているのでティックデータでのカウントになり深夜帯などティックデータの更新が少ない場合は10秒前になったりしてズレます。
startは価格更新がトリガーで動くので価格更新がないと動かないのが理由です。
正確に計るのであればsleepを使えるエキスパートアドバイザで測定した方がいいのかな(エキスパートアドバイザで試していないので想像で書いてます。)

説明

何をやっているのか説明すると、Time[0]+1*Period()*60 で次足の時間を計算させてます。
その計算させた時刻(TimeCurrent())から現在の時刻を引いてます。



ポイントは int remaining_time で intにしています。これしておかなと時刻が返ってくるので面倒。intだと数値(秒)。
でremaining_timeが15未満の時にTMシグナルインジゲータを読み込んで矢印があるか判定。


まとめ

とりま動かして様子をみる。
今の所利益がプラス。まぁ2-3カ月様子を見て判断出来ればいいかなーと。

TMシグナルインジケーターのバックテスト検証及び評価など バイナリーオプション用

先日ブログで案内した記事の続編
"勝率65.83%のバイナリーオプションツールのバックテスト"

abitra.hatenablog.com


上記で案内したインジゲータは無料バージョンとなり谷あきら氏のライン登録で無料でもらえます。
その際行ったバックテストの結果が良い感じだったのでずーっと気になっていました。


で先日有料版を購入しました!! シグナルインジゲーターの中では高額な部類かな。6万ちょい。
有料で谷あきら氏が提供しているインジゲータの名前は"TMシグナルインジケーター"になります。

改めて説明するとTMシグナルインジケーターはバイナリーオプション用(ハイローオーストラリア)のシグナルインジゲーターとなります。
エントリーのタイミングで矢印とアラート表示とメール通知がされます。

お断りと感謝

本記事は自身で行ったバックテストの結果となります。

TMシグナルインジケーターを購入すると会員サービスを利用出来る様になりますが、本記事では一切会員サイト内の情報等は記載しておりません。
もし会員サイト内の情報等が本記事で記載されている場合はコメントでご連絡下さいませ修正します。


本記事でTMシグナルインジケーターの提供及びソースコードの開示等、会員サイトを脅かす又は不利益を与えるものではありません。


谷氏には事前に自身で行ったバックテストの結果をブログ等で案内する旨の連絡をさせて頂いております。
また今後の成果やリアルタイムエントリーなどの公開の許可も頂いております。
本当に感謝いたします。

本記事は私の環境での結果となり成果及び信頼を保証するものでは御座いません。

谷氏もyoutube動画で自身でバックテストを行う重要性を説いており、その行動の一つとお考え下さいませ。

バックテストの内容及び検証方法

会員サイト内の情報は公開出来ないためTMシグナルインジケーターの販売ページに記載されている情報のみでご案内となります。

バイナリーオプション用(ハイローオーストラリア)の検証なのでHigh又はLowのエントリーで勝ちか負けかを判断します。

バックテストの条件

通貨ペア : USDJPY
時間 M5(5分足)
ヒストリカルデータ Dukascopy
期間 2014/1/1 - 2018/12/30 5年程
期間 2018/7/1 - 2019/6/30 直近1年
Moment trueとfalse 両方で検証 tureとfalseではエントリーする箇所が違います。
バックテスト為、エントリーしない時間設定はなし。

勝率の横に "逆" "順"と書いていますが、"逆"は逆張り、 "順"は順張り。
判定は勝率60%で逆張り、勝率40%以下で順張り。

※有料サービスは16通貨ありますが今回はUSDJPYのみのバックテスト検証のみの案内です。
気が向いたら他の通貨も案内するかもですがとりま一番気になるUSDJPY。

販売ページのQAにもありますが前回バックテストした無料のEAとは結果が違います。
といいますかエントリー回数及び各時間足での勝率も違います。

TMシグナルインジゲータの独自バックテストデータ

●本データは私個人で採取したデータになります。谷氏のTMシグナルインジゲータを保証するものではありません。

生データは以下URLからご確認下さいませ。

docs.google.com


集計タブにて5年分と直近1年分まとめてあります。詳細は各タブにて。

バックテストまとめ 長期

期間 2014/1/1 - 2018/12/30 5年程
Moment false設定

HighでWin 514
HighでLose 388
LowでWin 840
LowでLose 656

High側での勝率 56.98%
Low側での勝率 56.15%
全体勝率 56.46%


期間 2014/1/1 - 2018/12/30 5年程
Moment true設定

HighでWin 556
HighでLose 346
LowでWin 866
LowでLose 630

High側での勝率 61.64%
Low側での勝率 57.89%
全体勝率 59.30%


f:id:hogehoge_kato:20190706025032p:plain


f:id:hogehoge_kato:20190706024325p:plain


過去5年だけでみると Moment frueにしてエントリーした方がいいです。


時間帯はLow側は21時~24時(NY市場前場時間)はエントリーしない方がよさそうです。
24時~4時も微妙なのでエントリーしない方がいいかなーと。
TMシグナルインジゲータのロジックが分からないので何ともですがNY時間は指標発表及び値動きが他の時間よりも大きいく逆張りが効かずにそのまま伸びているのかと。
その代わり順張りでエントリー出来る可能性もありますが順張り出来るほどの勝率は出てない。
10分満期ではなく5分満期であれば順張り出来るかもですが、バックテストしてみないと何とも。


High側は全部の時間帯でエントリーしてもいい感じ。


曜日による差はあまりないかと。


分足は55分足エントリーは避けた方がいいです。
個人的にですが55分足は人間の心理的に気持ちが悪く機関投資家など大手はキリの良い時間足での決済を行うかなーと。
今回のインジゲータに関わらず55分足は伸びる傾向があります。で次の足の逆張りが王道。



バックテストまとめ 短期 直近1年


※注意: 直近1年は参考程度に留めておくのをお勧めします。
理由としてはエントリー回数が少ないので少しの偏りで勝率が変わります。
お勧めは長期の結果+市場の特性などを考えた上での戦略を立てるといいのかなーと。
とはいえ直近の癖も掴んでいる方がいいのでバックテストは行います。


期間 2018/7/1 - 2019/6/30 1年程
Moment false設定

HighでWin 123
HighでLose 93
LowでWin 173
LowでLose 147

High側での勝率 56.94%
Low側での勝率 54.06%
全体勝率 55.22%


期間 2018/7/1 - 2019/6/30 1年程
Moment true設定

HighでWin 138
HighでLose 80
LowでWin 173
LowでLose 147

High側での勝率 63.30%
Low側での勝率 54.06%
全体勝率 57.81%

f:id:hogehoge_kato:20190706024341p:plain


f:id:hogehoge_kato:20190706024352p:plain



直近1年だけでみると Moment frueにしてエントリーした方がいいです。

過去5年と同じ様にLow側は20時~24時(NY市場前場時間)はエントリーしない方がよさそうです。
24時~4時も安定していないのでエントリーしない方がいいかなーと。


曜日は木曜日と土曜日は成果が良くないです。(土曜日はエントリー回数事態少ないので気にしなくてOK)


分足はこれもエントリー回数がすくなく判断できないかなー


月単位はうーん。こちらも判断出来ないかな。

バックテストまとめ

Momentの設定は長期、短期に関わらずtrue設定がお勧め。
ただmomentがtrueだと足確定する前にアラートが出るので注意が必要。アラートが出るもエントリー確定しない(矢印が消える)場合もあります。

自動売買を組む場合は足の終わり10秒前とかに判断するなどしないといけないかなーと。


High側は基本NG時間帯はないかな。
Low側はNY市場の時間帯はエントリーしない方がいいかも。

55分足は逆張りNG

総評

バックテストの結果は悪くない。というかさすがです。
安定して多くの時間帯で成果が良い。


再度の注意(前回の無料インジゲーター検証時にも書いたので簡単にですが)

1. TMシグナルインジゲータのロジックが分からないので信用出来ない問題
矢印(エントリー)の出る条件が不明なので将来的にどうなるのか分からない。


2. 過度なオーバーフィッテイングの可能性問題
バックテストで成果が良くても実際のトレードでの成果とは違うって可能性。
数万通りのバックテストをしている谷氏だからこそオーバーフィッテイングされすぎてるかも。


3. バックテストデータの差
私はヒストリカルデータはDukascopyを利用しているので実際とは違うし谷氏はFXDDを利用しているのでその差もあるかもです。
ハイローオーストラリアはFXCMのデータなのでそもそも正確なバックテストではない。


とはいえ上記の事を心配しだすと何も出来ないので、そこは信じてエントリーしていくしかない!!


で、TMシグナルインジケーター実際エントリーしてみた?

買ったのが数日前なのでまだ実際のエントリーはしていません。
といいますかバックテストをまだUSDJPYしか行ってません。

全ての通貨でバックテスト完了したらハイローオーストラリアの自動売買プログラムを作ってエントリー予定。

現在16通貨のヒストリカルデータの用意をしています。10通貨程度は既にもっていましたが16通貨のバックテストはしたことないw
TDSにてDL中。

f:id:hogehoge_kato:20190706033636p:plain




もし何か疑問やご質問など御座いましたらお気軽にコメント下さいませ。

一緒に儲けましょう!!

MT4 ショートカットお勧め機能 ライントレードする方は必須

MT4でライントレードやバックテストでトレンドラインやフィボナッチなど検証する方必須ツールのご案内。

ショートカットキーを導入する前

私は裁量トレードを勉強していた時に師匠から過去四年間のテスターにて手動によるバックテストを行えと言われました。
師匠からのコーチングはライントレードでしたのでトレンドライン、フィボナッチ、水平線などゴリゴリに使います。


ライントレードのバックテストを行った方であれば分かると思うのですがラインを引く為にアイコンをクリックするのが本当に手間になります。
バックテストを始めた当初はまぁこんなもんかなーとアイコンクリックしてマウス操作してーって我慢出来るのですが、数カ月分のバックテストを行っていると我慢が出来なくなってきます。
基本的なPC操作をショートカットキーで行っている人は余計にイライラしてきます。(プログラマーさんとか特に)


感覚としてですが一か月のバックテストを完了するのに手動だと4-7時間掛かります。
どこを始点にして何処を三点目にするかなどの思考で時間が掛かるのは仕方ないのですがフィボとやトレンドラインを引く為の時間が思ったより掛かります。
慣れてくるとここかなーとアタリをつけるのがうまくなりますが、最初の方は分からないので全部の箇所に引きたくなります。
その都度ポチポチとアイコンを選択してマウスを動かす。


この作業(マウス動かしてアイコン押してまたマウスを動かす)は本当にストレスです。


で色々試したのですが私が落ち着いた方法はこれです。

ショートカットキー導入


AutoHotkey + 自作設定

autohotkeyで行うので無料で行う事が出来ます。

2000-3000円の有料のツールなども買ったのですが微妙に使いにくかったり行いたい事が出来なかったりしてautohotkeyに落ち着きました。
有料ツール例 https://www.gogojungle.co.jp/tools/indicators/15815
↑これを買ったかのか忘れちゃいましたがw


私のおすすめはこの方法。

AutoHotkey
https://www.autohotkey.com/

設定は"とあるMetaTraderの備忘秘録"を参考にしています。といいますかほぼ丸パクリです。
https://fai-fx.hatenadiary.org/entry/20090916/1253026864

;MT4ウィンドウに限定
#IfWinActive ahk_class MetaQuotes::MetaTrader::4.00

;Fast Navigation にフォーカスがあるときは1を返す関数
CheckFN(){
   ControlGetFocus, control
   IfNotInString, control, Edit,return 0
   return 1
}

;-------------------------------------------------------------------
;メッセージ送信後、クリックする場合、複数行に分けてreturn を書く
M::
   PostMessage, 0x111,33253,0    ;テキスト
   MouseClick
   return
;-------------------------------------------------------------------
F::PostMessage, 0x111,33237,0 ;フィボナッチ
;-------------------------------------------------------------------
W::PostMessage, 0x111,33240,0 ;フィボナッチチャネル
;-------------------------------------------------------------------
E::PostMessage, 0x111,33236,0 ;平行チャネル
;-------------------------------------------------------------------
H::PostMessage, 0x111,33244,0 ;水平線
;-------------------------------------------------------------------
V::PostMessage, 0x111,33260,0 ;垂直線
;-------------------------------------------------------------------
S::PostMessage, 0x111,33251,0 ;バツマーク
;-------------------------------------------------------------------
C::PostMessage, 0x111,33232,0 ;チェックマーク
;-------------------------------------------------------------------
G::PostMessage, 0x111,33255,0 ;goodマーク
;-------------------------------------------------------------------
B::PostMessage, 0x111,33254,0 ;badマーク
;-------------------------------------------------------------------
Z::PostMessage, 0x111,33025,0 ;拡大
;-------------------------------------------------------------------
X::PostMessage, 0x111,33026,0 ;縮小
;-------------------------------------------------------------------
Space::PostMessage, 0x111,33233,0 ;クロスカーソル
;-------------------------------------------------------------------
L::
   PostMessage, 0x111,35463,0    ;価格左
   MouseClick
   return
;-------------------------------------------------------------------
P::
   PostMessage, 0x111,35464,0    ;価格右
   MouseClick
   return
;-------------------------------------------------------------------
;S::PostMessage, 0x111,33054,0 ;画像保存
;-------------------------------------------------------------------
T::PostMessage, 0x111,33257,0 ;トレンドライン
;-------------------------------------------------------------------

#D::
    MsgBox, 4,, Would you like to delete Arrows?
    IfMsgBox Yes
        PostMessage, 0x111,33204,0 ;矢印の全削除
    return

#IfWinActive


今ではコレなしではMT4を利用出来ません。

分かりにくいですがショートカットキーでラインを引いて、拡大したり縮小したり。

f:id:hogehoge_kato:20190703032333g:plain

チャートから目を離さなくてもいいのでバックテストに集中出来ます。

フィボナッチとフィボナッチチャネルは本当に便利。
あと水平線、垂直線も検証するなどする際便利。
拡大縮小も便利。って全部便利。


上記ファイルは私独自の設定しているので私は使いやすい(覚えやすいショートカットキー)です。
ちなみに自身で編集して自由に設定出来ます。
新しいボタンを追加する場合はMT上でクリックした時のIDを取得して設定で完了です。

あれ? MT4 他者インジゲーターの矢印をiCustomを利用すれば数値簡単に取れるんじゃね?問題。

今更気が付いたのこのアホ => そう自分への文句です。

先日バイナリーオプションの無料インジゲータ(谷あきらさんのUSDJPY)をバックテストをした時に私はMT4の実行結果をログから取得して、それをわざわざ精製してrubyでプログラム書いてバックテストの実行結果を得る。方法を行いました。
わざわざDBまで用意してね。

んで本日谷氏の動画を拝見していると自動売買ツールの販売をするとの事で、その動画内の説明に矢印を取得してエントリーさせる方法として矢印にはバッファ型とオブジェクト型の説明がありました。
ここで重要な事を思い出すんです。そーいやバッファの取得は出来るやん。って。
これってzigzagの時にやったやり方と一緒やん。って。
これって値取得出来ればruby使わなくてもMT4だけで解決出来るやん。って。
しかもインジゲータ追加で自動売買も出来るやん。って。

で早速取得High or lowの矢印サインを取得出来るかプログラム書いてみました。

	double icustom_test0 = 0;
	double icustom_test1 = 0;
	double icustom_test2 = 0;
	double icustom_test3 = 0;
	int limit = 2000;
    for(int i = 0; i < limit; i++)
    {
      icustom_test0 = iCustom(NULL,0,"TM_USDJPY",0,i);
      icustom_test1 = iCustom(NULL,0,"TM_USDJPY",1,i);
      icustom_test2 = iCustom(NULL,0,"TM_USDJPY",2,i);
      icustom_test3 = iCustom(NULL,0,"TM_USDJPY",3,i);
      if (icustom_test0 < 130){
        Print("limit" + i," icoustm_0 : " + icustom_test0, " icoustm_1 : " + icustom_test1, " icoustm_2 : " + icustom_test2," icoustm_3 : " + icustom_test3);
        Print("時間 " + Time[i], " opne: " + Open[i], " close: " + Close[i]);
      } else if (icustom_test1 < 130 ){
        Print("limit" + i," icoustm_0 : " + icustom_test0, " icoustm_1 : " + icustom_test1, " icoustm_2 : " + icustom_test2," icoustm_3 : " + icustom_test3);
        Print("時間 " + Time[i], " opne: " + Open[i], " close: " + Close[i]);
      }
    }


f:id:hogehoge_kato:20190701142621p:plain

はい。取得出来ましたー
0がhighエントリーで1がlowエントリーに割り当てられてます。

f:id:hogehoge_kato:20190701142632p:plain


通常は2147483647になりますが矢印が出る時はUSDJPYの常識的な価格が表示されます。とりまテストなので130以下で判断。
2,3は使用しません。※一応なにかあるかもーと思って取得してみましたが関係なしです。


価格はあまり重要ではなくバイナリーで必要なのはHigh or Lowどちらのエントリーすればいいかだけなので 0 or 1 のみの判断で問題ないです。

私はバカな時間を過ごしてしまいましたがこのブログ記事が誰かの役にたてば幸いです。

勝率65.83%のバイナリーオプションツールのバックテスト その2

前回の記事にて勝率65.83%のバイナリーオプションツールのアラートログとヒストリカルデータのDBが用意出来たので検証をしていきます。

前回の記事
abitra.hatenablog.com

検証内容と検証方法について

検証方法としてはエントリーの時刻とエントリー方向(High or Low)のログ(CSV)から各エントリー情報を取得して、そのデータを元にヒストリカルデータから同時刻のDBのIDを取得します。
エントリーの足データは 次足になるので ID + 1, 利益確定は ID + 2 になります。


そしてエントリー条件と内容と勝敗を判定した内容をCSVにて保存します。
※ついでに夏時間の反映もさせます。

検証プログラム rubyにて

プログラム的にはこんな感じです。

require 'sqlite3'
require '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 writing

  db = SQLite3::Database.new 'usdjpy5m.db'
  csv_file_name = "tmusdjpy_backtest.csv"
  csv = "C:/Users/あなたのPCのパス/" + csv_file_name
  new_data = []
  CSV.foreach(csv).each_with_index do |row, i|
    array = []
    if row[2] == "lower" #lowエントリー
      puts "*****************************"
      sql_select = "select * from historical_data where date = '#{row[0]}' and time = '#{row[1]}'"
      p arrow_time = db.execute(sql_select.to_s)[0]
      entry_time =    arrow_time[0].to_i + 1 #エントリー足
      sql_select = "select * from historical_data where id = '#{entry_time}'"
      p entry_time = db.execute(sql_select.to_s)[0]
      judgment_time = arrow_time[0].to_i + 2 #判定足
      sql_select = "select * from historical_data where id = '#{judgment_time}'"
      p judgment_time = db.execute(sql_select.to_s)[0]

      s_time = row[0] + " " + row[1]
      summertime(s_time) # 夏時間検証
      ttt = Time.parse(s_time) + @time_x
      array << ttt.strftime("%Y/%m/%d")
      array << ttt.strftime("%H:%M:%S")
      array << "low"
      if entry_time[3] > judgment_time[6]
        puts "win"
        array << "win"
      else
        puts "lose"
        array << "lose"
      end
      new_data << array

    elsif row[2] == "upper" #highエントリー
      puts "*****************************"
      sql_select = "select * from historical_data where date = '#{row[0]}' and time = '#{row[1]}'"
      p arrow_time = db.execute(sql_select.to_s)[0]
      entry_time =    arrow_time[0].to_i + 1 #エントリー足
      sql_select = "select * from historical_data where id = '#{entry_time}'"
      p entry_time = db.execute(sql_select.to_s)[0]
      judgment_time = arrow_time[0].to_i + 2 #判定足
      sql_select = "select * from historical_data where id = '#{judgment_time}'"
      p judgment_time = db.execute(sql_select.to_s)[0]
      s_time = row[0] + " " + row[1]
      summertime(s_time) # 夏時間検証
      ttt = Time.parse(s_time) + @time_x
      array << ttt.strftime("%Y/%m/%d")
      array << ttt.strftime("%H:%M:%S")
      array << "high"
      if entry_time[3] < judgment_time[6]
        puts "win"
        array << "win"
      else
        puts "lose"
        array << "lose"
      end
      new_data << array

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

end

writing


メソッドは細かく分ける事も出来ますが面倒なのでとりま今回はこんな感じでザクっと流していきます。
やってる事は夏時間の計算、エントリーログから時刻取得してDBでヒストリカルデータ確認して判定してCSVに書き込み。


動かすとこんな感じです。

f:id:hogehoge_kato:20190630032729g:plain

作成されたデータはこれ。
エントリー時間、分、エントリー方向、勝敗を記録しています。

f:id:hogehoge_kato:20190630031510p:plain

集計方法及びエクセル検証など

上記そ作成されたデータを時間帯、High、 Low側の各勝率、 曜日による勝率、エントリー分足の勝率などで集計。
私の場合はここでエクセル登場(google スプレッドシート


上記プログラムで作成されたデータをスプレッドシートに挿入して曜日や足などを別途計算、High、Low側なども計算
この辺はバックテスト時に全て自動で計算出来る様にスプレッドシートを組んでます。

f:id:hogehoge_kato:20190630033404p:plain


f:id:hogehoge_kato:20190630033418p:plain


キャプチャーみて頂ければを分かりますが勝率65.83%は嘘ではないです。
個人的にも色々バックテストをしてきた中でも優秀な部類に入るバックテストの結果かなーと考えます。

私の中の基準ですが逆張りは60%超えるとOK、順張りは40以下でOK。

総括(まとめ)

お勧めかと言われると試してもいいかもと考えています。

但し注意事項があります。

1. ダウンロードしたインジゲータのロジックが分からないので信用出来ない問題
矢印の出る条件が不明なため不安が付きまといます。(これは自身でロジック及びプログラムを作成出来る人のみの悩みかもしれませんがw)
検証してからバタバタしているのでエントリー条件を探し切れていませんが現状ではRSIの65%以上、30%以下ってのは一つの条件かと考えます。

それ以外にもブログや動画内の発言を見ている限りでは3つほどのインジゲータの条件をエントリーとしているかなーと。


2. 過度なオーバーフィッテイングの可能性問題
無料での提供なので、ばらまき様の為に調整されたインジゲータの可能性。
無料でばらまく理由は色々あるかと考えますが一つに有料のインジゲータへの導線で、私の様にバックテストしてもらい好成績を期待させて有料への流れといった感じ。
またタニアキラさんのスタイルは過去バックテストを大量にする事により高い成績を出していくスタイルなので過去チャートのオーバーフィッテイングは簡単かと。


3. 取引回数少ない問題
上記キャプチャーではモザイク掛けていますが時間帯でみると取引回数が少ない時間帯も多くあります。
取引回数が多ければ多いほど良いといったものでは御座いませんが個人的には100回以上エントリーしての勝率が欲しいかなーと。
まぁこれは私が2014年~2018年(5年程)で検証したのが原因でもありますが、あまりにも古い(2010年とか遡る)と違うかなーってものあり、どうしようかな。。。


4. 自動売買組めない可能性問題。
有料を前提とした話になりますが、基本的には裁量での運用が前提なのかと考えるので自動売買をこのインジゲータで行うのが難しい可能性があります。
メール通知の仕組みがあればサーバ立てて解決出来るかとは考えますが、メールの通知内容によってはめちゃくちゃ手間が必要。

●追記 2019年7月1日
iCustomで解決出来る可能性大。後日詳細の記事書きます。



とはいえ優秀なインジゲータの可能性が高いので引き続き様子をみてみたいと考えます。

併せて誰かインジゲータの分析できる方いませんか?w
一緒にエントリータイミングを分析しませんか?インジゲータの組み合わせがすごく気になる。
有料を買って全ての通貨のバックテストしようかな。。。きちんと評価及び検証するので無料で提供してくれないかなーw

勝率65.83%のバイナリーオプションツールのバックテスト

youtubeを見ていたら私のバックテストと同じような方法を行っている方を見つけました。
エクセルでのバックテスト手法公開【バイナリーオプション】応用編/後編
www.youtube.com


私はエクセルでバックテストをするというよりは集計や各時間帯などエクセルでまとめて集計して確認しているといった感じでの利用ですが。
最終的にやってる事は同じ。

エクセルによるバックテストの検証内容がすごい

この方(タニアキラさん)のバックテストの数がすごい!! 645万通りとの事。
私の場合はMT4でのバックテストがメインなのでさすがにここまで出来ない。。。私の場合はある程度アタリを付けて動かしており結果がよさげな感じの場合はそこから上下にキリの良い数値などでバックテスト。
※FXの場合は最適化などである程度効率化出来るのですがバイナリーの場合は都度テストが必要。


検証項目も大体似ているなーと。
日本時間の時間帯勝率、Highのみの結果、Lowのみの結果など。
私は上記にプラスして曜日、分足勝率、値幅なども取得しています。


サイトを見ると谷さんが提供しているバイナリー用シグナルツールのEAの勝率が65.83%!!
これが本当であれば結構良い数値です。谷さんもサイト内(動画内だったかな)で書いていますが多くのバックテストはほぼ45%-55%程に落ち着く感じ。
60%(40%)を超えてくると期待値が上がります。

"直近一年の勝率 65.83% バイナリーオプションツール"を無料で提供しているので早速利用して検証してみました。
無料でダウンロードできるのですが無料版は機能に制限があります。
USDJPYのみ、通知はアラートのみで推奨は5分足です。


有料だと16通貨。
USDJPY,EURJPY,EURUSD,AUDJPY,AUDUSD,AUDNZD,CADJPY,USDCAD,NZDUSD,CHFJPY,USDCHF,EURAUD,GBPJPY,GBPUSD,EURGBP,GBPAUD


とりま無料で様子をみてみるのがお勧めかもです。
誤解を招くかもしれませんが私はタニアキラさんのツールを推奨している訳では御座いません。
必ず自身でバックテストなりフォワードテストなりして確認してからの方が良いです。

勝率65.83%のバイナリーオプションツールのバックテスト方法

■バックテスト環境
MT4
Ruby
Sqlite3
スプレッドシート
Windows


設定およびEAの設定方法など

谷あきらさんのline登録でEAをダウンロード出来るので、そのダウンロードしたEAをMT4に設定するだけです。
設定するとアラートと矢印が表示されるので、その矢印と同じ方向にエントリーします。

エントリーは矢印が向いている方向にエントリー、エントリーのタイミングは矢印が出た足の次足の頭でエントリーして締めは10分後(矢印で次の次の足で締め)になります。

事前準備とバックテストの方法

まずはストラテジーテスターでダウンロードしたEAを動かします。
動かすと矢印が表示されるのでその時刻を取得します。

f:id:hogehoge_kato:20190628130527p:plain


矢印が出る時間を取得したらあとはヒストリカルデータでその矢印の次足のOpen価格と次の次のClose価格を比較して勝ったか負けたかを判定するといった感じ。

最初はエクセルで検証しようかとも考えましたが。。。難しいといいますかやり方わかんねーって事でプログラムで。
※PCにエクセルがインストールされていないってのもありますがw


MT4での検証も考えましたが日付やら外部ファイルやらを読み込みする処理は面倒なのでrubyで検証しました。
※アラート取得して検証出来ればMT4で全て解決なのですが誰か方法知りませんか? コメント欲しいです。

検証する為に5分足のヒストリカルデータが必要

MT4の"ツール" => "ヒストリーセンター" => "USDJPY" => "5分足(5M)"を選択してエクスポートを選択。
CSVでダウンロード。

f:id:hogehoge_kato:20190628130811p:plain

CSVのデータ
f:id:hogehoge_kato:20190628130835p:plain

CSV to Sqlite by ruby

最初CSVで検証しようかとも考えましたが、ヒストリカルデータ(5分足 2010年から最新まで)の桁数が80万桁になってくるのでちょっとつらいなーと。
って事でヒストリカルデータをデータベース化しました。

データベースはSQlite3を利用します。 sqliteを利用している理由は特にありません。DBだったらどれでもいいかと。
以下Rubyはすでにインストール済みとして話進みます。
Rubyのインストール方法などは過去記事をご参考に。
abitra.hatenablog.com



sqlite3をインストールします。

 > gem install sqlite3

gem listでインストール出来たか確認。

f:id:hogehoge_kato:20190628130929p:plain



問題なければMT4でダウンロードしたCSVをDB化します。

require 'sqlite3'
require 'csv'


def usdjpy5m_sqlite
  puts "DB制作開始"
  db = SQLite3::Database.new 'usdjpy5m.db'
  
  puts "テーブル作成"
  # create table
  sql = <<-SQL
    create table historical_data (
      id integer primary key,
      date text,
      time text,
      open text,
      high text,
      low text,
      colse text,
      volume text
    );
  SQL
  
  if db.execute("SELECT tbl_name FROM sqlite_master WHERE type == 'table'").flatten.include?("historical_data") == true
      puts "テーブルはすでにあるので書き込み開始"
  else
      db.execute(sql)
  end

  csv_file_name = "USDJPY5.csv"
  csv = "C:/Users/hogehoge(各個人の設定)path" + csv_file_name
  puts "書き込み開始"
  CSV.foreach(csv).each_with_index do |row, i|
    db.execute("insert into historical_data (date, time, open, high, low, colse, volume) values ('#{row[0].to_s}', '#{row[1].to_s}', '#{row[2].to_s}', '#{row[3].to_s}', '#{row[4].to_s}', '#{row[5].to_s}', '#{row[6].to_s}')")
  end
  puts "書き込み完了"

  db.close

end

usdjpy5m_sqlite


↑を実行するとusdjpy5m.dbが作成されるかと思います。
ここの処理は結構時間が掛かります。(コンビニ行ってコーヒー飲んで帰ってきてもまだ終わっていませんでした。これをそのままCSVで検証していたら結構大変だったかも。ヒストリカルデータはDB化してよかったかな。)


DB化したヒストリカルデータ

f:id:hogehoge_kato:20190628135357p:plain



EAの矢印発生時刻の取得と精製

矢印の発生時刻などはログから取得しています。
EAを回すとログが保存されるのでそのログを開いてエントリーした行のデータを取得します。

f:id:hogehoge_kato:20190628131143p:plain


取得したデータをエディタ等で張り付けて不要な部分を削除してCSV化させます。
Visual studio code 等であれば shift + alt で範囲を指定して削除等出来るのでそれらを活用して、日付、時刻、High or Low(upper, lower) にします。
この作業は5分も掛からないかと。


こんな感じでログデータを修正出来ると検証時に凄い楽。

f:id:hogehoge_kato:20190628131159p:plain



今回はここまで次回エントリーの日時とDB化したヒストリカルデータを使ったバックテストの検証となります。

バックテストデータを少し公開。 2014- 2018年の5年間のデータです。
f:id:hogehoge_kato:20190628134520p:plain


#############################
追記 2019年7月1日

バックテストの続きを書きました。
rubyでエントリーのCSVデータを読み込んで勝敗などの判定とスプレッドシートで勝率など計算させています。

abitra.hatenablog.com

#############################

バイナリーオプション(ハイローオーストラリア)の1分足 ターボ エントリー のバックテスト検証

半分自分用メモ

先日コメントで検証依頼があり、真剣に1分足を検証してみました。
今迄1分足は次足エントリー検証がほとんどでしてターボ特有の○○秒後ってのは試していませんでした。
※ちなみに5分足の即エントリーは15分足の残り5分でエントリーさせます。

■前提知識

まずバイナリーオプションのハイローオーストラリアで1分足即エントリーロジックのバックテストは注意が必要。
単純に Close[1](一つ前の終値)で判断してバックテストする事が出来ません。

ハイローオーストラリアの1分足はターボしかないためエントリーしてから1分後をカウントする必要があります。
通常のバックテストの様に1分足の締めで計測出来ないです。
つまり手動でのバックテスト(検証)も基本出来ないです。
フォワードテストであればストップウォッチ片手に出来ない事もないと考えますが手間過ぎるかな。


通常のエントリーは締めの時間が決まっているのでバックテストは簡単に計測出来ます。
例えば1時間足の場合。逆張りエントリーする前提(順張りでもやってる事は同じで条件設定が違うだけ)

エントリープライスが110円だとしたら

if (エントリープライス < High[1]){ //エントリー要件達成
 if (エントリープライス > Close[1]){ //エントリーの勝敗確認
 Print("win");
 }
}

// ↓ 上記を数値で書き出すとこんな感じ

if (110 < 115){ //エントリー要件達成
 if (110 > 108){ //エントリーの勝敗確認
  Print("win");
 }
}

ヒゲで逆張りして"勝ち"。
High[1]もClose[1]も簡単に取得する事が出来ます。(書くだけでOK)このwinの所にCSVファイルで勝敗を記録して集計してやればって感じ。


ですが1分足のターボだと上記方法は使えません。
ローソク足の締めとターボのエントリーの締めの時間が違う為、別のロジックが必要で自身で締めの時間と価格を出さないとダメ。

■ハイローオーストラリア ターボ バックテスト 対応方法

ターボはターボ用のロジックを組めって事。
但し、このターボである程度正確にバックテストをする為にはティックデータが必要になってきます。
通常のHSTデータだけではティックデータが入っていないのでターボ用のロジックのバックテストは難しいと考えています。(この時点で普通の人は無理かもです。)

ティックデータを取得する方法は過去記事をご参考に。
MT4 1分足のモデリング品質を25%=>99.9%にする方法
abitra.hatenablog.com


"ティックデータを使う"を利用してバックテストを行う。
f:id:hogehoge_kato:20190624163820p:plain

バイナリーオプションの1分足ターボエントリーのバックテストロジック 例
■やってる事
  1. エントリーした時のClose[0]を変数に代入
  2. エントリーした時の時間に + 61秒後を変数に代入

以下簡単に。

if (エントリープライス < Close[0] && ここに連続エントリー防止処理の変数など設定){ //エントリー要件達成
 	entry_price = Close[0]; // 現在の価格を代入
    dt_s60 = TimeCurrent() + 61; // 1分後の時間を代入 一応61秒に設定
}

if (TimeCurrent() >= dt_s60 && entry_price > Close[0] && ここにhigh or lowの判定処理){
	Print("win");
	ここらに連続エントリー防止処理などの変数設定いれとくといいかな。
}

かなり省略していますが、やってる事はこんな感じw
確定足を使えないので値段判定はClose[0]しか使いません。

■懸念点

ティックデータを使っていますがそもそもティックデータが正確なのか分かりませんのでその辺りは、ある程度諦めるなどしないといけないかもです。
DTS及びdukascopyを疑っているわけではないですが、完璧に再現出来ているかなどの検証もしていませんので。。。
↑これら言い出すと何も出来なくなるので出来る範囲で最善の方法を行っていたらOKでしょ精神。

■その他

もし検証して欲しい手法があればお気軽にコメント下さいませー