MQL4を使ってRSSニュースフィードを読むには
はじめに
本稿は、記事HTML Walkthrough Using MQL4(MQL4を使ったHTMLウォークスルー)にある関数を使って、MQL4でRSSマークアップ言語を読む方法について書かれています。読者はその記事を読んでいるか、少なくもそこで説明されたアイディアに対し一般的な理解があるものとします。
RSSとは何でしょうか?なぜそれがMQL4で必要なのでしょうか?
RSSとは、あるソースから別のソースへ、様々なデータを送るためのXMLフォーマットのことです。
RSSはマスメディアや一般の会社、様々なニュースウェブサイトでよく使われているものです。
RSSは多くのスペシャル・アプリケーション(リーダー)によって集められ(読まれて)、便宜的な形式でユーザーに届けられるものです。本稿では、ニュース・インディケーターかMQL4言語のRSSリーダーに使用することができるワークピースの作成にチャレンジします。RSSで我々が興味を持つ情報とは一体何でしょうか?それはもちろんニュースでしょう。
既に述べた通り、RSSはXMLフォーマットです。では、XMLとは何でしょうか?
Xml(eXtensible Markup Language(拡張可能マークアップ言語))はストラクチャー・データを補完するテキストフォーマットのことです。ストラクチャーは視覚的に木の要素ように見えます。XML要素はタグに囲われて表現されています。
以下は簡単なXMLドキュメントの例です。
<!--?xml version="1.0" encoding="windows-1252"?--> <weeklyevents> <event> <title>Rightmove HPI m/m</title> <country>GBP</country> <date><!--[CDATA[05-15-2011]]--></date> <time><!--[CDATA[23:01]]--></time> <impact><!--[CDATA[Medium]]--></impact> <forecast> <previous><!--[CDATA[1.7%]]--></previous> </forecast></event> </weeklyevents>
実行
上の例を見ると、XMLはどこかHTMLと同じようなものに見えます。したがって、”車輪の再発明”をしないように、記事 HTML Walkthrough Using MQL4(MQL4を使ったHTMLウォークスルー)のコードを使用しましょう。
最初に必要なことは、HTMLウォークスルー関数をプロジェクト(またはインディケーター)につなげることです。そのために、ReportHTMLtoCSV-2.mq4ファイルをダウンロードし、experts内のフォルダに保存してください。このファイルを関数ライブラリとして使用するので、start()関数を、そこにコメントアウトしてください。
また、分かり易いようにファイルの名前を変える(例:HTMLTagsLib.mq4)べきでしょう。
ファイルの準備ができました。では次にインディケーターにつなげます(インディケーターのためワークピースはページ下に添付しています)。
#include <htmltagslib.mq4>
ここで、wininet.dllウィンドウズ・スタンダード・ライブラリをリンクさせます。
#include <winuser32.mqh> #import "wininet.dll" int InternetAttemptConnect(int x); int InternetOpenA(string sAgent, int lAccessType, string sProxyName = "", string sProxyBypass = "", int lFlags = 0); int InternetOpenUrlA(int hInternetSession, string sUrl, string sHeaders = "", int lHeadersLength = 0, int lFlags = 0, int lContext = 0); int InternetReadFile(int hFile, int& sBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[]); int InternetCloseHandle(int hInet); #import
URLを読み込むためにReadWebResource(string url)関数を使用しましょう。関数のオペレーションは本稿の主目的ではありません。なので、そのことについては掘り下げません。
ここではそのインプットとアウトプットのみを考えていきます。関数は読まれるリンクを受け取り、リソース内容をstringとして返します。
タグを検証するために、HTMLTagsLib.mq4ファイルから2つの関数を使用します。 - FillTagStructure()と GetContent()です。これらの関数については、記事HTML Walkthrough Using MQL4(MQL4を使ったHTMLウォークスルー)に詳しく書かれています。検証のためのインプット・データは、array(配列)としてパスされることに注意してください。このため、データを受け取った後は、 ReadWebResource(string url)関数を使ってarrayに置き換えなれければいけません。
ArrayFromString()は以下のようなものです。
//+------------------------------------------------------------------+ int ArrayFromString(string & webResData[], string inputStr, string divider) { if (inputStr == "") { Print ("stringが入力されていません"); return(0); } if (divider == "") { Print ("セパレータがセットされていません"); return(0); } int i, stringCounter = 0; string tmpChar, tmpString, tmpArr[64000]; int inputStringLen = StringLen(inputStr); for (i = 0; i < inputStringLen; i++ ) { tmpChar = StringSubstr(inputStr, i, 1); tmpString = tmpString + tmpChar; tmpArr[stringCounter] = tmpString; if (tmpChar == divider) { stringCounter++; tmpString = ""; } } if (stringCounter > 0) { ArrayResize(webResData, stringCounter); for (i = 0; i < stringCounter; i++) webResData[i] = tmpArr[i]; } return (stringCounter); }
3つのargument変数が関数のインプットにパスされます。最初の変数は関数のオペレーション結果が保管されるarrayへのリンクです。2番目はarrayに置き換えられるsrting変数で、3番目はセパレータです。string変数が分割されます。関数は処理結果のarrayに列数を返します。
これでデータは検証準備が整いました。
次の処理において、データを分析して、ターミナルのコンソール画面にtitle値とcountryタグを表示します。
string webRss = ReadWebResource(rssUrl); int i, stringsCount = ArrayFromString(webResData, webRss, ">"); string tags[]; // タグを保管するarray int startPos[][2];// タグ初期座標 int endPos[][2]; // タグ終了座標 FillTagStructure(tags, startPos, endPos, webResData); int tagsNumber = ArraySize(tags); string text = ""; string currTag; int start[1][2]; int end[1][2]; for (i = 0; i < tagsNumber; i++) { currTag = tags[i]; if (currTag == "<weeklyevents>") { Print("ニュースブロック開始;"); } if (currTag == "<event>") { text = ""; start[0][0] = -1; start[0][1] = -1; } if (currTag == "<title>") {// タグ間のコンテンツを選択するための初期ポジションの座標 start[0][0] = endPos[i][0]; start[0][1] = endPos[i][1]; } if (currTag == "</title>") {// タグ間のコンテンツを選択するための終了ポジションの座標 end[0][0] = startPos[i][0]; end[0][1] = startPos[i][1]; text = text + GetContent(webResData, start, end) + ";"; } if (currTag == "<country>") {// タグ間のコンテンツを選択するための初期ポジションの座標 start[0][0] = endPos[i][0]; start[0][1] = endPos[i][1]; } if (currTag == "</country>") {// タグ間のコンテンツを選択するための終了ポジションの座標 end[0][0] = startPos[i][0]; end[0][1] = startPos[i][1]; text = text + GetContent(webResData, start, end) + " ;"; } if (currTag == "</event>") { Print(text); } if (currTag == "</weeklyevents>") { Print("ニュースおわり;"); } }
FillTagStructure()関数を使って、数とタグの構造を受け取り、GetContent()関数を使ってそれらの値を提供します。
スクリプト出力結果:
図1. ニュースRssスクリプト出力結果
出力結果には、ニュースのタイトルや、そのニュースに関連する国の通貨シンボルが見えます。
おわりに
HTMLタグ分析関数を使って、MQL4でRSSマークア読む方法について説明しました。この方法の欠点は、記事HTML Walkthrough Using MQL4(MQL4を使ったHTMLウォークスルー)に詳しく書かれています。また、この方法の欠点の一つに、XMLを読み込むための、ほかのスタンダート・ライブラリに比べて、コード関数を使用する”不便さ”を付け加えておきます。
本稿とスクリプトはこれでおしまいです。次はXMLを動かす外部ライブラリの接続について考えていきましょう。アドバンテージとしては、それらの1つに実行スピードを持たせていこうと思います。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1366
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索