English Русский 中文 Español Deutsch Português
MQL4を使ってRSSニュースフィードを読むには

MQL4を使ってRSSニュースフィードを読むには

MetaTrader 4 | 1 12月 2015, 08:32
1 058 0
vgs
vgs

はじめに

本稿は、記事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

添付されたファイル |
HTMLTagsLib.mqh (10.02 KB)
NewsRSS.mq4 (6.03 KB)
非標準タイムフレームでエキスパートアドバイザーをテストするには 非標準タイムフレームでエキスパートアドバイザーをテストするには
これは簡単なことではありません。”超”簡単なことです。非標準タイムフレームでエキスパートアドバイザーをテストすることは可能です!必要なことは、標準タイムフレームのデータを非標準タイムフレームのデータに置き換えることだけです。加えて、非標準タイムフレームのデータをいくつか使ってエキスパートアドバイザーをテストすることもできます。
ランダムサンドボックス ランダムサンドボックス
本稿は、インタラクティブな"サンドボックス"について書かれています。エクセルファイルが、ランダム化したエキスパートアドバイザーのバックテストデータをシュミレートします。読者の皆さんは、これを使えば、初期状態のMetaTraderが提供するEAパフォーマンスのメトリックスを探求する手助けとなり、より多くのことを理解できるようになります。本稿の文書はこの経験則を通じユーザーの皆さんに理解してもらえるように書かれています。
トレーダーの黄金則 トレーダーの黄金則
確かな予測に基づき利益を得るためには、トレードの三原則を理解しなければいけません。1) マーケットにエントリーする際のリスクを知ること。 2)損切りを早く、利益を伸ばし続けること。 3)システムの期待利益を把握すること。 ー 定期的にテスト調整を行うということの3つです。本稿ではオープンポジションをトレールし、実際に2番目の黄金則を適用させることで、最も高い確率で利益を伸ばすプログラムコードを紹介します。
合成バー - 値の視覚情報を表示する新次元 合成バー - 値の視覚情報を表示する新次元
バーや日本製のローソク足を使って値情報を表示する古典的な方法の主な欠点は、それらが期間にたよっている、ということです。これらの方法がつくられた頃では大変良いものであったかもしれませんが、マーケットの値動きが、ときに急な動きをする今日では、このやり方でチャートに表示された値は新たな値動きに素早く反応するのには役立ちません。ここで紹介するプライスチャート表示方法はこの欠点がなく非常に分かり易いレイアウトで表示されます。