バイナリーオプションのインジケーターに口座認証を実装する方法

バイナリーオプションツールに認証をつける
yuki
yuki
今回は、MQLAuthを使ってバイナリーオプション用のサインインジケーターに口座認証を実装する方法をご説明します。
カオチャイ
カオチャイ
BO用のサインインジケーターは、自動売買のiCustomで呼び出される使い方を念頭に置いて認証を実装しなければ、iCustomで意図通り動かない不具合が出てしまいますので、詳しく解説していきますね
yuki
yuki
この機能は無料でご利用できますが、MQLAuth.mqhのバージョン1.04以上がインストールされている必要がございますので、まだ準備ができていない方は下記の記事を参考にしてくださいね!
カオチャイ
カオチャイ
自分でつけるのが面倒くさいという方はシストレファクトリーのMQLAuth実装代行のサービスもご利用くださいね!
MQLAuth準備編
MQLAuthシステムを利用するための事前準備 MQLAuthを使うための準備 MQLAuthシステムを使う前提条件として「インジケーターをMT4の口座番号やパスワードで縛って管...

口座番号認証はパスワードよりも安全

EAの口座番号認証

口座番号認証はパスワードに比べてセキュリティが強固なのでおすすめです。

パスワードはパスの管理が必要ですが、口座番号認証はパスワードのような入力の必要がありませんし、MQLAuthを使えばお客さんが自由に口座番号の変更もできますので手間もありません。

 

また、パスワード認証はEAの作り方によっては力技で突破されることもありますが、口座番号認証の場合は口座自体を乗っ取るという方法でもしない限り、第三者が利用することが出来ないので安心です。

 

カオチャイ
カオチャイ
それを踏まえまして口座番号認証の実装方法を解説していきますね!

 

MetaEditorでインジケーターの.mq4を作ります

カオチャイ
カオチャイ
MQLAuthの利用準備を済ませましたらMetaEditorを起動してインジケーターの.mq4を作っていきましょう!

 

MQLウィザード新規作成でファイルを作ります(画像はクリックで拡大できます)

 

 

描画プロパティファイルはお好きな名前をつけてください。

 

 

イベントハンドラEAの認証にはOnTimerを利用しましたが、BO用のサインインジケーターではOnTimerは使いません。一番上のOnCalculateにのみマークし、「次へ」をクリックします。

 

 

MQLウィザードテスターイベントハンドラは使わないのでそのまま「完了」

 

 

コードこれでMetaEditorで自動生成されるインジケーターのテンプレートが表示されました。

 

実際にコードを書き込んでいきます

#define MQLAUTH_ID "" // 追加した行
#define APPLICATION_NAME "" // 追加した行

#property copyright "©2020  MT4ツール製作【シストレファクトリー】"
#property link      "https://interactivebrokers.work/"
#property version   "1.00"
#property strict
#property indicator_chart_window

まずはMQLAUTH_IDとAPPLICATION_NAMEをdefineで宣言します。

MQLAUTH_IDにはご自身のMQLAuthIDを、APPLICATION_NAMEには登録してあるインジケーター名を入れてくださいね。

 

#define MQLAUTH_ID "ed3d8eed-3806-4934-bafa-e25e434341f0"
#define APPLICATION_NAME "SampleIndicator"

#include <MQLAuth.mqh> // 追加した行

#property copyright "©2020  MT4ツール製作【シストレファクトリー】"
#property link      "https://interactivebrokers.work/"
#property version   "1.00"
#property strict

MQLAuthのインクルードファイルをインクルードします。

 

 

口座認証部分を実装していきます

bool _isConfirmed = false; // 認証が済んだかどうかを示す。true:認証済み/false:未認証
bool _isAuthorized = false; // 認証が成功したかどうかを示す。true:認証成功/false:認証失敗
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   return(rates_total);
  }

BO用のサインインジケーターの認証は、OnCalculate内で行います。

OnCalculateはティック毎に実行されますが、毎回認証を行うとティック毎の処理が遅くなるため、初めてのときのみ認証を実行するようにしましょう。

まずは認証が済んだかどうかを示すグローバル変数と、認証が成功したかどうかを示すグローバル変数を用意します。

 

 

