ExcelVBAではじめるバイナリーオプション自動取引

Q&A 質問と回答


メールでいただいたご質問に対する回答など

 主にハイローのサンプルに関してメールで質問をいただいているので、差し支えなさそうな範囲で紹介するとともに答えられる範囲で回答します。タイトルは大体の趣旨を要約したものです。

■プログラム実行中に選択している通貨ペアが変わってしまう

 サンプルでは定期処理を呼び出す前に「取引対象を選択してください」とメッセージを表示しており、ここで取引したい通貨ペアを選択する想定ですが、たとえば『USD/JPY』を選択していたはずなのにいつの間にか『AUD/USD』とか他の通貨ペアの取引画面に切り替わっていることがあるようです。

 原因としてはメモリ不足により表示更新が滞ったことにより、もしくは通信が一時的に途切れたことにより、復帰時にページが初期化されてしまったことが考えられます。

 物理的な対策としてはPCのメモリ強化、通信環境強化が考えられますが、このケースだと通貨が切り替わっても気づかずにその通貨のレートを取得して自動売買を継続してしまうのが問題かもしれません。

 万全を期すのであれば@ #asset を参照して通貨ペアを確認する、A span .duration を参照して満期時間をチェックする、という処理を追加するのがよいでしょう。あるいは1分前のレートが118.9だったのに今回取得したレートが1.174だったりすれば明らかに何かがおかしいので、その辺をチェックするようにすればよいかもしれません。

■このブックでマクロが使用できないか、またはすべてのマクロが無効になっている可能性があります。というエラーが出る

 さしあたりこちら(Excel 2013 で書き込みパスワードが設定されたファイルを使用する場合に発生する現象について - Microsoft サポート)をご参照ください。それにしても「この現象は、ファイル名が比較的長めである場合に発生しますが、明確な閾値はありません。」なんてだいぶファジーな印象です。

 また、おそらく上記とは異なる原因による現象として、「1、2回レートを取得するが、その後エラーが発生して止まってしまう」という内容のメールをいただいています。

 サンプルのコピペでこの状況は再現できませんでしたが、定期処理の名前(Schedule)をたとえばSchedule111など、存在しないプロシージャに変更したり、呼び出し元と呼び出し先で対応しない引数を渡すように変更した上でスケジュールをセットすると、1回 Getminutedata を実行してレートを取得したのちの定期処理の実行時点でこのエラーが発生しますので、この辺かなと思います。

 レートを2回取得できているのであれば少なくとも1回は定期処理が正しく呼び出されているので、プログラム実行中にコードを編集した可能性やセキュリティ設定が変更された可能性も考えられます。すみませんがそれ以上のことは分かりません。

■別のプログラムでOLEの操作が完了するまで待機をつづけます。というエラーが出る。

 この件はこちら(Excel は、別のアプリケーションが OLE の操作を完了するを待っています。 - Microsoft サポート)をご参照ください。

 メモリ不足及び通信状況が悪い状況で発生を確認しています。メッセージ自体は Application.DisplayAlerts = False で出さないようにすることも可能ですが、変に想定と異なる状況で取引を続けてしまうくらいならエラーで止まってくれている方が安全とも考えられます。

■ボタンにマクロを登録できない

 これは一瞬「?」となりましたが、管理人が知らないうちにマクロの仕様(?)がいろいろと変わっていたようです。かつてはデザインモードでボタンを設置してダブルクリックするとクリックイベントが登録されてVBEが開いたのですが、確かに思った通りに動きませんでした。

 ボタン絡みでは2014年12月のWindows Updateで何かあったようですね。詳しくはこちら(Excelでコマンドボタンが押せなくなりました。 - Yahoo知恵袋)をどうぞ。

 結論としては登録、実行できないことはありませんが、当面VBEからF5で実行すればよいと思います。解決になってませんが。

 余談ですがこのような内緒のマイナーチェンジ(?)が多いことから、管理人個人的にはエクセルは2003くらいが一番使いやすかった気がします。

■オプションの種類や通貨の選択方法を教えてほしい

 一般的にブラウザにはデバッガが付属しており、「Ctrl+Shif+i(Chrome、FireFox)」や「F12(IE)」を押すと起動することができますが、これを使ってページ上で操作したい要素の詳細を知ることができます。

