MQL4: чтение одного значения из CSV
Я пытаюсь получить одно значение с веб-сайта источника данных Quandl
для использования в MetaTrader4
скрипт. Сайт источника данных предоставляет метод для экспорта данных через API formats
в том числе .csv
, .json
или же .xml
, Я выбрал .csv
формат, который веб-сайт источника данных обеспечивает API call
для меня, чтобы использовать в следующем формате:
https://www.quandl.com/api/v3/datasets/ADB/LAB_UNEMP_JPN.csv?rows=1&api_key=my_api_key
Используя rows=1
параметр в приведенном выше API call
Я могу выбрать, чтобы просто экспортировать одно значение (которое является latest value
).
Q1. Могу ли я получить значение прямо из Quandl или мне нужно сохранить набор данных в виде файла.csv?
Так как Quandl
обеспечивает API call
(как видно выше), я был бы прав, предполагая, что я могу просто получить value
с их сайта и не нужно будет сохранять набор данных на моем компьютере как .csv
файл, который я тогда должен был бы получить latest value
от? Я бы предпочел получить value
прямо из Quandl
без сохранения каких-либо файлов.
Q2. Как я могу получить значение, которое будет использоваться в моем скрипте MT4?
Я безуспешно пытался использовать метод FileOpen()
для доступа к данным на сайте, а затем попытались print
так что я могу сравнить value
другим. Является FileOpen()
только для .csv
файлы сохраняются только на моем компьютере? Я хотел бы иметь возможность print
value
в моем сценарии однажды получен, чтобы я мог его использовать. Вот что у меня так далеко:
int start() {
while (!IsStopped()) {
Sleep(2000);
int handle;
int value;
handle=FileOpen("https://www.quandl.com/api/v3/datasets/ADB/LAB_UNEMP_JPN.csv?rows=1&api_key=my_api_key", FILE_CSV, ';');
if(handle>0)
{
value=FileReadNumber(handle);
Print(handle);
FileClose(handle);
}
}
Если бы кто-нибудь мог помочь мне в моем стремлении извлечь это значение и напечатать его в моем сценарии, это было бы огромной помощью.
1 ответ
A1:
Нет, вам не нужно использовать прокси-файл для этого API
Если вы попробуете вызов API, используя опубликованный синтаксис Quandl: <pragma>://<URL.ip>/<relative.URL>[?<par.i>=<val.i>[&<par.j>=<val.j>[&...]]]
серверная часть будет выдвигать вам содержимое:
Date,Value
2013-12-31,4.0
Итак, ваш код может использовать Quandl API с таким образом:
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/ADB/LAB_UNEMP_JPN.csv" *
* in the list of allowed URLs *
* ( MT4 -> Tools -> Options -> [Tab]: "Expert Advisors" ): */
string aDataSOURCE_URL = "https://www.quandl.com/api/v3/datasets/ADB/LAB_UNEMP_JPN.csv";
string aDataSOURCE_API = "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 ---------------------------------------
/*
"Date,Value
2013-12-31,4.0"
*/
//-- consume the content -------------------------------------
//...
}
}
Есть 4 основных пункта, чтобы позаботиться о:
0:
MT4
разрешение на использование данного URL
1:
API URL
настроить - <pragma>://<URL.ip>/<relative.URL>
2:
API const char &data[]
в сборе. [?<par.i>=<val.i>[&<par.j>=<val.j>[&...]]]
3:
API int data_size
расчет длины
Приложение: Это скорее список причин, почему следует избегать использования Нового - MQL4.56789
WebRequest()
варианты функций:
В то время как MQL4
документация обещает простое использование WebRequest()
варианты функций, (цит.:) "1. Отправка простых запросов типа" key=value
"используя заголовок Content-Type: application/x-www-form-urlencoded
", реальность далека от обещанного простого варианта использования:
0:
СОВЕРШЕНО: административный шаг MT4 (слабость: невозможно заставить MT4 взаимодействовать { http | https }
протокол (ы) через другие порты по умолчанию ~ { :80 | :443 }
1:
URL
состоит из двух (трех, если используется :port
спецификатор, который не работает в MT4
(ссылка 0: справа вверху)) части. <URL.ip_address>
является первым и может быть выражен в канонической форме IPv4 (10.38.221.136
) или в переводимой DNS форме (MT4_APAC_PRIMARY.broker.com
). Вторая часть, <relative.URL>
, указывает сам HttpServer, где находится файл (это HttpServer- относительное местоположение файла). Опубликованный веб-запрос разрешает использовать обе части, соединенные вместе, исх. aDataSOURCE_URL
,
3:
API WebServer, если он сконструирован так, может позволить добавить некоторые дополнительные параметры, которые могут быть указаны и представлены в WebServer. Презентация зависит от того, { HTTP GET | HTTP POST }
опция протокола выбрана на стороне вызывающего абонента.
4:
каждый звонок на МТ4 WebRequest()
также требует, чтобы вызывающая сторона указала длину data
параметр содержимого (ссылка на использование ArraySize( post ), // int data_size
)