bool _isConfirmed = false; // 認証が済んだかどうかを示す。true:認証済み/false:未認証
bool _isAuthorized = false; // 認証が成功したかどうかを示す。true:認証成功/false:認証失敗
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) {
   if(!_isConfirmed && AccountInfoInteger(ACCOUNT_LOGIN) != 0) { // 追加した行
      _isConfirmed = true; // 追加した行
   } // 追加した行

   return(rates_total);
}

認証が済んでおらず(_isConfirmed == false)、かつ口座番号が取得できる状態になったら(AccountInfoInteger(ACCOUNT_LOGIN) != 0)、認証を行うようにします。

一度認証したら再度行わないように、_isConfirmedにtrueを入れておきます。

 

 

bool _isConfirmed = false; // 認証が済んだかどうかを示す。true:認証済み/false:未認証
bool _isAuthorized = false; // 認証が成功したかどうかを示す。true:認証成功/false:認証失敗
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) {
   if(!_isConfirmed && AccountInfoInteger(ACCOUNT_LOGIN) != 0) {
      _isConfirmed = true;

      // ここから追加
      if(AuthByAccountNumber_ReturnBool(MQLAUTH_ID, APPLICATION_NAME)) {
         _isAuthorized = true;
         Print("口座認証に成功しました。");
      } else {
         _isAuthorized = false;
         Alert("口座認証に失敗しました。利用期限が過ぎているか、この口座番号では利用できません。");
      }
      // 追加ここまで
   }

   return(rates_total);
}

MQLAuthの認証を書きます。認証が成功したら_isAuthorizedをtrueに、失敗したらfalseをいれて、さらにアラートで警告します。

アラートの警告はラベルにしてチャート上に表示するのもよくあるやり方です。

 

 

bool _isConfirmed = false; // 認証が済んだかどうかを示す。true:認証済み/false:未認証
bool _isAuthorized = false; // 認証が成功したかどうかを示す。true:認証成功/false:認証失敗
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) {
   if(!_isConfirmed && AccountInfoInteger(ACCOUNT_LOGIN) != 0) {
      _isConfirmed = true;

      if(AuthByAccountNumber_ReturnBool(MQLAUTH_ID, APPLICATION_NAME)) {
         _isAuthorized = true;
         Print("口座認証に成功しました。");
      } else {
         _isAuthorized = false;
         Alert("口座認証に失敗しました。利用期限が過ぎているか、この口座番号では利用できません。");
      }
   }
   if(!_isAuthorized) return(0); // この行を追加

   return(rates_total);
}

認証に失敗したら、OnCalculateを実行しないようreturnします。

このとき、rates_totalに0を入れるために、return(0)とします。

 

 

bool _isConfirmed = false; // 認証が済んだかどうかを示す。true:認証済み/false:未認証
bool _isAuthorized = false; // 認証が成功したかどうかを示す。true:認証成功/false:認証失敗
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) {
   if(!_isConfirmed && AccountInfoInteger(ACCOUNT_LOGIN) != 0) {
      _isConfirmed = true;

      if(AuthByAccountNumber_ReturnBool(MQLAUTH_ID, APPLICATION_NAME)) {
         _isAuthorized = true;
         Print("口座認証に成功しました。");
      } else {
         _isAuthorized = false;
         Alert("口座認証に失敗しました。利用期限が過ぎているか、この口座番号では利用できません。");
      }
   }
   if(!_isAuthorized) return(0);

   /// ここから追加
   int limit;
   if (prev_calculated == 0)
      limit = rates_total - 1;
   else
      limit = rates_total - prev_calculated;
   for(int i = limit; i >= 0; i--) {
      // インジケーターの処理
   }
   // 追加ここまで
   return(rates_total);
}

あとはインジケーターの処理部分を追加して、認証の実装は完了です。

for文の書き方は0からインクリメントしたりBarsの未計算部分からデクリメントしたりと、好みの書き方がありますが、書き方によってはarray out of rangeエラーの原因になったり、計算されないローソク足が出たりと難しい部分でもあります。

シストレファクトリーのスタッフがいろいろ試した結果、このサンプルの書き方が一番不具合を起こしにくい書き方でしたので、よくわからない方はこのままコピーするといいでしょう。

 

 

