本記事は情報提供を目的としており、特定の金融商品の購入・売却を推奨するものではありません。FX取引にはリスクが伴い、投資元本を失う可能性があります。投資判断はご自身の責任において行ってください。
EA口座認証の実装方法
不正コピーからあなたのEAを守る完全ガイド
苦労して開発したEAが無断複製・再配布されるリスクを徹底解説。
MQL4コード付きで口座認証の実装手順をわかりやすく説明します。
この記事でわかること:EA不正コピーの実態 → 口座番号認証の基本実装(MQL4コード付き)→ 複数口座対応 → オンライン認証サーバー連携 → 有効期限付きライセンス → ユーザーフレンドリーなエラー設計 → GogoJungle vs 自社販売の認証戦略の違い
1. なぜ口座認証が必要か|EA不正コピー・再配布の実態
EAの不正コピー問題は、販売者が想像する以上に深刻です。国内外のフォーラム・SNS・ファイル共有サイトでは、有料EAが無断で共有される事例が後を絶ちません。
EA(自動売買プログラム)はMQL4/MQL5ファイルをコンパイルした .ex4 / .ex5 形式で配布されます。バイナリ形式とはいえ、逆コンパイルツールを使えばロジックをある程度復元できますし、ファイルそのものを別のPCやアカウントにコピーするだけで動作してしまう場合があります。
口座認証を実装することで、購入者の口座番号(AccountNumber)と紐づけた専用ファイルを発行できます。たとえ第三者にファイルが流出しても、その人の口座番号と一致しなければEAが起動しない仕組みになります。
不正コピーが発生しやすい主な経路
- 国内外のトレーダーフォーラム(2ch/5ch、Forex Factory等)でのファイル共有
- 購入者から知人への「お裾分け」(悪意なき共有が多い)
- 中古売買・ファイル転売サイトへの出品
- Telegram・Discordグループでの無断配布
- 海外の「EA crack」サイトによる改ざん配布
2. 口座番号認証の基本実装|MQL4コード解説
最もシンプルな認証方式は、MT4の組み込み関数 AccountNumber() を使って、起動時に口座番号を検証する方法です。以下のコードを参考にしてください。
//--- 入力パラメータ:購入者の口座番号を設定 input long AllowedAccountNumber = 0; //--- OnInit() 内で認証チェック int OnInit() { //--- 口座番号の一致を確認 if(AllowedAccountNumber != 0 && AccountNumber() != AllowedAccountNumber) { Alert("認証エラー:このEAはアカウント番号 " + IntegerToString(AllowedAccountNumber) + " 専用です。\n現在の口座: " + IntegerToString(AccountNumber())); return(INIT_FAILED); } Print("口座認証OK:", AccountNumber()); return(INIT_SUCCEEDED); }
実装のポイント:販売時に購入者から口座番号を申告してもらい、AllowedAccountNumber にその値をセットしたカスタムビルドを発行します。INIT_FAILED を返すことでEAがチャートに適用されず、OnTick()も実行されません。
3. 複数口座対応の実装パターン
1ライセンスでデモ口座とリアル口座の両方を使いたい、またはVPS用に複数口座を許可したいというケースは非常に多くあります。複数口座対応には主に2つのパターンがあります。
//--- 許可する口座番号をコンパイル時に埋め込む
long AllowedAccounts[] = {1234567, 7654321, 9988776};
bool IsAccountAuthorized()
{
long currentAccount = AccountNumber();
int total = ArraySize(AllowedAccounts);
for(int i = 0; i < total; i++)
{
if(AllowedAccounts[i] == currentAccount)
return true;
}
return false;
}
int OnInit()
{
if(!IsAccountAuthorized())
{
Alert("認証失敗:この口座はライセンスされていません。\n" +
"購入・お問い合わせ: https://ea-creators.com/ea-create/");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
//--- MQL4/Files/license.txt から口座番号リストを読み込む
bool IsAccountAuthorizedFromFile()
{
int handle = FileOpen("license.txt", FILE_READ|FILE_TXT|FILE_ANSI);
if(handle == INVALID_HANDLE)
{
Alert("ライセンスファイルが見つかりません。");
return false;
}
long currentAcc = AccountNumber();
while(!FileIsEnding(handle))
{
string line = FileReadString(handle);
if(StringToInteger(line) == currentAcc)
{
FileClose(handle);
return true;
}
}
FileClose(handle);
return false;
}
4. オンライン認証サーバーとの連携|WebRequest活用
より堅牢な認証を実現したい場合、MT4の WebRequest() 関数を使ってオンラインの認証APIと連携する方法があります。EA起動時にサーバーへ口座番号とEA IDを送信し、サーバー側で認証結果を返す仕組みです。
オンライン認証の全体フロー
//--- ツール > オプション > エキスパートアドバイザー で
// 対象URLの許可設定が必要
input string AuthServerURL = "https://your-server.com/api/auth";
input string EA_ID = "MY_EA_V1";
bool OnlineAuthenticate()
{
string postData = "account=" + IntegerToString(AccountNumber()) +
"&ea_id=" + EA_ID +
"&broker=" + AccountCompany();
char postArr[];
char resultArr[];
string headers = "Content-Type: application/x-www-form-urlencoded\r\n";
string resHeaders;
StringToCharArray(postData, postArr, 0, StringLen(postData));
ArrayResize(postArr, StringLen(postData));
int statusCode = WebRequest(
"POST", AuthServerURL, headers, 5000,
postArr, resultArr, resHeaders
);
if(statusCode == 200)
{
string response = CharArrayToString(resultArr);
if(StringFind(response, "OK") >= 0) return true;
}
return false;
}
int OnInit()
{
if(!OnlineAuthenticate())
{
Alert("オンライン認証に失敗しました。\n" +
"ライセンスをご確認ください: https://ea-creators.com/ea-create/");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
注意:WebRequestを使用するには、MT4の「ツール → オプション → エキスパートアドバイザー」タブで認証サーバーのURLを「許可するURLリスト」に追加する必要があります。購入者向けのセットアップガイドに必ず記載してください。
5. 有効期限付きライセンスの実装
月額課金型のEAや試用期間付きライセンスを提供する場合、有効期限を認証に組み込むことができます。
//--- ライセンス有効期限(UNIX タイムスタンプで指定)
input long LicenseExpiry = 1767225600;
bool IsLicenseValid()
{
datetime now = TimeGMT();
if((long)now > LicenseExpiry)
{
int daysExpired = (int)((now - (datetime)LicenseExpiry) / 86400);
Alert("ライセンスの有効期限が " + IntegerToString(daysExpired) +
" 日前に切れています。\n更新: https://ea-creators.com/ea-create/");
return false;
}
long daysLeft = (LicenseExpiry - (long)now) / 86400;
if(daysLeft <= 7)
{
Print("ライセンス残り " + IntegerToString((int)daysLeft) + " 日です。");
}
return true;
}
int OnInit()
{
if(!IsLicenseValid()) return(INIT_FAILED);
return(INIT_SUCCEEDED);
}
有効期限認証の活用ケース
6. 認証エラー時のUX設計
認証エラーが発生したとき、ユーザーが「何が起きているか」「どうすれば解決できるか」をすぐに理解できるメッセージを表示することが重要です。不親切なエラーメッセージはサポートコストの増大と悪評につながります。
エラーメッセージ設計の5原則
- 原因を明示する — 「口座番号不一致」「有効期限切れ」など具体的に
- 現在の状態を表示する — 現在の口座番号・残り日数など
- 解決手順を示す — 「○○ページからライセンスを更新してください」
- 問い合わせ先を明記する — URL・メールアドレスをメッセージに含める
- 日本語で丁寧に — 英語エラーコードのみは避ける
7. GogoJungle販売 vs 自社サイト販売|認証戦略の違い
EAの販売チャネルによって、最適な認証方式は異なります。GogoJungleのようなプラットフォーム販売と自社サイト販売では、購入者への対応フローも変わります。
- GogoJungle側でDRM保護機能あり
- プラットフォームのライセンス管理に依存可能
- 独自認証を追加することで二重保護が可能
- 口座番号申請フォームはGJ販売ページ経由で設置
- 推奨:シンプルな配列認証 or GJ DRM依存
- プラットフォームDRMなし=完全自己責任
- 購入フロー内で口座番号申請を組み込める
- オンライン認証で収益データも収集可能
- 有効期限付きサブスク課金と相性が良い
- 推奨:オンライン認証 + 有効期限の組み合わせ
両チャネル共通:独自の口座番号認証を実装しておくことで、万が一のトラブル時も自社でライセンス管理を継続できます。価格戦略との連動も重要です。
よくある質問(FAQ)
まとめ
EA口座認証は、開発者の収益を守るための必須機能です。シンプルな口座番号チェックから、オンライン認証サーバー連携、有効期限管理まで、販売規模と技術力に応じた段階的な実装が可能です。GogoJungleでのEA販売を始める際は、最低限の口座番号認証は必ず実装しましょう。価格設定戦略と組み合わせることで、サブスク型の安定収益モデルも実現できます。


コメント