【MT4】DLLでインターネットのページを読み込む、保存するコードサンプル

 DLLを使用した例をご紹介します('ω')
 DLLってMQLリファレンスに無くて参考例が少なくて実際何が正しいのが自分にもよくわかりませんが、、、

 サンプルの内容としましてはタイトルにも書きました通り、「DLLでインターネットのページを読み込み、そのページのテキストをstring型にして、さらにフォルダ内に.txtで保存、開く」というものです。

 この機能を使用して経済指標を別サイトから読み込んだり、口座認証などにも使用しています。とても汎用性が高いコードになります。

本スクリプトはパラメーターは
 ①読み込むページのURL
 ②読み込みコード
の2点にしました。

 ※「読み込みコード」っていうのはテキストにもいろんな種類のテキストがあるらしく、読み込む際もどの種類のテキストなのかを指定しないと文字化けを起こしてうまく読み込めません。そのためパラメーターで指定できるようにしています。

 使用するDLLは2つ「wininet.dll」「Shell32.dll」になります。
wininetはインターネット関係のDLL、Shell32はファイルを開くためのDLLと押さえておきましょう。これらをimportで使えるように設定。

流れ
①DLLの使用許可がされているかを確認
 →使用許可されてなかったら通知
②ページのテキストを読み込んで変数に代入
③代入したテキストをテキストファイルとして出力
 ※出力されるフォルダは「File」フォルダ
④出力したテキストファイルを開いて表示
以上です

【お知らせ】
激安で開催していましたEA教室ですが、2022.8.1からEA教室初級も中級と同じく1時間3,000円とさせていただきます。理由としましてはZOOMの有料化もありますが、フリーランスとして成長するためと、常連のお客様を優先させてあげたいためです('ω')今後ともEA教室をよろしくお願いいたします!

//+------------------------------------------------------------------+
//|                                                     InetRead.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright "Copyright 2021, MetaQuotes Software Corp."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict

#property script_show_inputs

#import "Shell32.dll"
int ShellExecuteW(
   int    hwnd,
   string lpOperation,
   string lpFile,
   string lpParameters,
   string lpDirectory,
   int     nShowCmd
);

#import

input string readurl = "https://fx.minkabu.jp/indicators";//読み込むページのURL
enum ENUM_USE_CODE
  {
   ACP = CP_ACP,
   OEMCP = CP_OEMCP,
   MACCP = CP_MACCP,
   THREAD_ACP = CP_THREAD_ACP,
   SYMBOL = CP_SYMBOL,
   UTF7 = CP_UTF7,
   UTF8 = CP_UTF8
  };
input ENUM_USE_CODE code = UTF8;//読み込みコード
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Comment("");
//DLLの使用が許可されているかを確認する
   if(!MQLInfoInteger(MQL_DLLS_ALLOWED))
     {
      Comment("DLLの使用を許可してください");
      return;
     }
//インターネットのページを読み込む
   string text = ReadInternet(readurl, code);
//読み込んだテキストをファイルに保存
   bool result = SaveStringToFileText("test.txt", text);
//保存先を開く
   if(result)
      ShellExecuteW(0, "open", TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL4\\Files\\test.txt", "", "", 1);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

#import "wininet.dll"

int InternetOpenW(string agent, int accessType, string proxyName, string proxyByPass, int flags);
int InternetOpenUrlW(int internetSession, string url, string header, int headerLength, int flags, int context);
int InternetReadFile(int, uchar &arr[], int, int &byte);
int InternetCloseHandle(int winINet);

#import
string ReadInternet(string url, int cp)
  {
   int inet = InternetOpenW("MetaTrader Terminal", 0, "0", "0", 0);
   if(inet == 0)
     {
      return("MetaTrader Terminal Error");
     }
   else
     {
      int handle = InternetOpenUrlW(inet, url, NULL, 0, 0, 0);
      string text = "";
      int    byteSize = 0;
      uchar  receive[1024];
      while(InternetReadFile(handle, receive, 1024, byteSize))
        {
         if(byteSize <= 0)
            break;
         text += CharArrayToString(receive, 0, byteSize, cp);
        }
      InternetCloseHandle(handle);
      InternetCloseHandle(inet);
      return(text);
     }
   return("Error");
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool SaveStringToFileText(string filename, string text)
  {
   int h = FileOpen(filename, FILE_WRITE | FILE_TXT);
   if(h == -1)
      return(false);
   FileWrite(h, text);
   FileClose(h);
   return(true);
  }

//+------------------------------------------------------------------+

ここから先は

0字

¥ 500

期間限定!Amazon Payで支払うと抽選で
Amazonギフトカード5,000円分が当たる

この記事が気に入ったらチップで応援してみませんか?