今回はチャート上に表示しているテキストやボタンをクリックすることで、指定のURLを開けるようにする方法を紹介いたします。
EAなどを販売している方は、「お問い合わせはこちらまで」などを設置するのにおススメです。
MQL4にはハイパーリンク機能がない!
MQL4にはテキストやオブジェクトにURLを紐づけるような機能が用意されておりません。
唯一URLを用いることができる部分は、EAやインジケータを挿入した際に表示されるポップアップの[バージョン情報] だけです。

しかし今回紹介する方法を使用して、疑似的にハイパーリンク実装することが可能になります。
実際にURLを開いてみる
windowsAPIから関数をImportする (DLLを使用を許可するにチェック)
#import "shell32.dll"
int ShellExecuteW(int hWnd, string Verb, string File, string Parameter, string Path, int ShowCommand);
#importまずはshell32.dllからShellExecuteW()関数をインポートします。
ShellExecute()関数を使用することで、任意のアプリケーションやURLを開くことができます。
アプリケーションを開く方法を紹介した記事はこちら↓
Importした関数を実行
int OnInit(){
ShellExecuteW(0, "Open", "https://blog.codinal-systems.com/", 0 , "", 0);
return(INIT_SUCCEEDED);
}OnInit内でShellExecuteW()を実行してみましょう。
ShellExecuteW()関数の第3引数には任意のURLを指定してください。
チャートに挿入してみると、自動でブラウザが起動してURLにアクセスされることがわかります。
チャート上に疑似ハイパーリンクを設置する方法
前述で実際にURLを開くことができましたので、本編であるハイパーリンクの実装方法を紹介します。
MQL4にはテキスト自体にURLを埋め込むことができません。ではどのように実装するか?
以下の手順で実現することが可能です。
手順を踏んで解説していきます。
①チャートにテキストを表示する
まずは「お問い合わせはこちら」という文字列をチャート上に表示してみましょう。
OnInit内でラベルオブジェクトを作成してください。
int OnInit(){
string objName = "Contact Label";
ObjectCreate(0, objName, OBJ_LABEL, 0, 0, 0);
ObjectSetText(objName, "お問い合わせはこちら", 12, "Meiryo UI", clrWhite);
ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, 5);
ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, 5);
ObjectSetInteger(0, objName, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, objName, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, objName, OBJPROP_SELECTABLE, false);
ObjectSetInteger(0, objName, OBJPROP_SELECTED, false);
return(INIT_SUCCEEDED);
}ラベルオブジェクトについての詳細はこちらの記事から確認できます↓
string objName = "Contact Label";こちらのオブジェクト名は後ほどの手順で使用します。用途に合わせて任意で変更してください。
②テキストがクリックされたことを検知する
テキストがクリックされたことを検知するには
OnChartEvent()関数を使用します。
OnChartEvent()関数はMT4上で発生した様々なイベントを取得することができます。
- チャートをクリック
- オブジェクトをクリック
- マウスカーソルを移動
- キーボードの押下
- オブジェクトの移動、削除
今回はテキストをクリックしたことを検知したいので、 オブジェクトをクリック というイベントを取得しましょう。
void OnChartEvent(const int id,
const long &lparam;,
const double &dparam;,
const string &sparam;)
{
if (id == CHARTEVENT_OBJECT_CLICK){
if(sparam == "Contact Label"){
//ここにクリックされた際の処理を書く
}
}
}受け取ったイベントのIDが[CHARTEVENT_OBJECT_CLICK]の場合は、何かしらのオブジェクトにクリックしたことを検知したということです。
引数[sparam]にクリックしたオブジェクトの名前が格納されるので、先ほどの①で指定したオブジェクト名と一致していれば「お問い合わせはこちら」がクリックされたということがわかります。
今回の場合では[sparam]が”Contact Label”を一致しているかを確認します。
③ShellExecuteW()関数を実行してURLを開く
最後にShellExecuteW()関数を記述することで、「お問い合わせはこちら」がクリックされたらURLを開くことができます。
void OnChartEvent(const int id,
const long &lparam;,
const double &dparam;,
const string &sparam;)
{
if (id == CHARTEVENT_OBJECT_CLICK){
if(sparam == "contact label"){
ShellExecuteW(0, "Open", "https://blog.codinal-systems.com/", 0 , "", 0);
}
}
}コード全体像
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
#import "shell32.dll"
int ShellExecuteW(int hWnd, string Verb, string File, string Parameter, string Path, int ShowCommand);
#import
int OnInit(){
string objName = "Contact Label";
ObjectCreate(0, objName, OBJ_LABEL, 0, 0, 0);
ObjectSetText(objName, "お問い合わせはこちら", 12, "Meiryo UI", clrWhite);
ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, 5);
ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, 5);
ObjectSetInteger(0, objName, OBJPROP_ANCHOR, ANCHOR_LEFT_LOWER);
ObjectSetInteger(0, objName, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, objName, OBJPROP_SELECTABLE, false);
ObjectSetInteger(0, objName, OBJPROP_SELECTED, false);
return(INIT_SUCCEEDED);
}
void OnChartEvent(const int id,
const long &lparam;,
const double &dparam;,
const string &sparam;)
{
if (id == CHARTEVENT_OBJECT_CLICK){
if(sparam == "Contact Label"){
ShellExecuteW(0, "Open", "https://blog.codinal-systems.com/", 0 , "", 0);
}
}
}
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time;[],
const double &open;[],
const double &high;[],
const double &low;[],
const double &close;[],
const long &tick;_volume[],
const long &volume;[],
const int &spread;[])
{
return(rates_total);
}まとめ
今回はWindowsAPIとOnChartEvent()関数を組み合わせて、疑似的にハイパーリンクを実装する方法をご紹介いたしました。
OnChartEvent()関数は扱いが難しいですが、使いこなせると処理の幅が大幅に広がりますので是非マスターしましょう!
