コピートレード 無効化ツール

商品概要
コミュニティ(0)
コピートレード 無効化ツール インジケーター・電子書籍
コピートレード 無効化ツール
MT4・MT5のコピートレードツールを無効化・妨害・阻止・ブロック・使用不能にするツール
お気に入り
0
販売実績:
7本
レビュー:
提供方法:
インジケータ
販売開始日:
2023/05/07
更新日時:
-
バージョン:
-
ご利用可能会社:

日本

フォロー 0フォロワー 1
出品者 amelibon
出品者の最終ログイン時間:2023年11月19日 17:54:49
出品者情報をもっと見る
無料

EAの口座縛りなどは コピーツールには まったく効力はありません。

MT4・MT5の EAの製作者の天敵は コピートレードツールです。 EA販売者は、そのEAの販売価格で利益をあげる事ができますが まずはお試しという事でデモ口座でしか起動できない デモ版等を宣伝用に配布する場合があります。 また、EAの価格を無料にして、そのかわりに口座縛りなどを付けて ユーザーに特定のブローカーで取引をしてもらい 取引量に応じてキャッシュバックを受け取る いわゆる IB 報酬で稼ぐという方法もあります。 しかしながら・・・デモ口座縛りにしても ブローカー限定の口座縛りで制限をかけても その EAが注文・決済するポジションを 全く別の他の口座へコピーされてしまうと EAはデモ口座以外で使用されてしまいますし 他のブローカーにコピーされて取引されると IB 報酬が入らなくなります。 MAMも同様で 取引をコピーされると手数料収入が激減してしまいます。 という訳で EAの製作者は コピートレードツールをなんとか妨害・ブロック・阻止して無効化したいのですが なぜかそのようなコード等はあまり見かけません。 そこで EA製作者のために メタトレーダーの EAやインジケーターを制作する時に使われる MQL4言語 または MQL5言語で制作されたコピートレードツールを妨害・阻止・ブロックして使用不能にする方法を考えてみました!

A~B口座間の情報の伝達を妨害・ブロックする

