[MT4]EAに口座縛り/期間限定縛りをかける種類と方法(MT5)
目次/もくじ
良いEAができた場合、身内で配布したい場合があります。しかし、知らない間に自分のEAが出回っていた場合、身内を疑いたくはないものです。
EA・インジケーターを第3者に渡すとき、何かしらの制限をかけておかないと、コピーされてしまう可能性があります。制限がないEAの場合、コピーされれば、知らぬ間にいろいろなところで使われてしまいます。
そこで、EAに制限をかける必要性がでてきますが、現在では様々な制限手法があります。 EAにつける制限にはいろいろありますが、それぞれ一長一短あり、 状況に応じて(技術レベルに応じて)使い分けられるといろいろと便利だと思います。
固定のパスワードで口座制限をかける
これも比較的安直で、ソースコードに適当にパスワードを書いて、それをパラメータで認証させる方法です。
お察しの通り、EAとパスワードがセットで流出すると何の意味もありません。
もう一捻りしたいところです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
extern string Password = "The password"; //...OnInitとかの記述 void OnTick() { if( Password != "The password" ) { Comment("The password is wrong."); return; } //...メインコード } |
コンパイル時に口座番号を書き 口座縛りする方法
これは比較的かんたんで、ソースコードに直接口座番号とFX業者を書き込んでおき、その組み合わせ以外のユーザーの場合は稼働しないようにプログラミングするだけです。
口座番号で縛ったり、特定のMT4業者でしか動かないようにしたり、デモ口座では稼働しないようにすることができます。
しかし、利用者ごとにソースコードを編集してコンパイルする必要があるため、2~3人の場合は良いですが、数十人に対して配布する場合は、かなり面倒です。また、口座番号が変わった場合には再度配布しなおす必要があります。
ヒューマンエラーも発生する要因になります。
まず、 ソースコードに直接 「この口座番号、この口座名のアカウントでしか動かしませんよ」という 記述をします。
1 2 3 4 5 6 7 8 9 10 |
void OnTick() { if( AccountNumber() != 1234567 || AccountName() != "Taro Yamada" ) { Comment("This account is not allowed."); return(0); } //いろいろトレードの記述 ↓ } |
コンパイルすると、 その指定した口座以外では、何も動作しなくなります。
口座番号からパスワードを作って口座縛りをかける
口座番号から一意のパスワードを生成する方法です。Hash関数やsha256に近いことをします。
例えば口座番号が123456789だったとします。
その場合、(一桁目の数字)*4+(二桁目の数字)*3+(3桁目の数字)*2の答えである1*4+2*3+9*2=28をパスワードにして、 パラメータ設定でこの数値を入力しないとEAが稼働しないようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
extern int Passcode = 28; //..OnInitとかOnDeinitとかの記述 void OnTick() { int GeneratedPass = StringToInteger(StringSubstr(IntegerToString(AccountNumber()),0,1))*4+ StringToInteger(StringSubstr(IntegerToString(AccountNumber()),1,1))*3+ StringToInteger(StringSubstr(IntegerToString(AccountNumber()),2,1))*2; if( Passcode != GeneratedPass ) { Comment("Passcode is wrong"); return; } //...メインコード } |
これはあくまでわかりやすく伝えるための簡単な計算式ですが、実際にはもっと複雑にします。
メリットとしては、EAを毎回コンパイルしなくていいことと、EAを先にばらまいてからパスワードを発行するという流れを取れることです。
サーバーで認証で口座縛りをかける
FXON(ゴゴジャン)のEAがやっている方法です。EAを使う=ネットにつながっているということなので、自サーバーにアクセスさせて、口座番号や口座名の認証を行います。
数ある口座縛りの中でも一番強固なプロテクトですが、気軽にやるには荷が重すぎます。デメリットとしてはEAからサーバーにアクセスしてもらうために、URL設定をしてもらうかDLLが必要になります。
今でこそWebRequestで簡単にhttpリクエストできますが、2014年以前はDLLを組まなければいけないわ、ユーザーにDLLをセットしてもらわなくてはいけないわ、で比較的大変でした。
(MT4のFTP機能を使えば間接的にアクセス自体はできましたが、FTPのログイン情報がなければ通信できないことを考えると、セキュリティの観点からは現実的ではありませんでした。)
しかし、一度作ってしまえば、たとえ誰かがEAをばらまいたとしても、サーバー側からいろいろと操作したり、情報収集することが可能です。(口座番号とか口座名とか資産データとか吸い出すこともその気になれば可能です。)
WebRequestとは、EAからWEBにアクセスする関数で、数行の記述で、ネットワークに接続することが可能です。
接続方法もGETメソッドとPOSTメソッドがあるので、ログインが必要なポータル系サイトでも、ログインして表示させたりすることもできます。
1 2 3 4 5 6 7 8 9 10 11 |
int WebRequest( const string method, // HTTP method const string url, // URL const string cookie, // cookie const string referer, // referer int timeout, // timeout const char &data[], // the array of the HTTP message body int data_size, // data[] array size in bytes char &result[], // an array containing server response data string &result_headers // headers of server response ); |
てきとうにレンタルサーバーを借りて、データベースを構築しておけば、 このWebRequestと併用することで、オンライン認証ができます。
この認証方法の場合、プログラムの組み方によっては、サーバー側からEAを稼働停止したり、リストを取得することができるという非常に強力なメリットがあります。
デメリットは、 開発者がMQL、SQL、PHP、HTML、(ちょっとした)サーバー構築、通信プロトコルの知識に精通していなければならないので、すこしハードルが高いということです。 サーバー系のプログラマとトレード系のプログラマは属性が全く違うので、意外とどちらもできるエンジニアというのは限られているみたいです。
MQL&PHP サーバーを経由するコピートレードシステムを作るやり方 についても1から解説していますので、余力がある方はトライしてみてください。
MQL&PHP サーバーを経由するコピートレードシステムを作るやり方1
有効期限をつけるやり方(超簡単バージョン)
EAやインジケーターをお試しで使ってもらい、気に入ってもらったら購入してもらうというビジネスモデルは、買い手にとっても売り手に取ってもメリットのある販売方法です。
そのためには、EA、インジケーターに有効期限機能をつける必要があります。 一番良いのはウェブサーバー認証方式にして管理することですが、簡易的にEAに制限をつけることもできます。
例えば、2019年10月1日から2019年12月31日までの間、 利用可能にしたい場合、
1 2 3 4 5 6 7 |
datetime ST,ET; ST = StrToTime("2019.10.1 00:00"); ET = StrToTime("2019.12.31 00:00"); if( TimeCurrent() < ST ) return(0); else if( TimeCurrent() > ET ) return(0); |
これをOnCalculate(あるいはOnTickかOnStartかStart)の直下に貼り付ければ、 その期間だけ有効なEA,インジケーターが出来上がります。
1 2 3 4 5 |
OnTick() { //ここに張り付ける } |
ここで注意してもらいたいのは、 日付のフォーマットです。 日付は、必ず半角で 2003.8.12 17:35 西暦.月.日 時:分 のフォーマットで記入してください。 「日」と「時」の間は、半角スペースです。
ワンタイムパスワードで口座縛りをかける
銀行アプリとかが最近導入している認証にワンタイムパスワードというものがあります。
これはその時、数分間だけ有効なパスワードというやつです。
逆に言うと、このワンタイムパスワードは時刻から生成されています。 これはEAの縛りにももちろん使えます。
たとえば、2017年5月の間だけEAをお試しで配布したいとします。 その場合、口座番号が1234567だったとして、2017と5から適当な四則演算をしてパスワードを生成します。(2017x5x1234567=12450608195)
このパスワードをEAと一緒に配布すれば5月の間だけ有効なEAができるわけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
extern int PassCode = 12450608195; //...OnInitとかの記述 void OnTick() { if( Year()*Month()*AccountNumber() != PassCode ) { Comment("Trial is over."); return; } //...メインコード } |
6月以降も引き続き利用する場合は、またワンタイムパスワードを発行すれば、EAを再配布する手間なしに、システムを実質的に継続利用させることができます。
※パスワードの生成アルゴリズムは推測されないように、実際にはもっと複雑にしましょう。
EAのトレードがコピートレードで流出するのを防ぐ方法
何かしらEAを配布するときには流出のリスクが伴います。EAそのものにアカウント縛りや、FX業者縛りなどをつけることが一般的ですが、他のチャートにコピートレードシステムを設置されると、リアルタイムでトレードデータが流出する可能性があります。
コピートレードでEAの口座縛りが突破されてしまう
これはどういうことかというと、例えば50,000円するEAが販売されていて、それを3つのアカウントで使用したいと考えています。そのEAに口座認証があり、複数のアカウント上で稼働させることはできない場合、3アカウント分の料金を払わなければいけません。(MQLのマーケットで販売されているEAがこのタイプです。)
しかし、一つのアカウント上でその有料EAを稼働させて、そのMT4にコピートレードシステムを稼働させれば、第二・第三のMT4にトレードをコピーすることが可能というわけです。
EAを利用する側からすればお得な使い方ですが、販売する側、提供する側からすると、何とかしてこれを阻止したいというわけです。
ちょっとした対策
解決法から言うと、
他のチャート、ファイル、グローバル変数、ログ上でコピーツールEAを稼働させないように記述すれば可能です。
EAをセットしているチャート以外のチャートを強制的に閉じさせる
コピーツールを稼働させるには、それが中継システムを経由するしないに関係なく、
少なくとも一つのチャート上に専用のEAなりスクリプトなりを設置しなければならないタイプが多いです。
EAでは他のチャートにアクセスして、それを閉じることができる関数
ChartFirst()、ChartNext()、ChartID、ChartCloseがあるので、これで自分以外のチャートを強制的に閉じます。
ファイル関数でアクセスできる位置にあるファイルをEAから全部削除させる
コピートレードツールがファイル関数でトレードデータを出力している可能性も高いので、定期的にファイル関数(FolderClean()など)で削除し続ける記述をします。ただし、ファイル名の推測ができていないとファイル名の取得の点がちょっと問題になります。
大量のダミーログを出力する
ログからコピートレードデータを引っ張ってくるパターンのツールもあるので、ダミーのログを大量に出力します。本当はオーダーを出していないのに”OrderOpen”などの文字列が入ったログを出力します。
グローバル変数をすべて削除する
可能性としては低いですが、グローバル変数を使っているツールの可能性もなくはないので、GlobalVariablesDeleteAll()で一応消しておきます。
チャート上のオブジェクトを定期的に強制削除する
これも可能性としては低いですが、チャート上のオブジェクトからトレードデータを取っている可能性もなくはないので、オブジェクトも排除します。
この対策のデメリット
この方法を使うともちろんデメリットもあります。
それは利用者からするとそのEAが稼働しているチャートしか開けないということです。
もし裁量トレードもする利用者であれば苦情がきてもしょうがないですね。事前告知は必須です。
しかし、この業界にはそれでもOKという層も比較的あって、特にMT4のアカウントだけ借りて疑似的にファンドをしているような層と取引する場合にはこういった処理は必要になるかと思います。
もしコピートレードを阻止するだけでなく、コピートレードされていることを遠隔で把握したい場合には、(”お仕置き”をしたい場合には)
サーバーを設置して、EAからサーバーにデータを流すシステムをあらかじめ設置しておく必要があります。
もともとがWEBアカウント認証方式の場合、データベースのテーブルの列にほかのチャートの情報を入れる列を作ればいいだけなので簡単です。
100%防げるわけではない
この方法の場合でも完全にコピートレードによるトレードの流出を防げるわけではありません。もし使わられているコピートレードシステムがEAに依存しない仕様のシステムの場合、突破される可能性があります。
具体的にはEAではなく、インジケーターの形式でコピーするとかです。しかし、その場合、コピー元はインジケーターで、コピー先はEAになるので、ユーザーフレンドリーなコピートレードシステムとは言い難いですね。
また、ファイル関数やログ出力でトレードデータを抜き取る、ということも考えられますが、安定性とスピードにかけるので、そういったコピートレードシステムもあまり優秀なシステムとは言えないと思います。(本題からはそれますけど…)
関連記事
-
[MQL4]MT4でマルチタスク/マルチスレッド処理
MT4/MT5は基本的にC言語ベースなのでマルチスレッドはできません。 しかし、複数のチャート上で
-
(MQL4)インジケーターをEA化するやり方[EA自作]
iCustomでZigZagをEA化する(初歩編) インジケーターとiCustom 今回はインジ
-
プログラマ向け自動売買開発アイディア
「MQL4/MQL5は扱えるようになったけど、プログラミングのアイディアがない」というプログラマは比
-
MT4 チャート上にボタンを作る、シダの葉を作る、動画を作る
(MQL4)MT4のチャート上にボタンを作るやり方 現在のMT4は比較的いろいろな機能が追加されて
-
2chのスレをテキストマイニングするやり方
よく「大衆の逆をいけば勝てる」みたいなことが相場の世界では言われますよね。今回は2chの市況版の住民
コメント
こんにちは。
いきなりの御連絡すいません。
私のEAに使用期間の縛りを入れたいのですがうまく出来ません。
簡単に組み込めるコードは無いでしょうか?
有料で構いませんので御教授お願い致します。
お世話になります。
オリジナルインジケーターを作成しているのですが、、
貸出に期限をつけたいと思っています。
1週間、1ヶ月のスパンを考えています。
操作手順が全くわかりません。
簡単に活用できる物がありましたらよろしくお願い致します。
XMの口座縛りをやりたいです。ソースコードの何番目に入れたらよいですか?詳しく知りたいです。ご教授お願いいたします。
初めまして。EAの口座縛りをしたいのですが具体的なやり方を教えていただきたいのですが、よろしくお願いいたします。
ユーザー名を指定する方法を教えてください。
よろしくお願いいたします。
例 ユーザー名=sakurai rei
の場合、このユーザー名の口座でのみ
運用できるようにしたい。
お世話になります。一年前に個人の方からeaを購入しました。先日から口座エラーでエントリー出来なくなりました。販売者の方とも連絡取れず、多分止めてしまい、口座番号チェックのシステムを廃止したとおもわれます。口座番号縛りのeaを稼働させる方法は有りますか?
原則的にはコンパイルされた制限付きEAの制限を解除する方法はありませんので、販売者・開発者と連絡が取れなければ諦める他はないと考えられます。
初めまして、初心者ながらFX(EA制作)に興味があり拝見させてもらっています。
サーバータイプのMT4/MT5コピートレードツール/シグナル配信ツールのページ
WEBを経由するコピートレードツール ダウンロードから
コピートレードツールをダウンロードして実際に動かしてみました。
コピートレード出来ました。
これは確かに
「EAを利用する側からすればお得な使い方ですが、
販売する側、提供する側からすると、何とかしてこれを阻止したいというわけです。」
後者側ですので・・・
[MT4]EAに口座縛り/期間限定縛りをかける種類と方法(MT5) のページ
EAのトレードがコピートレードで流出するのを防ぐ方法から
・EAをセットしているチャート以外のチャートを強制的に閉じさせる
・ファイル関数でアクセスできる位置にあるファイルをEAから全部削除させる
・大量のダミーログを出力する
・グローバル変数をすべて削除する
・チャート上のオブジェクトを定期的に強制削除する
などの対策が必要になるようですが、
それらのソースコードの公開はしてもらえませんか?
宜しくお願い致します。
お世話になっております。
現在口座縛りのEAをサーバーに紐付けたいと考えております。
その際の方法をネットで調べていたところ当サイトに行き着き、サーバー縛りの本記事を拝見させていただきました。
ただプログラムの知識などがないため、具体的にどうやってデータベースを構築するかなどがわからない。
お手数おかけして申し訳ありませんが、こちらのアドバイスをいただけると大変ありがたいです。
よろしくお願い申し上げます。
お世話になっております。
やりたいことがあります。
こちらの記事でオフラインチャートでEAを動かす方法をためしたのですが
うまくいきませんでした。
おそらくMT4のバージョンが上がったからでしょうか?
https://fai-fx.hatenadiary.org/entry/20090911/1252594831
いい方法があれば教えてください。m(_ _)m
ファイさんのその記事は2009年の記事なので少なくともMT4build610以前のバージョンだと思います。
オフラインチャートを使いたい意図が一つしか思いあたらないのですが、
もしテストに使うヒストリーデータを任意でいじりたいのであれば、デューカスコピーのヒストリーデータを引っ張ってきて、その一部を※※するみたいな方が早いですよ
横瀬様
EAとインジでは入れる場所hが異なることがわかりました。
いま、EAに番号と試用期間の縛りを入れたいのですが。横瀬様はお受けいただけないのでしょうか。ほかにもいろいろな場所で提供していますが、転売の心配があります。
失礼を顧みず、お伺い委がします。