MQL5入門(第28回):MQL5のAPIとWebRequest関数の習得(II)
はじめに
連載「MQL5入門」の第28回へようこそ。前回の記事では、APIの概念を取り上げ、WebRequest関数の重要なパラメータについて説明し、外部サーバーへ接続するための使用方法を解説しました。そのレッスンでは、MetaTrader 5と他のプラットフォーム間でデータがどのように流れるかを理解するための基礎を築きました。
いつも言っていることですが、プログラミングにおいて、どれだけ優れたプログラマになれるかは、これまでに取り組んできたプロジェクトの内容次第です。これはまさに今回の内容の本質を表しています。
今回も、より実践的で魅力的な学習体験にするために、プロジェクトベースのアプローチで進めていきます。本記事では、URLがどのように機能するのかを詳しく理解します。前回でも簡単に説明しましたが、今回はさらに深く掘り下げます。URLの各構成要素を、プロトコル、ドメイン、パス、クエリ文字列などのシンプルで明確な構成要素に分解して解説します。 そして、外部サービスのAPIを使用してリアルタイム価格データを取得するMQL5スクリプトを作成します。さらに、MQL5を使用してJSONレスポンスを解析し、その中から特定の情報を抽出する方法も学びます。これにより、未加工のAPIデータと実用的な取引インサイトとのギャップを埋めることができます。
URLの理解
前回の記事ではURLについて簡単に説明しましたが、今回は特にAPIを扱う文脈で、各構成要素を詳しく分解して解説します。
プラットフォームによって使用されるURLは異なりますが、基本的には似た順序で構成されています。たとえば、Telegram APIの基本URLは以下の通りです。
https://api.telegram.orgBinance APIの基本URLは以下の通りです。
https://api.binance.comこれらのURLによって、接続先のサーバーが特定されます。プラットフォームごとに違いはありますが、構造としては共通しており、プロトコル、ドメイン、および目的のリソースや機能にアクセスするためのパスで構成されています。
URLの構成要素
構成要素とは、大きなものを構成する一部分やセクションのことです。何かを構成するいくつかの部分のそれぞれを「構成要素」と呼びます。同様に、URLもいくつかの構成要素で成り立っており、それぞれがソフトウェアがサーバー上のデータを見つけてアクセスするのを助ける明確な役割を持っています。
URL全体のアドレスを構成するさまざまな部分は、URLの構成要素と呼ばれます。全体の場所から取得したい正確なリソースまで、これらの構成要素がプログラムを導きます。車が一体として見えても異なる部品で構成され、それぞれに役割があるのと同じように、URLも一見長いひとつのアドレスのように見えますが、実際にはそれぞれ異なる役割を持つ複数の部分から成り立っています。
これらを組み合わせることで、ソフトウェアはアクセスしたい正確なサーバーリソースへ導かれます。特定の構成要素は呼び出したいサービスや機能を示し、他は接続したいサーバーを特定するのを助け、さらに別の要素はサーバーに対して「何を取得したいか」を正確に伝える情報を含んでいます。
URLの各部分は協力して、プログラムがインターネット上で情報を正確かつ効率的に見つけて取得できるようにしています。
それぞれの部分には特別な目的があり、他の部分と連携して機能します。これらの構成要素のおかげで、ソフトウェアはどこにアクセスし、サーバーにどの情報を要求すべきかを正確に把握できます。
URLの主要な構成要素は以下の通りです。
- プロトコル
- ドメイン
- パス
- クエリ文字列
プロトコル
URLが何であり、何を表すかを理解したところで、次は各構成要素を個別に説明します。プロトコルは、URLの最初の部分です。これはブラウザやMQL5アプリケーションに、サーバーへの接続方法を指示する役割を持ちます。簡単に言えば、プロトコルはコンピュータと接続先サーバー間のデータのやり取りのルールを定めるものです。
例
https://api.binance.comこの場合のプロトコルはhttpsです。これにより、プログラムはセキュアなHypertext Transfer Protocolを使用することを指示されます。取引情報や口座情報などの機密データを扱う場合は、HTTPSを使用することで送受信データが暗号化され、安全性が向上します。 HTTPとHTTPSの違いは、HTTPがデータを暗号化しない点にあります。HTTPは単にテキストデータを送信するだけで、高速ですがセキュリティは低くなります。機密情報や金融データを扱う現代のAPI(例:Binance)では、HTTPSを使用することが必要です。
比喩的な説明
重要なメッセージを誰かに届けるとします。普通郵便を使いますか、それとも安全な配送サービスを使いますか。どちらの方法にもそれぞれ異なる安全性があります。同様に、プロトコルはソフトウェアがサーバーとどのようにやり取りするかを決定します。
URLがhttpsで始まる場合は、途中でメッセージが傍受されないように保護された安全な配送サービスを選ぶのと同じです。URLがhttpで始まる場合は、保護されていない手紙を従来の郵便で送るようなものです。HTTPSは、プログラムとサーバー間で送受信されるデータを安全に扱うことを保証するため、Binanceやほとんどの現代APIで必須となっています。
ドメイン
ドメインはプロトコル(https)の後に続きます。ドメインは、目的のデータを取得するためにどのサーバーに接続するかをプログラムに指示します。これは、データが格納されている建物の名前のようなものです。街や通りの名前を知っていても、正確な建物名が分からなければメッセージを正しく届けられないのと同じです。
例
https://api.binance.com https://api.coingecko.com
ドメインはプロトコルの後にあり、ソフトウェアに安全なサーバーに接続したいことを示します。ドメインは、目的のサーバーの住所のように機能します。
ドメイン(api.binance.com)はプログラムを適切なサーバーへ導き、プロトコルは安全な接続を保証します。これらはAPIリクエストの基盤となり、ソフトウェアが安全に目的地に到達できるようにします。
api.coingecko.comの場合も同様です。ドメインはサーバーの住所であり、httpsは安全な接続を保証します。これにより、あるサーバーに送信したリクエストや取得したデータが、別のサーバーのものと混同されるのを防げます。
パス
パスは、URLにおける次の部分で、プロトコルとドメインの後に続きます。パスは、プログラムにどの特定のサーバー機能やリソースにアクセスしたいかを示します。ドメインがソフトウェアを適切なサーバーへ導くのに対し、パスはサーバー内の正確な場所やサービスを指し示します。
例
https://api.binance.com/api/v3/ticker/price/api/v3/ticker/priceがパスです。このパスにより、ソフトウェアは最新の暗号通貨銘柄価格を提供する機能へアクセスします。パスがなければ、サーバーはどの情報や機能にアクセスしたいのか判断できません。
パスは、建物内の階数や部屋番号に例えることができます。一方、ドメインは建物自体です。パスは情報が存在する正確な階と部屋を示し、ドメイン(たとえばapi.binance.com)はどの建物に行くかを示します。
パスは、コンピュータ上のファイルパスにも似ています。
C:\Users\Israel\Documents\CryptoData\prices.xlsx
これは、コンピュータ上の特定のドキュメントへのパスを示しており、ファイルにアクセスするためにいくつかのフォルダを順番に開く必要があります。
APIやウェブサイトでは、異なる用途ごとに異なるパスが設定されています。たとえば、最新の価格取得、過去のローソク足データ、口座情報など、それぞれのサービスやデータセットに対応するパスがあります。多くのAPIは、利用可能な全パスの一覧と、それぞれの機能や必要なパラメータを解説したドキュメントページを提供しています。適切にリクエストを送信し、必要なデータを取得するには、このドキュメントを理解することが重要です。
たとえば、Binance APIからのパス(/api/v3/ticker/price)を考えてみましょう。これは、コンピュータ内のファイルを順番に開いて特定のファイルを見つける作業に例えられます。
- まず、apiフォルダに入ります。
- その中のv3フォルダに進みます。これはAPIのバージョンを示す場合があります。
- 次にtickerフォルダを開きます。ここには暗号通貨のティッカーに関するファイルや機能が含まれています。
- 最後にpriceに到達します。これが、銘柄の最新価格を取得する正確なファイルまたはリソースです。
同様に、ソフトウェアはドメインapi.binance.comに続いてこのパスをたどり、サーバー構造をステップごとに進んで、要求された正確な機能や情報を取得します。そのため、パスの各セグメントには重要な意味があります。どれかの部分が抜けていたり誤って書かれていると、プログラムは間違った場所に到達するか、エラーが発生する可能性があります。
クエリ文字列
パスを、サーバー上で価格データが保存されているフォルダに例えました。パスだけでもそのフォルダ内の情報を取得できますが、特定のデータを要求したい場合はクエリ文字列を使うことでより正確に指定できます。
これは、コンピュータ上に複数のファイルが入ったフォルダがあり、自分で目的のファイルを探す代わりに、クエリ文字列を使ってどのファイルを取得するかコンピュータに指示するのと似ています。
例
https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDThttps://api.binance.com/api/v3/ticker/price?symbol=BTCUSDTがURLです。このURLを構成要素に分解してみましょう。「https://」プロトコルは、アプリケーションにサーバーとの安全な接続を確立させ、送受信されるすべてのデータを暗号化することを指示します。「api.binance.com」ドメインは、プログラムにリクエスト先のサーバーを指示するもので、接続先サーバーの住所にあたります。「/api/v3/ticker/price」URLパスは、サーバーに最新の暗号通貨価格を返す特定の関数を指示します。
「?symbol=BTCUSDT」がクエリ文字列です。クエリ文字列は常に?で始まり、パスに続いてサーバーに追加の指示を送ることを意味します。この例では、パスだけでも価格データを取得できますが、より正確に指定するために?を使い、さらにsymbol=BTCUSDTと指示することで、BTCUSDTの価格だけを取得することを明示しています。
この形式を使えば、現在価格や指定した時間枠のローソク足データなど、さまざまな情報を取得できます。クエリ文字列の形式は多くのプラットフォームで似ていますが、使用されるキーワードはプラットフォームごとに異なる場合が多いため、APIドキュメントを確認して正しく使用することが重要です。
MQL5でAPIを使って現在価格を取得する
前章でURLの要素(プロトコル、ドメイン、パス、クエリ文字列)について説明したので、これらがどのように連携するかはすでに理解しているはずです。また、前回の記事でWebRequest関数とそのパラメータの使い方について解説したので、MQL5が外部サーバーと通信する基本も理解済みです。 このセクションでは、Binance APIを使って任意の資産の現在価格を取得します。概念は単純です。まず該当するURLを作成してWebRequestでリクエストを送ると、サーバーが最新の価格をJSON形式で返してくれます。返ってきたJSONから必要な値だけを抽出するMQL5コードを作成していきます。
小さなMQL5スクリプトを作成して、さまざまな資産の現在価格を取得できるようにします。このスクリプトは、ユーザーが暗号通貨銘柄を入力すると、自動でBinanceに接続し、最新価格を返します。BTCUSDT、ETHUSDT、BNBUSDT、またはBinanceがサポートする任意の取引ペアの価格を取得できるので、汎用性があります。
外部APIであれば、この手順の基本構造はほとんど同じです。違いは、各プラットフォームで使用されるパスとクエリ文字列の定義だけです。そのため、接続したいプラットフォームのAPIドキュメントを確認し、リクエストの準備方法を理解することが重要です。
外部サーバーにWebリクエストを送受信する場合、MetaTrader 5で外部リクエストを許可しておく必要があります。これはセキュリティ上、MetaTrader 5がすべての外部クエリを自動でブロックするためです。まず、メニューから[ツール]>[オプション]を選ぶか、あるいはCtrl + Oを押してアクセスします。次に、[エキスパートアドバイザ]タブで[WebRequestを許可するURLリスト]をオンにし、https://api.binance.comを追加して[OK]をクリックします。この設定が完了すると、スクリプトはBinanceに問題なくクエリを送信できるようになります。