A口座のMT4(MT5)から B口座のMT4(MT5)へ ポジションをコピーするためには A~B口座間での何らかの情報のやり取りが必要になります。 MQL4・MQL5には 同一パソコン内や同一VPS内で共有できるデーター格納フォルダが 特定の場所にあります。 また、共有フォルダの他に インストールしたメタトレーダーの数だけ データ格納用の専用フォルダがあります。 MQL4・MQL5を使用して制作されたコピートレードツールは この共有フォルダなどを経由して情報のやり取りを行っているものを考えられます。 この共有フォルダと専用フォルダは固定なので他の階層に移動したり フォルダ名を変更することはできません。 つまり この 共有フォルダと専用フォルダにある コピーツールが使用しているファイルを削除してしまえば A~B口座間の情報の伝達を妨害できる可能性があります。 この共有フォルダ内のファイルを削除するには 下記の関数を使用します。 bool FileDelete( const string file_name, // 削除するファイルの名称 int common_flag=0 // 削除するファイルの場所 ); 削除するファイルの場所の指定は2つあり、このオプションを 空にすると 専用フォルダになり FILE_COMMON にすると共有フォルダになります。 具体的には以下となります。 //専用フォルダ内の hogehoge.csv を削除する。 FileDelete("hogehoge.csv"); //共有フォルダ内の hogehoge.csv を削除する。 FileDelete("hogehoge.csv", FILE_COMMON);

情報の伝達するファイルを削除した結果

今回の検証用に用意したコピーツールは3つですが 結論から申しますと コピーに関連されると思われるファイルを削除すると 2つのツールは ゾンビのように即、関連ファイルが再製されました。 また もう1つは即再製はしませんが コピーする瞬間に削除したファイルが再製されました。 なるほど そんな簡単にはコピーの妨害や阻止ができないみたいです。 そこで MQL4・MQL5の OnTimer()セクションを使用して 関連ファイルを 1秒おきに削除してみましたが、削除、即再製を永遠と繰り返すだけで、コピーの無効化・妨害・阻止等はできませんでした。

ファイル削除でダメなら 読み取り専用に変更してみる

ファイルには読み込みや書き込みの関する属性があり もし コピーに関連するファイルを 読み取り専用 = 書き込み禁止 に変更できれば コピーの情報伝達の更新を妨害できるので つまりは コピートレードツールを妨害・ブロック・使用不能にする事ができそうです。 しかし MQL4・MQL5のみでは ファイル属性を変更することができません。そこで ファイル属性を変更するために win32apiを使用します。 win32api とは Microsoft Windowsのシステムコール用APIのことで 簡単に説明すると windows に付属している dll を呼び出して その dll の関数を使用できるというものです。

win32api を呼び出して 使用してみる

ファイルの属性を変更するには 下記の win32api の関数を使用します。 BOOL SetFileAttributesW( [in] LPCWSTR lpFileName, //属性を設定するファイルの名前 [in] DWORD dwFileAttributes // ファイルに設定するファイル属性 ); まずは win32api の Kernel32.dllと関数を呼び出すために #import ディレクティブで記述します。 具体的には EAやインジの先頭付近に以下のコードを記述します。 #import "Kernel32.dll" bool SetFileAttributesW(string lpFileName, int dwFileAttributes); #import 上記で Kernel32.dll に含まれている ファイル属性を変更できる SetFileAttributesW関数を使用できます。 SetFileAttributesW関数は以下のように記述します。 //専用フォルダ内の hogehoge.csv ファイルを読み取り専用に設定する SetFileAttributesW(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL4\\Files\\hogehoge.csv", 0x00000001); win32api関数の ファイル名には絶対パスを指定します。 TerminalInfoString(TERMINAL_DATA_PATH) は メタトレーダーのデーターフォルダのパスを返す関数で MT4なら そのデーターフォルダ以下の \MQL4\Files が データー格納用の専用フォルダとなります。 MT5の場合は \MQL5\Files が データー格納用の専用フォルダです。 0x00000001は読み取り専用を指定する定数です。 //共有フォルダ内の hogehoge.csv ファイルを読み取り専用に設定する SetFileAttributesW(TerminalInfoString(TERMINAL_COMMONDATA_PATH) + "\\Files\\hogehoge.csv", 0x00000001); TerminalInfoString(TERMINAL_COMMONDATA_PATH)は 全メタトレーダーの共有フォルダのパスを返す関数で MT4なら そのデーターフォルダ以下の \Files が データー格納用の全メタトレーダーの共有フォルダとなります。 上記の関数を使用して コピーの情報伝達に関するファイルを読み取り専用に変更したところ 検証用に用意した2つのコピーツールの動作を妨害・阻止できました! また、更に OnTimer()セクションを使用して 関連ファイルを 1秒おきなどに この関数を実行すれば より確実に コピーツールを妨害できると思われます。 しかし ここまでは コピーに関連する共有フォルダや専用フォルダ以下に作成されたフォルダの階層が固定されていて 尚且つ コピーの情報伝達に関わるファイル名が解っているという事が前提です。 実際 EAの製作者であれば コピーの情報伝達に関わるファイルを特定することは そんなに難しい事ではないので 制作したEAに ここまでに記述した 読み取り属性を変更するコードを実装すれば 特定のコピーツールを無効化・妨害・阻止できると考えます。 また 単純に属性を変更する対象のファイル名の数だけ SetFileAttributesW関数を並べれば 複数のコピーツールを無効化・妨害・阻止できると考えます。

専用ファルダ内・共有フォルダ内の全てのファイルの属性を変更する

コピー情報を伝達する関連ファイルが解っていない場合 またはフォルダの階層が変更されたり ファイル名が変更される事を想定すると 確実にコピーツールの無効化・阻止・防止するには 専用フォルダ内・共有フォルダ内の全てのファイルを読み取り専用に変更する事が必要となります。 もちろん このような強行的な手段で全てのファイルの属性を変更すると 他の EAや他のインジケーの動作を阻害する可能性があります。 しかし EAを販売したり 配布する際には EAを単独で使用する事を条件とすれば 他のインジ等への影響は考えなくても良いかもしれません。 全ての階層のフォルダ内の全てのファイルを追跡するには MQL4・MQL5の FileFindFirst と FileFindNext を組み合わせて使用します。 long FileFindFirst( const string file_filter, // 文字列の検索フィルタ string& returned_filename, // 見つかったファイルまたはサブディレクトリの名称 int common_flag=0 // ファイルの場所を決めるフラグ ); ファイルの場所を決めるフラグは前出の FileDelete関数と同じで 空にすると 専用フォルダになり FILE_COMMON にすると共有フォルダになります。 bool FileFindNext( long search_handle, // 検索ハンドル string& returned_filename // 見つかったファイルまたはサブディレクトリの名称 );

全てのファイル属性を 読み取り専用に変更するコードを関数にする

ここからは 単体の関数ではなく 繰り返し処理や他の関数も使います。 専用ファルダ内・共有フォルダ内の全てのファイル属性を読み取り専用に変更するコードを SetReadOnly関数としてまとめました。 具体的なコードは以下のようになります。 ※ 関数内の \MQL4 は MT4用の記述です。MT5の場合は \MQL5 に置き換えてください。 void SetReadOnly(int common_flag){ //引数 common_flag で 対象フォルダを 専用フォルダ か 共有フォルダを指定します。 //NULL 専用フォルダ //FILE_COMMON 共有フォルダ //配列と変数を宣言 string folder_list[]; ArrayResize(folder_list, 0 , 0); string next_folder_name = ""; string file_folder_name = ""; while(IsStopped() == false){ //フォルダ内の最初のフォルダ名、またはファイル名を取得 long find_handle = FileFindFirst(next_folder_name + "*", file_folder_name, common_flag); //エラーなら終了 if(find_handle == INVALID_HANDLE){ FileFindClose(find_handle); break; } //フォルダならフォルダ名を記録 if(StringFind(file_folder_name, "\", 0) >= 0){ int index = ArrayRange(folder_list, 0); ArrayResize(folder_list, index + 1 , index + 1); folder_list[index] = next_folder_name + file_folder_name; } //ファイルなら読み取り専用属性を設定 else{ if(common_flag == FILE_COMMON){ SetFileAttributesW(TerminalInfoString(TERMINAL_COMMONDATA_PATH) + "\Files\" + next_folder_name + file_folder_name, 0x00000001); } else{ SetFileAttributesW(TerminalInfoString(TERMINAL_DATA_PATH) + "\MQL4\Files\" + next_folder_name + file_folder_name, 0x00000001); } } //次のフォルダ名 またはファイル名を繰り返し取得 while(FileFindNext(find_handle, file_folder_name) == true){ //フォルダならフォルダ名を記録 if(StringFind(file_folder_name, "\", 0) >= 0){ int index = ArrayRange(folder_list, 0); ArrayResize(folder_list, index + 1 , index + 1); folder_list[index] = next_folder_name + file_folder_name; } //ファイルなら読み取り専用属性を設定 else{ if(common_flag == FILE_COMMON){ SetFileAttributesW(TerminalInfoString(TERMINAL_COMMONDATA_PATH) + "\Files\" + next_folder_name + file_folder_name, 0x00000001); } else{ SetFileAttributesW(TerminalInfoString(TERMINAL_DATA_PATH) + "\MQL4\Files\" + next_folder_name + file_folder_name, 0x00000001); } } } FileFindClose(find_handle); int index = ArrayRange(folder_list, 0); if(index > 0){ next_folder_name = folder_list[index - 1]; ArrayResize(folder_list, index - 1 , index - 1); } else{ break; } } }

SetReadOnly関数を呼び出す

SetReadOnly関数をMQLに記述して 関数を呼び出します。 具体的には以下のようになります。 int OnInit() { //--- //タイマーを1秒毎に設定する EventSetMillisecondTimer(1000); //--- return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { //--- //タイマーを終了する EventKillTimer(); } void OnTimer() { //--- //専用フォルダ内の全てのファイルを読み込み専用に設定する SetReadOnly(NULL); //共有フォルダ内の全てのファイルを読み込み専用に設定する SetReadOnly(FILE_COMMON); //--- } SetReadOnly関数を制作した EAに実装して実行すれば MQL4・MQL5 で制作されたコピーツールを妨害・ブロック・使用不能にすることができます! 今回は例としてタイマーで1秒毎にSetReadOnly関数を実行していますが この間隔を短くしすぎるとシステム全体の動作に影響を与えるので 場合によってはもっと長い間隔で実行したほうが良いかもしれません。 また もし 制作するEAが 専用フォルダなどを使用する場合は 製作する EAが使用するファイル名のみ 属性を変更しないように SetReadOnly関数に if文を加えるなどすれば 専用フォルダや共有フォルダを使用しながら コピーツールのみを妨害・ブロック・使用不能にすることが可能です! SetReadOnly関数を使用したコピートレード無効化ツールを EAのサンプルコードとしてアップロードしました。 貴方が制作した EA等のコピーツール対策などにご利用ください。 但し 著作権は放棄しておりません。この関数やコードを販売したり 営利目的で転載する事は禁止いたします。
無料
商品概要
コミュニティ(0)
人気商品ランキング
おすすめ商品(キャンペーン商品)

GogoJungleを初めてご利用する方へ商品のご利用まではかんたん3ステップ!

GogoJungleでは、会員様向けに、あなたの投資生活を豊かにするサービスをご用意しております。また、商品のご購入は通常会員様に限られさせていただいております。今すぐ会員登録をして、Gogojungleを活用してみませんか!

01
ユーザー情報を入力し会員登録
02
案内に従い購入
03
マイページからダウンロード
商号 株式会社ゴゴジャン
金融商品取引業の登録番号 関東財務局長(金商)第1960号
加入協会 一般社団法人 日本投資顧問業協会
商号 株式会社ゴゴジャン
金融商品取引業の登録番号
関東財務局長(金商)第1960号
加入協会 一般社団法人
日本投資顧問業協会
金融庁日本投資顧問業協会証券・金融商品あっせん相談センター証券取引等監視委員会

Copyright © 2024 GogoJungle Inc. All Rights Reserved.