EA-BANKにEAをご出品いただく場合、EA出品申請をお願いしております。
つきましては、以下の内容に従い、EA出品申請をお願いいたします。
EA出品申請の流れ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
//--------------------------------------------------- cert function begin #import "certmod.dll" void SetServer(char &host[], char &path[], unsigned short port, int ssl_enable); void SetWorkerTimeout(unsigned int value); void SetExpireTimeout(unsigned int value); void SetConnErrTimeout(unsigned int value); void SetTimeout(unsigned int worker, unsigned int expire, unsigned int conn_error); int CertInit(char &api_key[], char &acct_no[], char &acct_name[], char &acct_company[], char &acct_server[]); int CertQuote(char &api_key[], char &acct_no[]); int Cert(char &api_key[], char &acct_no[], char &acct_name[], char &acct_company[], char &acct_server[], int init_flag); void CertDebug(char &msg[]); #import #define CERT_UNKNOWN 0 #define CERT_OK 1 #define CERT_NG 2 #define CERT_ERROR 3 #define BUF_LEN 1024 string APIKey = "41474539af98795c4b3068f43c2c07e9"; //--- Please set EA's API key string InvalidMessage = "ERROR: Account number is invalid."; char host_char[]; char path_char[]; char api_key_char[]; char acct_no_char[]; char acct_name_char[]; char acct_company_char[]; char acct_server_char[]; char msg_char[]; void SetServer(string host, string path, unsigned short port, int ssl_enable) { StringToCharArray(host, host_char); StringToCharArray(path, path_char); SetServer(host_char, path_char, port, ssl_enable); } int CertInit(string api_key, int acct_no, string acct_name, string acct_company, string acct_server) { StringToCharArray(api_key, api_key_char); StringToCharArray(IntegerToString(acct_no), acct_no_char); StringToCharArray(acct_name, acct_name_char); StringToCharArray(acct_company, acct_company_char); StringToCharArray(acct_server, acct_server_char); return CertInit(api_key_char, acct_no_char, acct_name_char, acct_company_char, acct_server_char); } int CertQuote(string api_key, int acct_no) { StringToCharArray(api_key, api_key_char); StringToCharArray(IntegerToString(acct_no), acct_no_char); return CertQuote(api_key_char, acct_no_char); } int Cert(string api_key, int acct_no, string acct_name, string acct_company, string acct_server, int init_flag) { StringToCharArray(api_key, api_key_char); StringToCharArray(IntegerToString(acct_no), acct_no_char); StringToCharArray(acct_name, acct_name_char); StringToCharArray(acct_company, acct_company_char); StringToCharArray(acct_server, acct_server_char); return Cert(api_key_char, acct_no_char, acct_name_char, acct_company_char, acct_server_char, init_flag); } void CertDebug(string msg) { StringToCharArray(msg, msg_char); CertDebug(msg_char); } void CertInit() { ArrayResize(host_char, BUF_LEN); ArrayResize(path_char, BUF_LEN); ArrayResize(api_key_char, BUF_LEN); ArrayResize(acct_no_char, BUF_LEN); ArrayResize(acct_name_char, BUF_LEN); ArrayResize(acct_company_char, BUF_LEN); ArrayResize(acct_server_char, BUF_LEN); ArrayResize(msg_char, BUF_LEN); } void CertRelease() { ArrayFree(host_char); ArrayFree(path_char); ArrayFree(api_key_char); ArrayFree(acct_no_char); ArrayFree(acct_name_char); ArrayFree(acct_company_char); ArrayFree(acct_server_char); ArrayFree(msg_char); } bool CertCheck() { static bool activated = false; static bool invalid = false; if(invalid) { return (false); } string AccName = AccountName(); int Accnacheck = StringReplace(AccName,"#"," "); if(!activated) { if(CertInit(APIKey, (int)AccountNumber(), AccName, (string)AccountCompany(), (string)AccountServer()) == CERT_NG ) { Print(InvalidMessage); invalid = true; return (false); } else { activated = true; } } else if(CertQuote(APIKey, (int)AccountNumber()) == CERT_NG ) { Print(InvalidMessage); invalid = true; return (false); } return (true); } bool EA_BANK_NINSHOU = false; datetime EA_BANK_interval = 0; //----- #define EA_BANK_CHECKSPAN 60 #define EA_BANK_FORCESTOPSPAN 60 #define EA_BANK_STOPLIMIT 5 #define EA_BANK_MAXMAGICS 30 #define EA_BANK_NOT_SET (-1) bool EA_BANK_ForceStop = False; int EA_BANK_StopMagicNumbers[EA_BANK_MAXMAGICS]; void OnDeinit(const int reason) { EventKillTimer(); } void EA_BANK_InitEAMagicNumber() { for (int i=0; i<EA_BANK_MAXMAGICS; i++) { EA_BANK_StopMagicNumbers[i] = EA_BANK_NOT_SET; } } bool EA_BANK_CheckEAMagicNumber(int magic) { for (int i=0; i<EA_BANK_MAXMAGICS; i++) { if (EA_BANK_StopMagicNumbers[i] == magic) return(true); } return(false); } bool EA_BANK_CheckMagicSetting() { bool flag = true; for (int i=0; i<EA_BANK_MAXMAGICS && flag; i++) { if (EA_BANK_StopMagicNumbers[i] != EA_BANK_NOT_SET) return(true); } return(!flag); } void OnTimer() { int i; int count=0; for (i=0; i<OrdersHistoryTotal(); i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false) return; if (OrderType() != OP_BUY && OrderType() != OP_SELL) continue; if (!EA_BANK_CheckEAMagicNumber(OrderMagicNumber())) continue; if ((OrderOpenTime() >= TimeCurrent() - EA_BANK_FORCESTOPSPAN) && (OrderCloseTime() > TimeCurrent() - EA_BANK_FORCESTOPSPAN)) count += 1; } if (count >= EA_BANK_STOPLIMIT) EA_BANK_ForceStop = true; } //--------------------------------------------------- cert function end |
「mq4ファイル」のint OnInit()内最後尾に以下のコードをご記入ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//----------------------------- EA_BANK_InitEAMagicNumber(); //---- [0]から順に、使っているマジックナンバーのパラメータ変数をすべて設定してください EA_BANK_StopMagicNumbers[0] = MagicNumber; // EA_BANK_StopMagicNumbers[1] = MagicNumber2; //---- if (!EA_BANK_CheckMagicSetting()) { Alert("EA_BANK_StopMagicNumbers にマジックナンバーを追加してください。"); return(INIT_FAILED); } EventSetTimer(EA_BANK_CHECKSPAN); //---- CertInit(); SetServer("eamaker.sakura.ne.jp", "/cert", 80, 0); SetTimeout(60000, 1800000, 172800000); if(!CertCheck()) { return (INIT_SUCCEEDED); } //----------------------------- |
※int OnInit()の戻り値を設定するreturn文は上記コードの後に設定してください。
画像で位置を確認する
※EA内で使用するマジックナンバーをすべて、EA_BANK_StopMagicNumbersに[0]から順に設定してください。
例えば、EA内で MagicNumber, MagicNumber2, MagicNumber3の3つの変数を使う場合、以下のように設定します。
EA_BANK_StopMagicNumbers[0] = MagicNumber;
EA_BANK_StopMagicNumbers[1] = MagicNumber2;
EA_BANK_StopMagicNumbers[2] = MagicNumber3;
「mq4ファイル」のvoid OnTick(){の直下に以下のコードをご記入ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
//--------------------------------------------------- cert check begin if(TimeCurrent() > EA_BANK_interval+3600) { EA_BANK_interval = TimeCurrent(); if(IsTesting()) { EA_BANK_NINSHOU=true; } else if(!CertCheck()) { Comment("【EA-BANK】認証エラー。登録口座以外ではご利用できません。"); EA_BANK_NINSHOU=false; } else { Comment("【EA-BANK】認証OK"); EA_BANK_NINSHOU=true; } } if(EA_BANK_NINSHOU==false) { return; } //---- if (EA_BANK_ForceStop) { Print("暴走の危険性があるため強制停止"); return; } //--------------------------------------------------- cert check end |
※EA内部でComment関数を表示する場合、コメントの1行目に「【EA-BANK】認証OK」の文字列を追記してください。
※EAとセットで挿入するdllファイルは、こちらよりダウンロードできます。
EA出品ページには、EA-BANKマイページの「EA出品会員メニュー」からアクセスして下さい。
EA本体ファイル(ex4ファイル)
ex4ファイルはzip形式で圧縮した上でご提出ください(mq4ファイルのご提出は不要です)。
EAの実行に際し、独自のdllファイル、setファイル、インジケータファイルが必要な場合、それらも併せてzip形式で圧縮した上でご提出ください。
バックテストデータ
バックテストデータは以下に従い取得してください。
バックテスト期間:直近半年前までを含む10年間以上*
*例:出品申請日が2019年6月10日の場合、最低でも~2018年12月31日までのバックテストをお願い致します。
(期間が長い分には問題ございません)
OK:2009年1月1日〜2018年12月31日まで
NG:2008年7月1日〜2018年6月30日まで
スプレッド :EA-BANKが提示させていただいている通貨ペアのスプレッド
バックテスト通貨:ドル設定
※バックテストにつきましては、EA審査基準のページもご参照ください。
アイキャッチ画像
EAのイメージ画像(アイキャッチ画像)を300×300ピクセルでご用意いただき、pngファイル、もしくはjpegファイルでご提出ください。
尚、アイキャッチ画像は公序良俗に反しない内容でお願いいたします。
※申請内容が不正確ですとEA運用成績の正しい計算ができません。EA出品申請の際はフォームの項目は正確にご入力ください。
EA個別ページには最低限の情報として以下の内容をご記入ください。
・EAの説明
・パラメータ設定値の説明
尚、EA詳細ページにご記入いただく内容は公序良俗に反しない内容でお願いいたします。
確認の結果、バックテストと大きく乖離している、もしくはEAの性能が破たんしている事務局が判断した場合、審査落ちさせていただく場合がございます。予めご了承ください。
EA出品時の注意点
・EAの出品は「1アカウントにつきex4が10個まで」とさせていただきます。
・審査中EAの出品申請を取下げれば「10個まで」の枠を空けることが出来ます。
(例:10個を出品申請済の状況で、2個の出品申請を取下げれば、新たに2個のEAを申請できるようになります。)
・原則として出品申請から3ヶ月間は、そのEAの出品申請取下げを行う事はできません。
・複数通貨ペア対応のEAの場合、ReportManagerでバックテストを合成いただき申請して下さい。
・複数通貨ペア対応のEAの場合、通貨ペアごとに審査をさせていただきます。
・複数通貨ペア対応のEAの場合、審査を通過したものだけに限定したex4を再提出していただくケースがあります。
・セットファイルの利用は禁止とさせていただきます。ユーザー様のセッティング間違い等が誘発される恐れがあるためです。
◆バックテストの最大ドローダウン
「$1,000以下であること」
◆リカバリーファクター(純益÷最大ドローダウン)
「5以上のこと」
◆マーチンゲールやロット可変
「問わず。なんでもOK」
◆ポジション数
「問わず。なんでもOK」
◆ストップロス設定
「問わず。なんでもOK」
「ストップロス設定なしでもOK」
以上を、ナンピンEAの出品申請の条件とさせて頂きます。
ナンピンEAをご出品される場合、以下パラメータをユーザー様側でセットできますようオープンパラメータとしていただきたく宜しくお願い致します。
◆最大ポジション数
制限を持たせたくない場合は、初期値=100000等でも構いません。
※報酬計算について
「ナンピンEAにつきましては、月末時点の含み損を差し引いた金額」でフォワード成績を計算する仕組みといたします。
例1)月末時点の含み損が1,000円で当月利益が1,800円であった場合、確定利益は1,800円-1,000円=800円として報酬計算をします。
例2)月末時点の含み損が1,500円で当月利益が600円の場合、600円-1,500円=-900円となり、確定損益がマイナスになりますので、報酬は発生しません。
利益が出ていましても月末時点でそれ以上の含み損を抱えていれば「EAとしての成績はマイナス」と判定されます。
例3)通常タイプとナンピンタイプのEAを両方ご出品頂いている場合
通常タイプ:+1,000円
ナンピンタイプ;-4,000円(確定益+1,000円・含み損-5,000円)
この場合は、-3,000円で報酬無しとなります。
以上、ご理解のほど宜しくお願い致します。
そのため、EA-BANKに登録している他のEAと重複しないような設定をお願いしております(「12345」等の単純な数字はお控えください)。
万が一、他EAと重複していた場合、MagicNumberの変更をお願いさせていただきます。あらかじめご了承ください。
また、EA-BANKの利用者様は複数のEAを同時稼働する傾向がありますので、他EAとの干渉が起きないようプログラムには最新の注意をお願いいたします。
EA-BANKでは、EA作者様への報酬は作成したEAの運用成績によって決定いたしますので、提出していただいたEA(ex4ファイル)をそのままセットいたします。
運用ミスを防ぎ、運用ロットの足並みを揃えるため、最大ドローダウンが1,000ドルを超えない初期ロット数に制限させていたいております。
ご理解、ご協力をお願いいたします。
ご本人確認書類のご提出は、EA-BANKマイページより宜しくお願い致します。