今回はハイローバイナリーオプションのリアルタイム自動売買をします。FXの場合は、MT4MT5があればバックテストも自動売買も同じようにできますが、バイナリーオプションの場合、同じシステムトレードでも自動売買と過去検証は全く作業が異なります。
過去検証はこちら
バイナリーオプションでその手法が勝てるかどうか過去検証(バックテスト)するやり方
かつて2010年代の一部の業者ではMT4にプラグインを入れることで従来のEAのように自動売買できたところもあったのですが、業者依存で汎用性がないので、今回はそれ以外の方法で行います。
また、ハイローでは自動売買が規約で禁止されているので、自動化がバレない方法でなければなりません。
(自動売買は自己責任で)
バイナリーオプションリアルタイム自動売買概要
まず、概要ですが、
- MT4でインジケーターを作るorソースコードがあるインジケーターを手に入れる
- バイナリーオプションのトレード画面をブラウザ(IE)で開く
- MT4から出たシグナルを受け取る
- ブラウザをオブジェクトして扱い、ボットで注文する(COM)
こんな感じです。
ブログを読み続けていらっしゃる方からすれば、「はいはい、またこのパターンね」という感じでしょうか。
やっぱりこの形は汎用性があって多様性があるので便利だと思います。
マクロ=マウス座標と思われていますが、ブラウザをCOMオブジェクトとして処理すれば、ブラウザをオブジェクトとして処理できるので座標は使いません。
追記:当時はIEがかろうじて現役だったので上記の方法が使えましたが、さすがにEdgeへの移行が進んでIEそのものが使えないケースも増えてきているので、C#かJavaでアプリ組んだ方が良いかもしれません。
問題となるのは、
- インジケーターのシグナルをどの形で出力するか(ファイル出力、アラート出力など)
- マクロにどうやってシグナルの出力結果を渡すか
- バイナリーオプションの業者をどこにするか
です。
業者に関してはバイナリーオプション業界で一番ポピュラーな「ハイローオーストラリア」にします。自動売買は規約で思いっきり禁止されていますが、ハイローのアフィリエイターではないので知ったこっちゃないです。
MT4における外部に対するシグナルの出力形式には、
- ファイル出力:マクロでファイルを開けたり閉じたりすれば更新内容を取れるのでまぁまぁ
- アラート出力:一般的なインジケーターは全部これだけど、マクロのウィンドウ操作は不安定なので却下
- WEB出力:最終的にバイナリーオプションのウェブ上の画面を操作するからありっちゃありだけど、別途サーバーを用意しなければいけないので(めんどくさいから)却下。ただ、実用的ではあるかも。
ということで、今回はインジケーターのシグナルをファイルに出力し、その出力結果をもとにリアルタイム自動売買を行います。
MT4コーディング/プログラミング
MQL4でトレードシグナルをファイル関数を使ってファイルに出力する
今回はシグナルの優位性はおいておいて、サンプルとしてRSIのラインクロスで開発しましょう。バイナリーオプションで勝てるかどうかのシステムトレードの検証は、過去検証編でじっくりやりましょう。
void SendSignalToFile(string BuyOrSell) { int FileHandle; string FileName = "SignalDataForHighLow.txt"; int TryCount; FileHandle = FileOpen(FileName,FILE_WRITE|FILE_TXT|FILE_COMMON); TryCount = 0; while( FileHandle == INVALID_HANDLE && TryCount < 30) { TryCount++; FileHandle = FileOpen(FileName,FILE_WRITE|FILE_TXT|FILE_COMMON); } if( FileHandle != INVALID_HANDLE ) { if( BuyOrSell == "BUY" ) FileWriteString(FileHandle,"BUY"); if( BuyOrSell == "SELL") FileWriteString(FileHandle,"SELL"); FileClose(FileHandle); } }
ちょっと処理が仰々しくなっているのは、コピートレードのときのコードをそのまま引っ張ってきたからです。
コピートレードではスピードや正確性が命ですが、今回はここまで例外処理を徹底する必要はないと思います。
外部プログラムからMT4のディレクトリにアクセスするときに、各FX業者ごとの識別文字列を調べるのは汎用性に欠けるので、MQL4でのファイル出力はCOMMONファイルに行います。
このシグナルをファイルに出力する関数をEAかインジケーターに挿入します。ファイル関数はWEB関数(WebRequest)と違い、インジケーターからでも扱えるので、インジケーターファイルでもOKです。
$sFilePath = "C:\\Users\\"&@UserName&"\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\SignalDataForHighLowBinary.txt"
コードを挿入する場所ですが、アラートがでるインジケーターの場合はAlert()と差し替えればOKです。
EAの場合は、OrderSendと差し替えればOKです。
double FastMA[3],SlowMA[3]; FastMA[1] = iMA(Symbol(),Period(),ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,1); FastMA[2] = iMA(Symbol(),Period(),ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,2); SlowMA[1] = iMA(Symbol(),Period(),LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,1); SlowMA[2] = iMA(Symbol(),Period(),LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,2); if( OrdersTotal() == 0 ) { if( FastMA[1] > SlowMA[1] && FastMA[2] <= SlowMA[2] ) { SendSignalToFile("BUY"); } else if( FastMA[1] < SlowMA[1] && FastMA[2] >= SlowMA[2] ) { SendSignalToFile("SELL"); } }
トレードシグナルが発生すると
COMMONフォルダ(C:\Users\ユーザー名\AppData\Roaming\MetaQuotes\Terminal\Common\Files)にファイルが自動的に作成されます。
ゴールデンクロス/デッドクロスのシグナルをファイルに出力するコード
コード全体は下記みたいな感じです。
input uint ShortMAPeriod = 14; input uint LongMAPeriod = 28; static datetime LastAlertTime; void OnTick() { double FastMA[3],SlowMA[3]; FastMA[1] = iMA(Symbol(),Period(),ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,1); FastMA[2] = iMA(Symbol(),Period(),ShortMAPeriod,0,MODE_SMA,PRICE_CLOSE,2); SlowMA[1] = iMA(Symbol(),Period(),LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,1); SlowMA[2] = iMA(Symbol(),Period(),LongMAPeriod,0,MODE_SMA,PRICE_CLOSE,2); if( TimeCurrent() > LastAlertTime + 300/*to avoid too many alert */ ) { if( FastMA[1] > SlowMA[1] && FastMA[2] <= SlowMA[2] ) { SendSignalToFile("BUY"); Alert("BUY"); LastAlertTime = TimeCurrent(); } else if( FastMA[1] < SlowMA[1] && FastMA[2] >= SlowMA[2] ) { SendSignalToFile("SELL"); Alert("SELL"); LastAlertTime = TimeCurrent(); } } } void SendSignalToFile(string BuyOrSell) { int FileHandle; string FileName = "SignalDataForHighLow.txt"; int TryCount; FileHandle = FileOpen(FileName,FILE_WRITE|FILE_TXT|FILE_COMMON); TryCount = 0; while( FileHandle == INVALID_HANDLE && TryCount < 30) { TryCount++; FileHandle = FileOpen(FileName,FILE_WRITE|FILE_TXT|FILE_COMMON); } if( FileHandle != INVALID_HANDLE ) { if( BuyOrSell == "BUY" ) FileWriteString(FileHandle,"BUY"); if( BuyOrSell == "SELL") FileWriteString(FileHandle,"SELL"); FileClose(FileHandle); } }
AutoIT編
続いて、ファイルをボットで読み取るところまでやります。
マクロはCOMによるオブジェクトが使えれば何でもいいですが、いつも通りUWSCで行きます。
(※ COMとはマクロソフト開発のWindows上のソフトをオブジェクトとして操作する機能です。これによりマウス操作の座標を記録するといった陳腐な方法ではなく、ブラウザをオブジェクトとして操作することができます。)
UWSCは開発者サイトが失踪してしまったので、海外でメジャーなAutoITで開発します。
AutoITはメジャーなボット作成ツールで、無料で利用することができます。
SciTE Script Editorがスクリプトのエディタからコンパイルまで行えるメインソフトです。他にもウィンドウの情報を取得するためだけのAutoIT Window Infoなどもありますが、あんまり使いません。
言語はBasicライクなので、UWSCやVBAを触ったことがある方なら馴染みやすいと思います。
AutoITのスクリプトのドキュメンテーションはこちら
https://www.autoitscript.com/autoit3/docs/
基本的な記述方法についてはここでは割愛します。
MT4で出力したファイルをボットで読み取る
$sFilePath = "C:\\Users\\"&@UserName&"\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\SignalDataForHighLow" $hFileOpen = FileOpen($sFilePath) $sFileRead = FileRead($hFileOpen)
これだけでMT4上のEA/インジケーターから出力されたシグナルファイルをAutoITで受け取ることができます。$sFileReadにファイル内の情報が格納されます。
ブラウザの立ち上げ~ログインは自動化しない方が良い
IEの立ち上げとログインの自動化はしません。技術的にはとてもかんたんですが、ボット判定がもっとも厳しい箇所がログイン推移なので、ここだけは手動にした方が賢明です。
IEを立ち上げて、https://trade.highlow.com/にアクセスしてログインした状態までは手動にしておきます。
HighLowの構造分析 と ボットでHighLowのボタンの操作
すでに立ち上げてあるIEオブジェクトは_IEAttachで取得できます。
$oIE = _IEAttach("https://trade.highlow.com/", "URL") $oIEactive = WinActivate("取引| HighLowバイナリーオプション - Internet Explorer")
ウィンドウのアクティブ化はお好みで。
トレード操作に必要なのは「HIGH」,「LOW」の選択と、”今すぐ購入”の送信です。そのため、ここのソースがどうなっているかを確認します。
<div class="invest-area clearfix trading-platform-main-controls-options none-one-click-control"> <div class="trading-platform-main-controls-select-direction first-child"> <div class="subGraph-updown"> <div class="subGraph-up"> <div class="up button" id="up_button">High</div> </div> <div class="subGraph-down"> <div class="dwn button" id="down_button">Low</div> </div> </div> </div> <div class="invest-btn trading-platform-main-controls-place-bet last-child"> <a id="quickTradeInvestBtn" class=" invest investnow_disabled button" href="javascript:;">今すぐ購入</a> </div> </div>
すると、”High”は”up button”のクラスを有するdiv要素であり、”Low”は”dwn button”のクラスを内包したdivであることが分かります。つまり、UPの場合は、divを探索して、class名が”up button”で、かつ、内部要素が”High”の要素を選択する記述をします。
$oDivs = _IETagNameGetCollection($oIE, "div") For $oDiv In $oDivs If StringInStr($oDiv.classname, "up button") > 0 and $oDiv.innertext = "High" Then ;_IEAction($oDiv, "click") EndIf Next
Lowの場合は、
For $oDiv In $oDivs If StringInStr($oDiv.classname, "dwn button") > 0 and $oDiv.innertext = "Low" Then ;$oDiv.click _IEAction($oDiv, "click") ExitLoop EndIf Next
もし、将来的にハイローオーストラリアのレイアウトが変更されて、かつ、クラス名が変更になった場合はここの変数名を変えればOKです。よほど大規模な更新でない限りはクラス名などはそのままにしておくと思います。
※Googleなどはボット対策で検索結果の要素名が一定周期で変更されるようにプログラミングされています。そういった対策の対策です。
ただし、もうかれこれ2年以上サイト内の構成が変更されていないので、当分は大丈夫だと思います。
「今すぐ購入ボタン」に関しては、
<div class="invest-btn trading-platform-main-controls-place-bet last-child"> <a id="quickTradeInvestBtn" class=" invest investnow_disabled button" href="javascript:;">今すぐ購入</a> </div>
div要素の中にaタグで設置されていることが分かります。
同じようにdivで探索して、クラス名と内部テキストに指定の文字列が含まれている場合に選択させればOKです。
$oDivs = _IETagNameGetCollection($oIE, "div") For $oDiv In $oDivs If StringInStr($oDiv.classname, "invest-btn trading-platform-main-controls-place-bet last-child") and StringInStr($oDiv.innertext,"button") > 0 Then _IEAction($oDiv, "click") EndIf Next
追記:上の方法だと動かなくなってしまったので、新しくこちらで。
_IELinkClickByText ($oIE, "今すぐ購入")
シンプル!
これで、ボットによるHighLowの操作の基本はOKです。
botのループ処理については
HotKeySet ("s", "stopprogram") While 1 ;ここにループ中の処理 Sleep (1000) WEnd Func stopprogram() Exit EndFunc
で可能です。
これでキー「s」を押すと終了します。Sleep()関数の引数はミリ秒単位なので1000なら一秒ごとにトレードシグナルをチェックする形になります。1レッグレイテンシーアービトラージのようにエントリータイミングが厳しいわけではないので、数秒ごとでもOKだと思います。
ただ、MT4側で生成させているトレードシグナルが暴騰暴落系のロジックである場合は、もうちょっと演算間隔を短くした方が良いと思います。
ハイローオーストラリアはしばらく操作をしないと自動的にログアウトさせられてしまうので、定期的にリロードしましょう。ただし、一定間隔でリロードするといかにもボットによる挙動になるので、リロード間隔には乱数を使います。
If Mod(@MIN,Random(11,19)) == 0 Then _IELoadWait($oIE) EndIf
コード全体ができたらコンパイルしてexeファイルを生成しましょう。
#include <IE.au3> HotKeySet ("s", "stopprogram") While 1 $sFilePath = "C:\\Users\\"&@UserName&"\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\SignalDataForHighLow.txt" $hFileOpen = FileOpen($sFilePath) $sFileRead = FileRead($hFileOpen) FileClose($hFileOpen) ;MsgBox(0,"debug",$sFilePath&$sFileRead) $oIE = _IEAttach("https://trade.highlow.com/", "URL") ;_IEAction($oIE, "refresh") _IELoadWait($oIE) $oIEactive = WinActivate("取引| HighLowバイナリーオプション - Internet Explorer") if $sFileRead == "BUY" Then ;press high $oDivs = _IETagNameGetCollection($oIE, "div") For $oDiv In $oDivs If StringInStr($oDiv.classname, "up button") > 0 and $oDiv.innertext = "High" Then _IEAction($oDiv, "click") ExitLoop EndIf Next ElseIf $sFileRead == "SELL" Then ;press low $oDivs = _IETagNameGetCollection($oIE, "div") For $oDiv In $oDivs If StringInStr($oDiv.classname, "dwn button") > 0 and $oDiv.innertext = "Low" Then _IEAction($oDiv, "click") ExitLoop EndIf Next EndIf Sleep(1000) if $sFileRead == "BUY" or $sFileRead == "SELL" Then ;press entry ;MsgBox(0,"debug","entory ok?") _IELinkClickByText ($oIE, "今すぐ購入") $FileHandle = FileOpen($sFilePath,2) FileWrite($FileHandle,"entried") FileClose($FileHandle) EndIf If Mod(@MIN,Random(11,19)) == 0 Then _IELoadWait($oIE) EndIf Sleep (1000) WEnd Func stopprogram() Exit EndFunc
コンパイルが終わると、AutoITのコードファイルがあるフォルダに実行ファイルが生成されます。
HighLowAutomation.exe (多分今どきexeのままで配布してもすぐに理不尽なウイルス判定されると思いますが、一応)
リアルタイムバイナリーオプション自動売買の使い方
IEを立ち上げ、https://trade.highlow.com/にアクセスしてログインします。
取引したいモード(Turboとか)、通貨ペア(EURUSD)、時間(15分)、投資額(1000円)を選択した状態にします。
MT4を起動し自動売買させたい通貨ペアチャートにEAをセットします。
Botを起動します。
結論
MT4とAutoITを使って、HighLowでバイナリーオプションのリアルタイムの自動売買する方法を考察しました。
これまでの内容で
- MT4でシグナルを生成し、そのデータをファイルに飛ばす
- マクロでファイル(テキストファイル)のシグナルデータを読み込む
- マクロでオブジェクト化したバイナリーサイトのボタンを押す
ができました。基本的なところはすべてこれまでの講座のおさらいなので、新しいことは特にないですね。
結局、勝てるかどうかはリアルタイムの自動売買開発ではなく、過去検証とロジックの構築にあるので、労力はそちらに注いだ方が賢明だと思います。
バイナリーオプションでその手法が勝てるかどうか検証するやり方
バイナリーオプションの場合、ベットするのも”楽しみ”も一つなので、それを自動化するならFXやアービトラージでいいんじゃね? と今更ながらに思ったりします。
The post バイナリーオプションの自動売買を開発するやり方[MT4+AutoIT] first appeared on とある技術者の金融工学.