WebRequest関数に必要なすべての変数を宣言することが、リクエストを送信する前の最初のステップです。URL、ヘッダ、送信するデータ、応答バッファ、結果コードなどはすべてこれらの変数に格納されます。最初に変数を宣言しておくことで、スクリプトの整理が保たれ、Binanceサーバーに実際のリクエストを送信する前にすべての準備が整っていることを確実にできます。
例
const string method = "GET"; const string url = "https://api.binance.com/api/v3/ticker/price"; const string headers = ""; int timeout = 5000; char data[]; char result[]; string result_headers; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- WebRequest(method,url,headers,timeout,data,result,result_headers); Print(CharArrayToString(result)); }
出力

結果
[
{"symbol":"ETHBTC","price":"0.03313000"},
{"symbol":"LTCBTC","price":"0.00107100"},
{"symbol":"BNBBTC","price":"0.00974800"},
{"symbol":"NEOBTC","price":"0.00005020"},
{"symbol":"QTUMETH","price":"0.00055350"},
{"symbol":"EOSETH","price":"0.00030670"},
{"symbol":"SNTETH","price":"0.00001700"},
{"symbol":"BNTETH","price":"0.00020260"},
{"symbol":"BCCBTC","price":"0.00000000"},
{"symbol":"GASBTC","price":"0.00002500"},
{"symbol":"BNBETH","price":"0.29410000"},
{"symbol":"BTCUSDT","price":"95566.46000000"},
{"symbol":"E
説明
const string method = "GET";
GETメソッドは、サーバーに対してデータを取得したいことを伝えるために使用されます。
const string url = "https://api.binance.com/api/v3/ticker/price";
次に、URLを格納するための文字列変数を定義しました。URLにはプロトコル(https://)、ドメイン(api.binance.com)、およびパス(/api/v3/ticker/price)が含まれています。このURLに含まれていない要素はクエリ文字列だけで、これは追加の命令が不要だったためです。WebRequest関数にパラメータを渡す際に、この点が重要になります。
const string headers = ""; int timeout = 5000; char data[];
このコードブロックでは、3つの変数を宣言しています。まずheadersは通常、サーバーに送信したい追加情報を含めるためのものですが、今回のようなケースでは空のままで構いません。headers変数を宣言しているのは、WebRequest関数の入力時に必要だからです。
次にtimeoutは、サーバーから応答を受け取るまで待機するミリ秒数を指定します。指定時間内に応答がない場合、リクエストはキャンセルされます。最後にdataは、サーバーに送信する追加情報を格納するために使用します。
char result[]; string result_headers;
WebRequestが終了すると、サーバーからの応答本文はresult配列に格納されます。この配列には通常バイト形式の生データが格納され、それを読みやすいテキストに変換して利用することができます。Binanceのこのエンドポイントからの応答はJSON文字列で、各取引ペアの価格情報が含まれています。サーバーが返すすべてのHTTP応答ヘッダ(コンテンツタイプ、コンテンツ長、サーバー情報、その他付随情報など)もresult_headers文字列に格納されます。
int web_request = WebRequest(method,url,headers,timeout,data,result,result_headers); Print(CharArrayToString(result));
WebRequest関数を使用して、サーバーに対してGETリクエストを送信します。関数にはメソッド、URL、ヘッダー、タイムアウト、結果格納用配列、結果ヘッダなど必要なパラメータをすべて渡します。関数はサーバーからの応答を待ち、成功すれば結果がresult変数に格納されます。
Expertログでは文字配列を直接読むことができないため、応答を受け取った後にresult配列のバイト列を読みやすい文字列に変換しています。このBinanceリクエストから得られる文字列はJSON形式で、複数の取引ペアの現在価格が含まれています。
次に、このJSON構造がどのように配置されているかを正確に理解する必要があります。これにより、必要な情報を正確に抽出できます。JSONの構造はプラットフォームやAPIによって異なり、配列の構造、ネスト、フィールド名が違う場合があります。実際の応答と異なる構造を仮定すると間違いが起こるため、正確なパターンを知ることで、特定の取引ペアや価格値など必要な情報を正確に取得できます。最終的に、表示してみると各銘柄の価格が繰り返し並んでいるパターンになっており、必要な情報を見つけて抽出しやすくなっています。
例
[
{"symbol":"ETHBTC","price":"0.03313000"},
{"symbol":"LTCBTC","price":"0.00107100"},
{"symbol":"BNBBTC","price":"0.00974800"},
{"symbol":"NEOBTC","price":"0.00005020"},
{"symbol":"QTUMETH","price":"0.00055350"},
各価格は同じ形式で整えられており、「.symbol","INSTRUMENT","price":」という形で始まります。ここでINSTRUMENTは取引ペアを表し、価格はその後に続く値です。この規則的な構造により、JSONを注意深く確認して、必要な価格や銘柄を正確に抽出することが可能になります。
例const string method = "GET"; const string url = "https://api.binance.com/api/v3/ticker/price"; const string headers = ""; int timeout = 5000; char data[]; char result[]; string result_headers; string instrument = "BTCUSDT"; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- int web_request = WebRequest(method,url,headers,timeout,data,result,result_headers); // Print(CharArrayToString(result)); string pattern = "{\"symbol\":\"" + instrument + "\",\"price\":\""; string jason = CharArrayToString(result); int pattern_lenght = StringFind(jason,pattern); pattern_lenght += StringLen(pattern); int end = StringFind(jason,"\"",pattern_lenght + 1); string coin_price = StringSubstr(jason,pattern_lenght,end - pattern_lenght); Print(instrument,": ", coin_price); }
出力

説明
string instrument = "BTCUSDT"; string pattern = "{\"symbol\":\"" + instrument + "\",\"price\":\"";
操作したい銘柄を格納する変数を定義しました。次の行では、この銘柄変数と固定の文字列を結合して、JSON内を検索するためのパターンを作成します。正しい価格を見つけるためには、BinanceのJSONレスポンスに現れるのと同じ構造を作る必要があります。変数と固定部分を結合することで、最終的な出力はAPIが返す内容と一致します。
MQL5で文字列を開始および終了させるには、引用符(")を使用します。文字列内に実際の引用符を入力すると、コンパイラは文字列が終了したと判断してしまいます。これを回避するために、バックスラッシュを使って引用符をエスケープします。したがって「"」はMQL5に対して、引用符を文字列の終端ではなく、文字列内の通常の文字として扱うよう指示することになります。
これは必要です。なぜなら、JSON形式では銘柄名、価格、銘柄のすべてが引用符で囲まれているからです。引用符をエスケープしなければ、アプリケーションはAPIが返すJSON形式に正しく一致せず、パターンが崩れたり、構文エラーが発生したりします。
string jason = CharArrayToString(result);
この行は、WebRequestから得られた生のレスポンスを読みやすい文字列に変換し、新しい変数に格納します。WebRequestは文字配列としてデータを返すため、そのままでは検索や抽出ができません。文字配列を文字列に変換することで、検索、部分文字列抽出、比較など、通常の文字列操作を行えるようになります。この文字列は後続の処理で扱うため、新しい変数に保存しているだけです。
int pattern_lenght = StringFind(jason,pattern);
この行は、文字列全体の中でパターンが始まる位置を見つけます。この位置を基に、パターンが始まる前にいくつの文字があるかを把握します。JSON全体を調べた後、この関数はパターン内の最初の文字のインデックスを返します。たとえば、文字列「MQL5 FOR BEGINNERS」で「BEGINNERS」を検索すると、関数は9を返します。MQL5のインデックスとは、文字列内での文字の数値的な位置を意味します。この戻り値により、JSON内でパターンがどこにあるかが正確に分かり、後で正しい価格値を抽出できます。
pattern_lenght += StringLen(pattern);パターンの長さを加えることで、この行は開始位置を引き上げます。StringLenメソッドは、JSON内でパターンの最初の文字のインデックスを見つけた後、パターン自体の文字数を数えるために使用されます。最終的な抽出結果にパターン文字列を含めたくないため、このステップは非常に重要です。開始インデックスにパターンの長さを加えることで、価格値の最初の文字に正確にポインタを移動させます。これにより、パターン自体を含む前の文字はすべて除外され、価格値だけを抽出できるようになります。
int end = StringFind(jason,"\"",pattern_lenght + 1);
この関数は、価格値の正確な開始位置とパターンの長さを特定した後に機能します。次のステップは、その価格値の終了位置を決定することです。このために、第3引数を指定したStringFind関数を使用します。JSONテキストがjasonに保存されており、検索対象となる主要な文字列が最初のパラメータです。
2番目のパラメータは検索したい文字で、この場合は引用符(")です。なぜなら、JSON内の価格値は常に引用符で囲まれているからです。3番目のパラメータは、StringFindが検索を開始する位置を指定します。「pattern_lenght + 1」を使用することで、パターンが終了した直後、つまり価格の数字が始まる正確な位置から検索を開始するよう指示しています。
これは重要です。JSONの構造は以下のようになっているためです。
{"symbol":"ETHBTC","price":"0.03313000"},
{"symbol":"LTCBTC","price":"0.00107100"},
「{"symbol":"ETHBTC","price":"」部分がパターンです。価格値はこの後に続き、最終的な引用符は価格のすぐ後に現れます。最終的な値を取得するために、検索をパターンの直後から開始します。これにより、終了インデックスを正確に指定して価格を正確に抽出することができます。
string coin_price = StringSubstr(jason,pattern_lenght ,end - pattern_lenght); Print(instrument,": ", coin_price);
パターンの開始位置と終了の引用符の位置を特定したら、このコードの部分は実際の価格値を取得する役割を果たします。
ここでは、StringSubstr関数を使用して文字列の指定部分を切り出し、価格の値のみを抽出します。変数jasonに含まれる完全なJSONが最初のパラメータとして渡され、どのテキストを切り出すかを関数に指示します。pattern_lenghtはすでに価格の最初の文字を指す位置に進められているため、2番目の引数は価格が始まる正確な位置、すなわちpattern_lenghtの値を示します。
3番目のパラメータは、抽出する文字数を関数に指示します。ここでは「end - pattern_lenght」を使用して、開始位置から終了位置までの文字数を計算します。引用符やその他の記号を除外することで、価格値を構成する正確な文字数が得られます。
抽出が完了したら、結果はcoin_priceに保存され、0.03313000のようなクリーンな価格だけが含まれます。最後にPrint文を使用することで、銘柄名と抽出された価格をログに表示し、簡単に結果を確認できます。あとはプラットフォーム上で任意の資産のシンボルを入力するだけです。このシステムは柔軟で、どの資産を選択しても同じロジックでJSONを検索し、適切なパターンを見つけ、価格を抽出して表示できます。
重要な点として、各プラットフォームには一定時間内に送信できるリクエストの上限があります。そのため、EAのOnTick関数内でこの方法を直接使用することは推奨されません。短時間でリクエスト上限を超えてしまう可能性があるからです。リクエストを送る正当な理由がある場合でも、プラットフォームで許可されているリクエスト数を超えないよう、各リクエストの間に時間待ちや遅延を設ける必要があります。
より理解を深めるために、別のプラットフォームを使って価格を取得してみましょう。今回はCoinGeckoを使用します。CoinGeckoは多数の暗号資産のJSONデータを返すパブリックAPIを提供しています。手順は基本的に同じです。APIエンドポイントにHTTPリクエストを送り、JSONレスポンスを取得し、関心のある資産の価格を抽出します。
例
const string method = "GET"; //const string url = "https://api.binance.com/api/v3/ticker/price"; const string url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd"; const string headers = ""; int timeout = 5000; char data[]; char result[]; string result_headers; string instrument = "ETHUSDT"; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- int web_request = WebRequest(method,url,headers,timeout,data,result,result_headers); Print(CharArrayToString(result)); }
出力

{"bitcoin":{"usd":95566},"ethereum":{"usd":3169.35}}}説明
URLをCoinGecko APIを使って現在価格を取得するためのものに変更しました。今回はクエリ文字列を追加しています。CoinGeckoでは、どのコインとどの通貨の価格を取得するかを指定するためにクエリ文字列が必要です。基本のエンドポイントとパラメータは、クエリ文字列の先頭にある疑問符(?)で区切られます。この例では、vs_currencies=usdが米ドル建ての価格を取得したいことを示し、ids=bitcoin,ethereumがCoinGeckoにどの暗号資産の価格を取得するかを指示しています。複数のパラメータがある場合はアンパサンド(&)で区切ります。この例のように、各引数はkey=valueの形式で表されます。
したがって、一般的なルールとして、複数のキーと値の組をクエリ文字列内で区切るには&を使用し、基本URLの後でクエリ文字列を開始するには?を使います。これにより、サーバーは正確にどの情報を要求しているかを認識できます。出力を表示すると、CoinGeckoのJSONパターンはBinanceとは異なることがわかります。これは、最初にレスポンスを確認し、JSONの構造を理解することの重要性を示しています。各プラットフォームはレスポンスの形式が異なるため、正確なパターンを把握することで、特定のコインの価格など必要なデータを正確に抽出でき、ミスを避けられます。
WebRequestを発行できるようにするためには、CoinGeckoのAPI URLをMetaTrader 5の設定に追加する必要があります。APIのURLを許可されたURLリストに追加することで、スクリプトやEAがCoinGeckoに正常に接続してデータを取得できるようになります。MetaTrader 5はデフォルトで外部URLへの呼び出しをブロックするためです。
https://api.coingecko.com例
const string method = "GET"; //const string url = "https://api.binance.com/api/v3/ticker/price"; const string url = "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin,ethereum&vs_currencies=usd"; const string headers = ""; int timeout = 5000; char data[]; char result[]; string result_headers; string instrument = "bitcoin"; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- int web_request = WebRequest(method,url,headers,timeout,data,result,result_headers); // Print(CharArrayToString(result)); string pattern = "{\"" + instrument + "\":{\"usd\":"; string jason = CharArrayToString(result); int pattern_lenght = StringFind(jason,pattern); pattern_lenght += StringLen(pattern); int end = StringFind(jason,"}",pattern_lenght + 1); string coin_price = StringSubstr(jason,pattern_lenght,end - pattern_lenght); Print(instrument,": ", coin_price); }
出力

説明
おこなった変更は2つだけです。まず、URLがプラットフォームのAPIと一致するようにしました。次に、各プラットフォームのJSON形式が異なる場合があるため、CoinGeckoの形式に合わせるようにしました。
結論
本記事では、MQL5のWebRequest関数と外部プラットフォームのAPIを使用してリアルタイムの価格データを取得する方法を学びました。また、URLのプロトコル、ドメイン、パス、クエリ文字列の各構成要素についても十分に理解できました。最終的には、JSONレスポンスから特定の情報を抽出し、整理する方法を学び、未処理のAPIデータを有益な情報に変換することができました。
MetaQuotes Ltdにより英語から翻訳されました。
元の記事: https://www.mql5.com/en/articles/20280
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
MQL5での取引戦略の自動化(第42回):セッションベースのオープニングレンジブレイクアウト(ORB)システム
分析型ボリュームプロファイル取引(AVPT):流動性アーキテクチャ、市場メモリ、アルゴリズム実行
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
MetaTrader 5機械学習の設計図(第6回):実務で使えるキャッシュシステムの設計
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索