トップ  >  リファレンス  >  共通関数  >  WebRequest
スポンサーリンク
検索
カスタム検索
リファレンスツリー
オススメ

天才数学者のエドワード・オークリー・ソープの物語とジョン・ケリーの公式は必見です。
WebRequest


WebRequest


指定されたサーバーにHTTPリクエストを送信します。

この関数は2つのバリアントがあります。

関数書式(シンプルなリクエスト送信):
Content-Type:application/x-www-form-urlencodedヘッダを使用した"key=vaule"タイプのシンプルなリクエスト送信
int  WebRequest(
   const string      method,           // HTTPメソッド 
   const string      url,              // URL
   const string      cookie,           // cookie
   const string      referer,          // リファラ
   int                timeout,          // タイムアウト
   const char        &data[],          // HTTPメッセージ本体の配列
   int                data_size,        // data[]配列のサイズ(バイト単位)
   char              &result[],         // サーバーの応答データを含む配列
   string            &result_headers    // サーバー応答のヘッダ
   );


関数書式(任意のタイプのリクエスト送信):
様々なWebサービスとより柔軟な相互作用のヘッダーのカスタムセットを指定するリクエスト送信
int  WebRequest(
   const string      method,           // HTTPメソッド
   const string      url,              // URL
   const string      headers,          // ヘッダー 
   int                timeout,          // タイムアウト
   const char        &data[],          // HTTPメッセージ本体の配列
   char               &result[],        // サーバーの応答データを含む配列
   string            &result_headers    // サーバー応答のヘッダ
   );



■引数
引数名 初期値 I/O 詳細
method - In HTTPメソッド
url - In URL
headers - In 改行("\n","\r")で区切られたリクエストヘッダのタイプ(key:value)
cookie - In Cookie値
timeout - In タイムアウト(msec単位)
data[] - In HTTPメッセージ本体の配列
data_size - In data[]のサイズ(バイト単位)
result[] - Out サーバーの応答データを含む配列
result_headers - Out サーバー応答のヘッダ


■戻り値
HTTPサーバーの応答コードを返します。
エラーの場合は-1を返します。



■備考
WebRequest()関数を使用し、
ターミナルオプションの「エキスパートアドバイザー」タブで許可されたURLリストに
必要なサーバーのアドレスを追加します。

サーバーポートは指定されたプロトコルに基づいて自動的に選択されます。
80 :"http://"
443:"https://"


WebRequest()関数は非同期です。
これはプログラム実行の一時中断やリクエストサーバーからの応答を待つ事を意味します。

応答受信の遅延が大きくなる可能性があるので、
WebRequest()関数関数はインジケータからの呼び出しには使用できません。

インジケータは1通貨ペアのチャート上の全てのインジケータによって共有される共通スレッドで実行される為、
1通貨ペアのチャートのインジケータパフォーマンスの遅延は、
同じ通貨ペアの全てのチャートの更新を停止します。
インジケータ関数から呼び出そうとした場合、
GetLastError()はエラー4060(ERR_FUNCTION_NOT_CONFIRMED)を返します。

WebRequest()関数はEAとスクリプトから呼び出す事が出来ます。
EAとスクリプトは独自のスレッドで実行しています。

ストラテジーテスターでは使用出来ません。




サンプルソース(シンプルなリクエスト送信):
void OnInit(){

    string cookie=NULL,headers;
    char   post[],result[];
    int    res;


    // FXCMジャパン証券の経済指標カレンダーのサイトデータを取得
    string req_url = "http://www.fxcm.co.jp/market/indicators/index.php";

    res = WebRequest( 
                    "GET",      // HTTPメソッド
                    req_url,    // URL
                    cookie,     // cookie
                    NULL,       // リファラ
                    5000,       // タイムアウト
                    post,       // HTTPメッセージ本体
                    0,          // HTTPメッセージサイズ
                    result,     // 応答データ配列
                    headers     // 応答ヘッダ
    );
                    
    
    if(res == -1) {// エラーチェック
        Print("WebRequesエラー。 エラーコード  =",GetLastError());

        MessageBox(
                    "ターミナルオプションの「エキスパートアドバイザータブ」の設定で\n '"
                    +req_url
                    +"' \nのURLを\n「Allow WebRequest for listed URL」のリストに追加して下さい。"
                    ,"HTTPリクエストエラー"
                    ,MB_ICONINFORMATION);

    } else {
        PrintFormat("ロード成功。 取得ファイルサイズ =%d [KB]",ArraySize(result)/1024);
        
        int filehandle = FileOpen("FXCM_ECOFILE.htm", FILE_WRITE|FILE_BIN); // 取得データ保存用のファイルを作成
        
        if( filehandle != INVALID_HANDLE) {                                // ファイルハンドラチェック
            FileWriteArray(filehandle,result,0,ArraySize(result));        // 取得データをファイルに書き込み
            FileClose(filehandle);                                          // ファイルハンドラ解放
        } else {
            Print("FileOpenエラー。 エラーコード=",GetLastError());
        }
    }
}



サンプルソースを実行すると、取得したWebサイトのデータが"ターミナルディレクトリ\MQL4\Files"に保存されます。



htmlソースコードのみ取得しているので、画像が無かったりレイアウトが異常になっていますが、
htmlソースコードから経済指標のデータを抽出してチャート上に表示させるプログラムの為のデータに使えます。



経済指標のスケジュールをcsvデータで公開しているサイト(英語ですけど)もありますので、
csvファイルを取得した方が経済指標データの抽出は簡単だと思います。

私はFXCMジャパン証券の経済指標カレンダー ( http://www.fxcm.co.jp/market/indicators/index.php )から、
必要な経済指標データを抽出してEAに組み込んでいます。
あとはトレーダーズウェブFXの市場カレンダー ( http://www.traderswebfx.jp/calendar/ )から
要人発言・債券入札・週間原油在庫の予定を取得しています。







管理人の勝手なコメント:
2つ目のバリアントの、任意のタイプのリクエスト送信用のWebRequest関数を使用してみたのですが、
"引数の数が異常です"という事でエラーになりました。
MQL4ではオーバーロードされていないのかもしれません。MQL5専用??
2015/05/25追記:Build 825で実装されました。



スポンサーリンク



Copyright ©2015 MT4でEA自作しちゃお〜 All Rights Reserved.


Top

inserted by FC2 system