今回作成したコード

//+------------------------------------------------------------------+
//|                                        BOIndicatorAuthSample.mq4 |
//|                                ©2020  MT4ツール製作【シストレファクトリー】 |
//|                                 https://interactivebrokers.work/ |
//+------------------------------------------------------------------+
#define MQLAUTH_ID ""
#define APPLICATION_NAME ""

#include <MQLAuth.mqh>

#property copyright "©2020  MT4ツール製作【シストレファクトリー】"
#property link      "https://interactivebrokers.work/"
#property version   "1.00"
#property strict
#property indicator_chart_window

int OnInit() {
   return(INIT_SUCCEEDED);
}

bool _isConfirmed = false; // 認証が済んだかどうかを示す。true:認証済み/false:未認証
bool _isAuthorized = false; // 認証が成功したかどうかを示す。true:認証成功/false:認証失敗
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) {
   if(!_isConfirmed && AccountInfoInteger(ACCOUNT_LOGIN) != 0) {
      _isConfirmed = true;

      if(AuthByAccountNumber_ReturnBool(MQLAUTH_ID, APPLICATION_NAME)) {
         _isAuthorized = true;
         Print("口座認証に成功しました。");
      } else {
         _isAuthorized = false;
         Alert("口座認証に失敗しました。利用期限が過ぎているか、この口座番号では利用できません。");
      }
   }
   if(!_isAuthorized) return(0);

   int limit;
   if (prev_calculated == 0)
      limit = rates_total - 1;
   else
      limit = rates_total - prev_calculated;
   for(int i = limit; i >= 0; i--) {
      // インジケーターの処理
   }
   return(rates_total);
}

 

yuki
yuki
このコードをそのまま使う際は、下記の2箇所の修正をおこなってからご利用くださいね

#define MQLAUTH_ID “” //””内に自分のMQLAUTH_IDを記入する

#define APPLICATION_NAME “” // “”内に自分の登録したEA・インジケーター名に書き換える(※ユーザー名ではないので注意)

 

カオチャイ
カオチャイ
このサンプルをつかって、インジケーターに関する部分を付け加えていけば、MQLAuthで口座認証を行うBO用サインインジケーターが出来上がります
yuki
yuki
MQLAuthは他にもいろいろな機能がありますよ!他の記事も参考にしてみてください
基本の口座番号認証
EAやインジケーターに認証をつける方法
MT4のEAやインジケーターにサーバー認証(口座番号縛り)を実装する方法MQLAuthを使って、EAやインジケーターに口座番号認証を実装する方法を紹介しています。 従来のコピー防止だけでなく、遠隔での停止や決済機能の自動化なども可能になる画期的な認証方法です。...
インジケーターのカスタマイズ色々
MQLコードでEAをカスタマイズ
【MQLコード解説】EA・インジケーターのカスタマイズ【体験版・LINE通知】EAやインジケーターに口座番号認証を実装する方法を紹介しています。 認証システムにはMQLAuthを利用して解説していきます。...
バイナリーオプション関連
MQL実装例
【コピペでOK】バイナリーオプションサインツールに体験版機能を機能を実装してみました https://interactivebrokers.work/start_mqlauth/ 体験版機能付きのBO用サインツー...
時間指定インジケーター
バイナリーオプションで時間指定エントリーができるインジケーター【有料版】 ハイローオーストラリアで時間指定エントリーができる「SYSFAC_ArrowTimerPro」 今回ご紹介するのはSYSFAC_A...
勝率表示インジケーター
【MT4】チャートに勝率を表示する無料インジケーター https://interactivebrokers.work/indicator/ MT4の勝率表示インジケーターとは? ...
EA・インジケーター制作のご依頼はこちら
インジケーターのバックテスト&リペイントチェック代行サービスMT4やMT5に関するツールを作成する際の流れを説明しています。 シストレファクトリーでは一からEAの制作以外にもツールの修正や、統計的なアプローチができるソフトなどお客様の欲しいツールを形にいたします。...
EA&インジケーター制作代行
【MT4&MT5】EA&インジケーター制作代行承ります EA&インジケーター制作代行とは? EA&インジケーター制作代行では、皆さんが日頃使っている手法をMT4(MT5)でエントリーサイ...