オプションの種類を選択するためのタグを調べているところ

 上記画面のように「スプレッドHIGH/LOW、HIGH/LOW、ON DEMAND、スプレッド ON DEMAND」の4つのオプションに対応してそれぞれ「FixedPayoutHL、ChangingStrike、ChangingStrikeOOD、FixedPayoutHLOOD」というidのspan要素が存在していることがわかります。

 同様に時間、通貨についても調べてみると、これらの要素にはページ上で単一のidが振られていないため、spanタグ内のテキスト情報を読み取って探すことにします。

 サンプルコードを以下に示しますので、動作を確認してみてください。画面の読み込み待ちを省いているため必ずステップ実行(F8)してください。やってみると分かりますが、特に通貨リストについては遅れて表示されるため、HTMLの読み込みが完了していてもすぐには要素が見つかりません。適宜時間待ち処理を追加するとよいでしょう。

'オプションの種類、時間、通貨選択サンプル Sub tabtest() Dim ie As New InternetExplorer ie.Visible = True ie.Navigate2 "https://jp.highlow.net/" ie.document.getElementByid("ChangingStrikeOOD").Click '取引の種類 For Each tags In ie.document.getElementsByTagName("span") '判定時間を探す If tags.innerText = "1 分" Then '判定時間 '※注1 tags.Click 'クリック Exit For End If Next For Each tags In ie.document.getElementsByTagName("span") '通貨を探す If tags.innerText = "AUD/USD" Then '通貨 '※注1 tags.Click 'クリック Exit For End If Next End Sub

 このサンプルコードでは、@ChangingStrikeOODタブ(ON DEMAND)をクリックし、A取引時間1分タブをクリックし、BAUD/USDの通貨タブをクリックしています。ただし、ページに初期表示されるリストは環境によって異なり、画面に表示されていない要素に対するクリックが実行されても画面遷移が伴わない場合がある点に注意してください。

追記

※注1:サンプルコード中spanタグを探すループでは、最初に見つかったタグがクリックされ、以降はスキップされてしまいます。

例えば画面に表示されている判定時間タブは4つですが、内部的には4つのオプションがそれぞれ4つの判定時間タブを持っているため、"1 分"のタブを探そうとすると「スプレッド ON DEMAND」の"1 分"タブよりも先に「ON DEMAND」の"1 分"タブが見つかります。ON DEMANDオプション選択時はここでクリックして問題ありませんが、スプレッド ON DEMANDを選択した状態で最初の(ON DEMANDの)"1 分"タブをクリックすると正しく動作しないため、この場合は2回目の"1 分"タブをクリックする必要があります。

通貨タブについても同様ですので、実際のプログラム作成時には注意してください。

■取引金額の入力ができない

 一見、以下のようなコードを実行すると金額が指定できそうですが、入力欄の表示は変更されていても実際には購入金額が変更されません。

IE.document.getElementById("amount").innerText = "8000"

 以下の画像の赤い丸で囲ったように、入力欄の内容がペイアウト額に反映されていません。

入力欄の値が反映されていない

 挙動から見て、サイト側では入力欄の値を直接参照しているわけではなさそうです。ここでは実際に入力欄に値を入力する必要がありそうです。

'購入金額の入力 Sub amounttest() Dim ie As New InternetExplorer ie.Visible = True ie.Navigate2 "http://jp.demo.highlow.net/" appname = ie.LocationName & " - " & ie.Name 'ページのtitleとieの名前を取得 '※ここから AppActivate appname, True 'ウィンドウをアクティブ ie.document.getElementByid("amount").Focus '金額入力欄にフォーカス ie.document.getElementByid("amount").innerText = "8000" '金額を入力 SendKeys "{ENTER}" 'エンターキーを入力 '※ここまでは一度に実行(ステップ実行しない) End Sub

 上記コードでは@操作対象のブラウザをアクティブにして、A入力欄にフォーカスを移し、B入力欄の値を書き換えて、CEnterキーを入力しています。つまり、人が入力するのとほとんど同じ動作となっています。

 「※ここから」から「※ここまで」はステップ実行してしまうと1行実行ごとにエクセルがアクティブになってしまうため、正しく動作しません。F5などで一度に実行してください。

 実行すると以下のようになるはずです。

入力欄の値が反映された

 入力欄の内容がペイアウト額に反映されていることを確認してください。