認証コードの挿入
認証コードは該当編集窓に全文を張り付けて、挿入をクリックすることにより自動実行されますが、以下の点に
ご注意の上、実行してください。決済EAなどのポジションを取る動きをする全自動でないEAの場合もインジケーターとしてのご出品になりますが、その場合はこちらの認証コードは利用できませんので、別途ご相談ください。
1.冒頭の#property命令文の後に次のコードが存在するか確認して下さい。
[挿入例]
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
//GogoJungle top////////////////////////////////////////////////////|
string pid = "12890";
string AccountCert;
#import "wininet.dll"
#define INTERNET_OPEN_TYPE_DIRECT 0
#define AGENT "MetaTrader 4 Terminal"
#define READURL_BUFFER_SIZE 1000
int InternetOpenW(string sAgent, int lAccessType, string sProxyName="", string sProxyBypass="", int lFlags=0);
int InternetOpenUrlW(int hInternetSession, string sUrl, string sHeaders="", int lHeadersLength=0, int lFlags=0, int lContext=0);
int InternetReadFile(int, uchar & arr[], int, int & arr[]);
int InternetCloseHandle(int hInet);
#import
string GrabWeb(){
int ErrCd = 0;
string mes = "";
if(!IsDllsAllowed()) { ErrCd=1; mes="認証失敗 - DLLの使用を許可してください:by GogoJungle"; }
else if(StringFind(WindowExpertName(), "_", 0)==-1){ ErrCd=11; mes=WindowExpertName()+".ex4 は無効です。サイトから再ダウンロードしてください:by GogoJungle"; }
if(ErrCd>0) return(mes);
if(IsTesting()) { mes="正常認証 - テストモード:by GogoJungle"; return(mes); }
int lReturn[1];
uchar arrReceive[];
string sid = GetSid();
string strUrl = StringConcatenate("https://auth.fx-on.com/indicator/index.php?pid=",pid, "&sid=",sid,"&ac=",AccountCompany(),"&an=",IntegerToString(AccountNumber()));
int hSession = InternetOpenW(AGENT, INTERNET_OPEN_TYPE_DIRECT, "0", "0", 0);
int hInternet = InternetOpenUrlW(hSession, strUrl, NULL, 0, 0, 0);
ArrayResize(arrReceive, READURL_BUFFER_SIZE + 1);
int success = InternetReadFile(hInternet, arrReceive, READURL_BUFFER_SIZE, lReturn);
string errmes = "認証失敗 - 接続エラー:by GogoJungle";
if( success==0 ){
InternetCloseHandle(hSession);
return(errmes);
}
string strThisRead = CharArrayToString(arrReceive, 0, ArraySize(arrReceive), CP_UTF8);
InternetCloseHandle(hSession);
if(StringSubstr(strThisRead, 0, 2)!="正常" && StringSubstr(strThisRead, 0, 2)!="認証") return(errmes);
else return(strThisRead);
}
void Disp(string s){Print(s);Comment(s);}
string GetSid(){
string filename=WindowExpertName();
int strpos = 0;
int cutlen = 0;
for(int a=0; a<10 ; a++){ strpos = StringFind(filename, "_", 0)+1;
if(strpos<=0) break;
cutlen = StringLen(filename)-strpos;
filename = StringSubstr(filename, strpos, cutlen);
}
return(filename);
}
int IndicatorCountedFXON(){
if(AuthInitiarize == false){
AuthInitiarize = true;
return(0);
}
return IndicatorCounted();
}
bool AuthInitiarize = false;
bool AuthResult = false;
bool AuthTry = false;
// GogoJungle top ////////////////////////////////////////////////////|
2.int OnInit()内の最上部に次のコードが存在するか確認して下さい。
コード内の最終行「EventSetTimer(5);」はOnInit()内にEventSetTimerまたはEventSetMillisecondsTimerが存在しなかった場合のみ挿入されます。
すでにOnInit()内でEventSetTimerまたはEventSetMillisecondTimerを使用している場合は不要です。
OnInit()は必ずint型を使用して下さい。
void OnInit()の場合はint OnInitへ変更をお願いいたします。
[挿入例]
int OnInit()
{
// GogoJungle OnInit /////////////////////////////////////////////////|
if(AccountNumber() == 0){
AuthResult = false;
AuthTry = true;
}
else{
AccountCert = GrabWeb();
Disp(AccountCert);
if(StringFind(AccountCert, "success") == -1){return(INIT_FAILED);}
else{AuthResult = true;} }
EventSetTimer(5);
// GogoJungle OnInit /////////////////////////////////////////////////|
return(INIT_SUCCEEDED);
}
3.int OnCalculate()内の最上部に次のコードが存在するか確認して下さい
[挿入例]
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
// GogoJungle OnCalculate /////////////////////////////////////////////////|
if(AuthResult == false){return(0);}
// GogoJungle OnCalculate /////////////////////////////////////////////////|
}
4.void OnTimer()内の最上部に次のコードが存在するか確認して下さい。
実行関数にstart()を使用している場合はelse内の記述が
AuthResult = true;
start();
となります。
[挿入例]
void OnTimer()
{
// GogoJungle OnTimer /////////////////////////////////////////////////|
if(AuthTry == true && AccountNumber() > 0){
AccountCert = GrabWeb();
Disp(AccountCert);
AuthTry = false;
if(StringFind(AccountCert, "success") == -1){AuthResult = false;}
else{
AuthResult = true;
long volume[];
int spread[];
ArrayResize(volume, Bars, 0);
ArrayResize(spread, Bars, 0);
ArrayInitialize(volume, 0);
ArrayInitialize(spread, 0);
OnCalculate(Bars, 0, Time, Open, High, Low, Close, Volume, volume, spread);
}
}
// GogoJungle OnTimer /////////////////////////////////////////////////|
}
5.コード内のIndicatorCounted()がIndicatorCountedFXON()に置換されているか確認して下さい。
初期化関数、ティック時実行関数は「int OnInit()」「int OnCalculate()」の形式でお願いいたします。
システムファイルをフォルダにコピー、圧縮してアップロードをします。
2015年9月17日12時から、web認証の方法が新しくなり、圧縮ファイルに関して以下の3点が変更されています。web認証を使用した商品を出品されるお客様は、特に2点目の「圧縮ファイルの構成」と3点目の「フォルダ、ファイル名に使用できる文字列」の部分、お手数ですがご協力よろしくお願いいたします。
・圧縮ファイルの種類 zipのみ
・フォルダ、ファイル名に使用できる文字列 下記の半角英数のみ
0~9、a~z(大文字可)、アンダーバー(_)
・圧縮ファイルの構成
認証が必要な(認証コードを挿入したex4ファイル)ファイルはzip直下に、
それ以外のファイル(認証が不要なex4やマニュアル等)はzip直下に任意の名称でフォルダを作成し
そこにまとめてください。このフォルダ内の構成は特に指定はございません。
これは、zip直下のex4ファイルにのみweb認証に必要な識別子を付与するためです。
購入者が商品をダウンロードすると、zip直下のex4ファイルの末尾には8桁程度の英数字が
付与されるようになっています。
【圧縮ファイルの構成例】
例1) 商品がaaa.ex4ファイル1つのみで FX_ON_IND1.zip をアップロードする場合
FX_ON_IND1.zip
|- aaa.ex4
FX_ON_IND1.zipの構成
例2) 商品がaaa.ex4とbbb.ex4ファイル2つで、両方に認証コードを挿入し、
FX_ON_IND2.zip をアップロードする場合
FX_ON_IND2.zip
|- aaa.ex4
|- bbb.ex4
FX_ON_IND2.zipの構成
例3) 商品がaaa.ex4とbbb.ex4ファイル2つで、aaa.ex4のみ認証コードを挿入し、
FX_ON_IND3.zip をアップロードする場合
FX_ON_IND3.zip
|- cccフォルダ
|- bbb.ex4
|- aaa.ex4
FX_ON_IND3.zipの構成
例4) 商品がaaa.ex4とbbb.pdfファイル(マニュアル等のドキュメント)2つで、
aaa.ex4に認証コードを挿入し、 FX_ON_IND4.zip をアップロードする場合
FX_ON_IND4.zip
|- cccフォルダ
|- bbb.pdf
|- aaa.ex4
FX_ON_IND4.zipの構成
【上記例の商品を購入者がダウンロードしたときのファイル構成】
例1) 識別子が付与されたex4ファイル
商品.zip
|- aaa_1234ABCD.ex4
例2) 識別子が付与されたex4ファイルが2つ
商品.zip
|- aaa_1234ABCD.ex4
|- bbb_1234ABCD.ex4
例3) cccフォルダの構成は変更なく、zip直下のex4ファイルのみ識別子が付与されている
商品.zip
|- cccフォルダ
|- bbb.ex4
|- aaa_1234ABCD.ex4
例4) 例3と同じ
商品.zip
|- cccフォルダ
|- bbb.pdf
|- aaa_1234ABCD.ex4
例2ように認証コードを入れたex4が複数ある場合には、
全てのexファイルに同じ識別子が付与され、
それぞれのインジケーター適用時に都度都度認証します。
商品にマニュアルを含めていらっしゃる出品者の方々には大変お手数をおかけしてしまいますが
新しいフォルダ構成を踏まえた記述に修正していただきますようお願いいたします。
何卒ご理解賜りますようよろしくお願いいたします。



