バイナリーオプションの自動売買を開発するやり方[MT4+AutoIT]
公開日:
:
バイナリーオプション自動売買開発 自動売買, バイナリーオプション
目次/もくじ
今回はハイローバイナリーオプションのリアルタイム自動売買をします。FXの場合は、MT4MT5があればバックテストも自動売買も同じようにできますが、バイナリーオプションの場合、同じシステムトレードでも自動売買と過去検証は全く作業が異なります。
過去検証はこちら
バイナリーオプションでその手法が勝てるかどうか過去検証(バックテスト)するやり方
かつて2010年代の一部の業者ではMT4にプラグインを入れることで従来のEAのように自動売買できたところもあったのですが、業者依存で汎用性がないので、今回はそれ以外の方法で行います。
また、ハイローでは自動売買が規約で禁止されているので、自動化がバレない方法でなければなりません。
(自動売買は自己責任で)
バイナリーオプションリアルタイム自動売買概要
まず、概要ですが、
- MT4でインジケーターを作るorソースコードがあるインジケーターを手に入れる
- バイナリーオプションのトレード画面をブラウザ(IE)で開く
- MT4から出たシグナルを受け取る
- ブラウザをオブジェクトして扱い、ボットで注文する(COM)
こんな感じです。
ブログを読み続けていらっしゃる方からすれば、「はいはい、またこのパターンね」という感じでしょうか。
やっぱりこの形は汎用性があって多様性があるので便利だと思います。
マクロ=マウス座標と思われていますが、ブラウザをCOMオブジェクトとして処理すれば、ブラウザをオブジェクトとして処理できるので座標は使いません。
追記:当時はIEがかろうじて現役だったので上記の方法が使えましたが、さすがにEdgeへの移行が進んでIEそのものが使えないケースも増えてきているので、C#かJavaでアプリ組んだ方が良いかもしれません。
問題となるのは、
- インジケーターのシグナルをどの形で出力するか(ファイル出力、アラート出力など)
- マクロにどうやってシグナルの出力結果を渡すか
- バイナリーオプションの業者をどこにするか
です。
業者に関してはバイナリーオプション業界で一番ポピュラーな「ハイローオーストラリア」にします。自動売買は規約で思いっきり禁止されていますが、ハイローのアフィリエイターではないので知ったこっちゃないです。
MT4における外部に対するシグナルの出力形式には、
- ファイル出力:マクロでファイルを開けたり閉じたりすれば更新内容を取れるのでまぁまぁ
- アラート出力:一般的なインジケーターは全部これだけど、マクロのウィンドウ操作は不安定なので却下
- WEB出力:最終的にバイナリーオプションのウェブ上の画面を操作するからありっちゃありだけど、別途サーバーを用意しなければいけないので(めんどくさいから)却下。ただ、実用的ではあるかも。
ということで、今回はインジケーターのシグナルをファイルに出力し、その出力結果をもとにリアルタイム自動売買を行います。
MT4コーディング/プログラミング
MQL4でトレードシグナルをファイル関数を使ってファイルに出力する
今回はシグナルの優位性はおいておいて、サンプルとしてRSIのラインクロスで開発しましょう。バイナリーオプションで勝てるかどうかのシステムトレードの検証は、過去検証編でじっくりやりましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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です。
1 |
$sFilePath = "C:\\Users\\"&@UserName&"\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\SignalDataForHighLowBinary.txt" |
コードを挿入する場所ですが、アラートがでるインジケーターの場合はAlert()と差し替えればOKです。
EAの場合は、OrderSendと差し替えればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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)にファイルが自動的に作成されます。
ゴールデンクロス/デッドクロスのシグナルをファイルに出力するコード
コード全体は下記みたいな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
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で出力したファイルをボットで読み取る
1 2 3 |
$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で取得できます。
1 2 |
$oIE = _IEAttach("https://trade.highlow.com/", "URL") $oIEactive = WinActivate("取引| HighLowバイナリーオプション - Internet Explorer") |
ウィンドウのアクティブ化はお好みで。
トレード操作に必要なのは「HIGH」,「LOW」の選択と、”今すぐ購入”の送信です。そのため、ここのソースがどうなっているかを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<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”の要素を選択する記述をします。
1 2 3 4 5 6 |
$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の場合は、
1 2 3 4 5 6 7 |
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年以上サイト内の構成が変更されていないので、当分は大丈夫だと思います。
「今すぐ購入ボタン」に関しては、
1 2 3 |
<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です。
1 2 3 4 5 6 |
$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 |
追記:上の方法だと動かなくなってしまったので、新しくこちらで。
1 |
_IELinkClickByText ($oIE, "今すぐ購入") |
シンプル!
これで、ボットによるHighLowの操作の基本はOKです。
botのループ処理については
1 2 3 4 5 6 7 8 9 10 11 |
HotKeySet ("s", "stopprogram") While 1 ;ここにループ中の処理 Sleep (1000) WEnd Func stopprogram() Exit EndFunc |
で可能です。
これでキー「s」を押すと終了します。Sleep()関数の引数はミリ秒単位なので1000なら一秒ごとにトレードシグナルをチェックする形になります。1レッグレイテンシーアービトラージのようにエントリータイミングが厳しいわけではないので、数秒ごとでもOKだと思います。
ただ、MT4側で生成させているトレードシグナルが暴騰暴落系のロジックである場合は、もうちょっと演算間隔を短くした方が良いと思います。
ハイローオーストラリアはしばらく操作をしないと自動的にログアウトさせられてしまうので、定期的にリロードしましょう。ただし、一定間隔でリロードするといかにもボットによる挙動になるので、リロード間隔には乱数を使います。
1 2 3 |
If Mod(@MIN,Random(11,19)) == 0 Then _IELoadWait($oIE) EndIf |
コード全体ができたらコンパイルしてexeファイルを生成しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
#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やアービトラージでいいんじゃね? と今更ながらに思ったりします。
関連記事
-
バイナリーオプションのバックテスト(過去検証)のやり方
バイナリーオプションの場合、リアルタイムの自動売買開発と過去検証のためのソフト開発は別物です。 自
コメント
コメント失礼します。
こちらを見て勉強しようと思っているのですがこの記事のプログラムはindicator ea どちらで作成して行けばいいのでしょうか。
はじめまして。
こちらの記事を見て勉強したいと思っているのですが、こちらはインジケーターで作るのかEAで作るのかわからないのですがお教えいただけますでしょうか。
これはインジケータでやっていますが、EAでも同じように作ることができます。
コメント失礼します。
最近BOの自動売買を始めた者です。
この記事のコード全体部分をコピペして、カスタムインジケーターで使用させて頂いたのですが、ファイルが作成されませんでした。
何か他にやる事があるのでしょうか?
マクロはどのようなツール使い、どこの書けばいいですか?
初めまして。
自動売買をするために、最近MQLを勉強しだした者です。
サイトをよく訪問させていただいております。
いつもありがとうございます。
1つ質問させてください。
すでにDの一族さんがされている質問と重複してしまうのですが、記載いただいているコードを実行してもなぜかファイルが生成されません。
コンパイルはできて、実行もできているのでコード以外に問題があると思っています。
何か必要な設定があるのでしょうか。
ご教示いただけますと幸いです。どうぞよろしくお願いいたします。
—————–私が試したのは以下のとおりです—————–
・MetaEditarにカスタムインジケータとしてソースコードを張り付け
・コンパイル
・実行
・ウィンドウがPOPUP表示され、サブウィンドウにRSIが表示を確認
・RSI 30ラインを下回るタイミング もしくは RSI 70ラインを上回るタイミングを目視で確認
・ COMMONフォルダ(C:\Users\ユーザー\AppData\Roaming\MetaQuotes\Terminal\Common\Files)を確認
多通貨通貨ペアの選択について
どのようにCODEしたらいいのか、是非続きを楽しみにしております
High button/ Low buttonを押す場合はinvest_now_buttonと同じようにIDをスキャンさせたのですが、upLink/downLinkしか見つからず
IF LINK_LST.Item(I).id = “upLink” THEN
こちらで試したところ、HIGH/LOWの別の小窓が開いてしまいました。
しかし、なぜかボタンは押せました!
これの応用で、インジケーターをチャートに入れて、MT4のjournalに記録されたbuy /sell の文字列をEAが読み取って、
オーダーを出すことはできるのでしょうか?
こんにちは、
MT4からBUY-SELLの取引の情報をツイッターに飛ばしたいのですが、
以前記事で拝見した、CMDからツイートするアプリは
現在使えなくなったのでしょうか?
是非、いい方法があれば教えて下さい。
ツイッターは開発者用のAPIがあり、コードの情報も多いので実装は簡単です。
VPS上にMT4を置いて、MT4から一度サーバーにトレードデータを飛ばします。
あとはサーバー上でPHPなりJavaなりでAPIの認証処理(ハッシュとかヘッダとか)してツイッターになげれば常時放置で配信できます。
ありがとうございます。
是非、今度MT4 to twitterの具体的方法を記事にしていただけないでしょうか!?
よろしくお願いします。
参考になりました。
ハイローは、マウス座標をとっているという噂があるので、ランダムで画面内にマウスムーブをしていおいたほうがより安全かなとおもいました。
ハイローの各JSファイルは見てみると、マウスの動きをフックするコードが入っているので、何かしらのトラッキングはしていそうです
恐れ入ります
ここでは最初に購入金額を決定しておいて
その後の取引も一定で走らせる設定ですが
ループ再生の折 一定の条件に沿った計算式での購入額を
パラメーターとし走らせる方法が知りたいのですが
ご教授頂けませんか?
ぜひお願いします
質問させて頂きます。
ハイローオーストラリアの自動売買システムがパソコンに組まれていますが、UWSCというもので組まれており、IE起動のログインは出来ますが、前の使用者のmt4が期限切れになっているので、自身のmt4に全く同じようにデータを移しましたが、IEは起動しているものの、自動エントリー出来ない状況なのですが、こちらで原因を調べて設定して頂く事は出来ますでしょうか?
可能な場合、1回チームビューアー等で見て頂き、大体おいくら位でやって頂けるかを教えてもらえると有難いです。
回答頂けると助かります。
よろしくお願い致します。
はじめまして。
ハイローで自動売買したいサインツールがあるのですが、自動化の依頼はできますか?
はじめまして、とある方から頂いたインジケータがあります。
勝率は平均で80%超えです。(マーチンを2回した場合)勿論リペイントはしません、ただ勝率が高すぎるので世に出てほしくありませんが、現在使用中のインジを自動売買が可能でしょうか?
宜しくお願い致します。
ありがとうございました
AutoITでBotを作成してBotを起動しましたが、「Error: Variable mut be of type “Object”」で起動できないのですが、エラー原因を探す手立てはありますか?ググっても英語で意味不明なことばかりでよくわかりませんでした。