MQL4 自動売買EAに口座縛り機能を付ける方法
始めて記事を書きます。よろしくお願いします。
プログラムは趣味ですが、儲けるEAを作れたことがありません(笑)
プログラムを書けるのとロジックを考えれるのは別物ですね
そんな中でも仲間内で使ってるEA(ロジックの自動売買ではない)は稼働させてます。仲間内ではありますが、やる気を維持するためにIB方式で使ってもらってます。
プログラムの勉強のため、口座縛りも一応作りましたが、WebRequest方式なので、知識ある方であればどこのサーバーで認証されているかバレバレな奴です。多少、知識はあるのでサーバーはAPIで認証させてます。
他人にEA配布するならWebRequest方式はダメダメですよ
今回、口座縛り手段は何がいいかをまとめようと思いました。
それでは、どんな認証方式があるか行ってみましょう!!
1.EAに口座番号埋め込み
変数numberに相手の口座番号を代入したソースを直接埋め込みます。一番簡単な方法ですね。配布数が少ない場合におすすめ。
デメリット:ユーザーが増えるたびにソースをコンパイルして送るという作業負荷。
// 相手の口座番号をソースに埋め込む
int number = 123456789;
int OnInit(){
if( AccountNumber() != number){
Alert("Auth failed\n\n","登録されていない口座番号です!!");
return(INIT_FAILED);
}
Comment("Auth completed");
return(INIT_SUCCEEDED);
}
2.認証キー方式
パラメータの入力に認証キー項を設けてソースコード内で口座番号と認証させる。相手の口座番号を聞き、[ 口座番号×9+12345 ]の計算結果を認証キーとして伝えます。口座番号埋め込みより楽です。
デメリット:数式がバレると意味がない。
input long inputKey = 123456789; // 認証キー
int OnInit() {
long authKey = (long)AccountNumber() * 9 + 12345;
if(authKey != inputKey){
Alert("Auth failed\n\n","登録されていない口座番号です!!");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
3.サーバー認証方式
上記で書いたWebRequest方式は論外として、wininet.dllを使ってMT4とサーバー間で認証します。ユーザー側で[DLLの使用を許可する]にチェックを付けるやつですね。ほとんどのEAは、この認証方式だと思います。
デメリット:サーバー側を構築するスキルが必要
4.どの方式が最適か?
自作EAを配布した後の無断利用が不安な方も多いと思います。口座縛りを理解して適切な手段を選択しましょう。
口座番号埋め込み方式の作業負荷は否めませんが経験が少ない開発者としては手っ取り早いのではないでしょうか。運用する口座番号で認証しますのでEAが流出しても他口座で稼働することはできません。
認証キー方式も手っ取り早いのですが、計算式がバレれば他の口座で稼働できますので流出した時の被害は大きいので注意してください。あと、配布した後に使わせたくないって思ったときにEAを回収できませんのでご注意
EA開発経験を積むとサーバー認証方式を採用してくる方がほとんどだと思います。普通であればこの方式が一番安全かもしれません。
5.サーバー認証方式にも注意が必要
スキル高い人に掛かれば中途半端なサーバー認識も意味がありません。いくつかのEAを見てみたんですが、サーバー側の構築を怠けてgoogleスプレッドシートを採用している方が多いようです。確かに、サーバーコストを考えればこれで十分かもしれません。私も知らなかったので「なるほど~」って感心させられました。ただ、ユーザー数と口座番号がgoogleスプレッドシートに記載されてましたのでどうかなぁって感じです。
経験が豊富な開発者さんはPHPやAPIなどでサーバを構築されています。しかし、サーバーからの返答が[OK]とか単純なものが多いです。EAで受け取った時の処理を怠けてしまってますね。[EAを使い放題]ってサイトもこの方式です。
この記事の反応が良ければ、次回は開発者に向けにサーバー認証が破られる方法を書いてみますね。