1

これを使用してURL、Quandl Web サイトからコンテンツを取得しています。

https://www.quandl.com/api/v3/datasets/FRED/PAYEMS.csv?exclude_column_names=true&rows=1&api_key=my_api_key

Quandl サーバーは、上記の要求に対する応答として、次の値を返します。

2016-08-01, 144598.0

内でのを使用する必要があるため、次のようになります。144598.0MQL4 Script

Q1. MQL4上記の URL からコンテンツを取得してスクリプト内で使用するにはどうすればよいですか?

SO ( https://stackoverflow.com/users/3666197/user3666197) の非常に親切なユーザーが、これを達成するのを助けるために、次の( MQL4: Read single value from CSVscriptで見つかったオリジナル) (いくつかの部分を自分で追加) を提供してくれましたが、機能させることができませんでした:

// Code created with the help of Stack Overflow question
// https://stackoverflow.com/questions/39279634/mql4-read-single-value-from-csv/39284875#39284875
// Question by p.luck:
// https://stackoverflow.com/users/5551849/p-luck
// Answer by user3666197:
// https://stackoverflow.com/users/3666197/user3666197

void OnStart()
{    
     string cookie = NULL,
            headers; 
     char   post[],
            result[]; 
     int    res; 

/*   TODO:                                                                             *
 *   Must allow MT4 to access the server URL,                                          *
 *   you should add URL "https://www.quandl.com/api/v3/datasets/FRED/PAYEMS.csv" *
 *   in the list of allowed URLs                                                       *
 *   ( MT4 -> Tools -> Options -> [Tab]: "Expert Advisors" ):                          */

     string aDataSOURCE_URL = "https://www.quandl.com/api/v3/datasets/FRED/PAYEMS.csv";
     string aDataSOURCE_API = "?exclude_column_names=true&rows=1&api_key=my_api_key";

     //-- Create the body of the POST request for API specifications and API-authorization
     ArrayResize( post,
                  StringToCharArray( aDataSOURCE_API, // string   text             |--> [in]  String to copy.
                                     post,            // uchar   &array[]       <--|    [out] Array of uchar type.
                                     0,               // int      start =  0       |--> [in]  Position from which copying starts. Default - 0. 
                                     WHOLE_ARRAY,     // int      count = -1       |--> [in]  Number of array elements to copy. Defines length of a resulting string. Default value is -1, which means copying up to the array end, or till terminating '\0'. Terminating zero will also be copied to the recipient array, in this case the size of a dynamic array can be increased if necessary to the size of the string. If the size of the dynamic array exceeds the length of the string, the size of the array will not be reduced.
                                     CP_UTF8          // uint     cp    = CP_ACP   |--> [in]  The value of the code page. For the most-used code pages provide appropriate constants.
                                     )
                  - 1
                  );

//-- Reset the last error code
     ResetLastError();

//-- Loading a html page from Quandl
     int timeout = 5000;                                                //-- Timeout below 1000 (1 sec.) is not enough for slow Internet connection

     res = WebRequest( "POST",              // const string  method            |--> [in]  HTTP method.
                        aDataSOURCE_URL,    // const string  URL               |--> [in]  URL.
                        cookie,             // const string  cookie            |--> [in]  Cookie value.
                        NULL,               // const string  referrer          |--> [in]  Value of the Referer header of the HTTP request.
                        timeout,            //       int     timeout           |--> [in]  Timeout in milliseconds.
                        post,               // const char   &data              |--> [in]  Data array of the HTTP message body
                        ArraySize( post ),  //       int     data_size         |--> [in]  Size of the data[] array.
                        result,             //       char   &result         <--|    [out] An array containing server response data.
                        headers             //       string &result_headers <--|    [out] Server response headers.
                        );
//-- Check errors
     if ( res == -1 )
     {    Print( "WebRequest Error. Error code  = ", GetLastError() );  //-- Perhaps the URL is not listed, display a message about the necessity to add the address
          MessageBox( "Add the address '" + aDataSOURCE_URL + "' in the list of allowed URLs on tab 'Expert Advisors'", "Error", MB_ICONINFORMATION );
          }
     else //-- Load was successfull
     {    
          PrintFormat( "The data has been successfully loaded, size = %d bytes.", ArraySize( result ) );

          //-- parse the content ---------------------------------------
          /*
              "2016-08-01, 144598.0"

          */
          //-- consume the content -------------------------------------
          //...


          }
     }

URL
https://www.quandl.com/api/v3/datasets/FRED/PAYEMS.csv
を のリストに追加しましallowed URLsMT4

( )という名前のを有効にしてのAutoTradingにドラッグすると、内に次のメッセージが表示されます。scripttutorial7chartUSDCAD,M1
Experts tab

  • Script tutorial7 USDCAD,M1: loaded successfuly
  • tutorial7 USDCAD,M1: initialized
  • tutorial7 USDCAD,M1: The data has been successfully loaded, size = 0 bytes
  • tutorial7 USDCAD,M1: uninit reason 0

確かに " " なら " The data has successfully loaded" と言うべきではありませんsize = 0 bytesか?

直接コピーしてscript貼り付けるだけで、これは正しく機能するはずですか?MetaQuotes Language Editorcompile

に を追加し、URLこのコードallowed URLsMT4にコピーして貼り付けるscript以外に、何かしなければならないことはありますか?

もしそうなら、どのように?

上記のコードを;ではScript なく実行しています。Expert Advisorこれは大丈夫ですか?

Q2. 取得した 144598.0 の値をスクリプト内の変数として設定できますか?

変数を別の と比較できるようvalueにする必要があります。144598.0value

この作品のようなものでしょうか:

void OnStart()
{

... // above code which fetches the value from the .csv URL

double x = 155876.0     // value manually typed in
       y = 144598.0     // value fetched from the .csv URL using the above code
                        // ignores column 1 consisting of 2016-08-01
   if ( x > y ) {
                        // execute code
} 

else { 
                        // execute other code
}

}
4

1 に答える 1

2

A2:はい!これは旅の最も簡単な部分です。
A1:しかし!
実際にはどのように機能しますか?Quandl と実際に
どのように話しているので、それを取得するのですか?MetaTrader Terminal

HttpServer最初に、リモート側の処理の問題を説明しましょう。

端末ウィンドウ (または Windows ウィンドウ) 内に、Quandlのリモートが、HTTP プロトコルを介して通信される、ローカルで組み立てられた要求のさまざまな構成にどのように応答するかを示す、簡単にプロトタイプを作成できるプログラムcurl(Linux および DOS バージョンが利用可能) があります。cmdHttpServer

再入力したばかりの URL によって、配信される履歴全体が生成されることに注意してください。

C:\>curl https://www.quandl.com/api/v3/datasets/FRED/PAYEMS.csv
DATE,VALUE
2016-08-01,144598.0
2016-07-01,144447.0
...
..
.
1939-03-01,30280.0
1939-02-01,30101.0
1939-01-01,29923.0

プレーンにさらにパラメーターを追加するURLと、リモート側 ( the HttpServer) は応答を関心のある 1 行だけに変更します。

C:\>curl -G --data rows=1 --data exclude_column_names=true https://www.quandl.com/api/v3/datasets/FRED/PAYEMS.csv
2016-08-01,144598.0

クールで見栄えがよく、私たちが望むほぼ単一の値です!

しかし、ここで魔法が起こります。

ローカル プロセス (curl現在は、後で MetaTrader ターミナル) 間の実際の交換 (ダイアログ) は次のようになります (コマンドラインの--verboseオプションを使用):curl

C:\>curl --verbose -G --data rows=1 --data exclude_column_names=true https://www.quandl.com/api/v3/datasets/FRED/PAYEMS.csv
*   Trying 54.174.87.84...
* Connected to www.quandl.com (54.174.87.84) port 443 (#0)
* schannel: SSL/TLS connection with www.quandl.com port 443 (step 1/3)
* schannel: checking server certificate revocation
* schannel: sending initial handshake data: sending 70 bytes...
* schannel: sent initial handshake data: sent 70 bytes
* schannel: SSL/TLS connection with www.quandl.com port 443 (step 2/3)
* schannel: failed to receive handshake, need more data
* schannel: SSL/TLS connection with www.quandl.com port 443 (step 2/3)
* schannel: encrypted data buffer: offset 4096 length 4096
* schannel: encrypted data length: 4017
* schannel: encrypted data buffer: offset 4017 length 4096
* schannel: received incomplete message, need more data
* schannel: SSL/TLS connection with www.quandl.com port 443 (step 2/3)
* schannel: encrypted data buffer: offset 4569 length 5041
* schannel: sending next handshake data: sending 318 bytes...
* schannel: SSL/TLS connection with www.quandl.com port 443 (step 2/3)
* schannel: encrypted data buffer: offset 51 length 5041
* schannel: SSL/TLS handshake complete
* schannel: SSL/TLS connection with www.quandl.com port 443 (step 3/3)
* schannel: incremented credential handle refcount = 1
* schannel: stored credential handle in session cache
> GET /api/v3/datasets/FRED/PAYEMS.csv?rows=1&exclude_column_names=true HTTP/1.1
> Host: www.quandl.com
> User-Agent: curl/7.45.0
> Accept: */*
>
* schannel: client wants to read 16384 bytes
* schannel: encdata_buffer resized 17408
* schannel: encrypted data buffer: offset 0 length 17408
* schannel: encrypted data got 653
* schannel: encrypted data buffer: offset 653 length 17408
* schannel: decrypted data length: 623
* schannel: decrypted data added: 623
* schannel: decrypted data cached: offset 623 length 16384
* schannel: encrypted data buffer: offset 0 length 17408
* schannel: decrypted data buffer: offset 623 length 16384
* schannel: schannel_recv cleanup
* schannel: decrypted data returned 623
* schannel: decrypted data buffer: offset 0 length 16384
< HTTP/1.1 200 OK
< Cache-Control: private
< Content-Disposition: attachment; filename=FRED-PAYEMS.csv
< Content-Transfer-Encoding: binary
< Content-Type: text/csv
< Date: Wed, 07 Sep 2016 12:47:20 GMT
< ETag: W/"adfdb97850c493cdd03e2036574bc404"
< Server: openresty
< Vary: Origin
< X-API-Version: 2015-04-09
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
< X-Rack-CORS: preflight-hit; no-origin
< X-RateLimit-Limit: 50
< X-RateLimit-Remaining: 42
< X-Request-Id: c609e92d-22d2-40e7-b7d4-cacb07467c76
< X-Runtime: 0.023534
< X-XSS-Protection: 1; mode=block
< Content-Length: 20
< Connection: keep-alive
<
2016-08-01,144598.0
* Connection #0 to host www.quandl.com left intact

行に注意してくださいGET /api/v3/datasets/FRED/PAYEMS.csv?rows=1&exclude_column_names=true

したがって、魔法は、MetaTrader ターミナルが同じものを組み立てるようにし、構成の許可されたリストに URL を許可することです (これは、他の投稿で既に行っています)。

また、気づいたかもしれませんがHTTP GET<HttpServer_relative_part_of_the.URL>


魔法は、MQL4コードが上記と同じリクエストを送信し、データを取得できるようにすることです。

WebRequest()HTTP GETQuandlは同じリクエスト例のバージョンにHttpServer応答せず、0 バイトを返すため、使用する必要があります (上記の例からスイッチを省略してください)。HTTP POST-Gcurl

すべての条件を一度に満たすと、次のものを受け取っ2016-08-01,144598.0て使用できるようになります。

int    anAmountOfBytesRECVd   = 0;          // how many bytes Quandl sent 
string headers_FromHttpSERVER;              // stores as a string
char   anAnswerFromHttpSERVER[];            // stores as a byte-array ( char[] )
double y_value = NULL;

anAmountOfBytesRECVd = WebRequest( "GET",   // MUST use HTTP GET <- Quandl tested
                                    ...
                                    anAnswerFromHttpSERVER,
                                    headers_FromHttpSERVER
                                    );

y_value = StrToDouble( CharArrayToString( anAnserFromHttpSERVER, // [2|0|1|6|-|0|8|-|0|1|,|1|4|4|5|98|.|0]
                                          11,                    //-----------------------^_______________( -1 == TILL EndOfSTRING )
                                          -1
                                          )
                       );
于 2016-09-07T13:30:01.827 に答える