MT4 to LINE

ここでは、インジケーターにLINE通知機能を搭載できるツールを紹介します。

カスタムインジケーターのカスタマイズが必要ですので、インジケーターに直接LINE通知機能を搭載したいMQL4プログラミング中級者向けのツールです。

にゃんたにゃんた

博士ぇ~。インジケーターからWebRequest()関数が呼び出せないので、インジケーターにLINE通知機能を搭載できないにゃ。。。

Dr.EADr.EA

そんなときは、このツールを使うとよかろう。
ほいっ!

にゃんたにゃんた

わーい♪

当ツールの概要

当ツールは、ライブラリファイル【line_notify_lib.ex4】です。MT4で作動するEA・インジケーター・スクリプトに当ツールのLINE通知用関数をインポートして使用するため、多少MQL4プログラミングの知識が必要になります。

LINE通知用ライブラリファイルをダウンロード

次のリンクからLINE通知用ライブラリファイルをダウンロードすることができます。

ライン通知用ライブラリの圧縮ファイル【line_notify_lib.zip】をダウンロード

ライブラリファイルの保存場所

ダウンロードしたzipファイルを解凍して、中にある「line_notify_lib.ex4」ファイルをMQL4フォルダ内のLibrariesフォルダに保存します。

インジケーターからLINE通知するサンプルインジケーターファイル

次のリンクで、インジケーターにLINE通知機能を搭載したサンプルファイルがダウンロードできます。

ライン通知するサンプルインジケーターファイル【Sample_Ind_LINE.mq4】をダウンロード

Dr.EADr.EA

サンプルファイルは、記事インジケーター作成7【シグナル矢印(アロー)を表示】で作成したファイルをカスタマイズしたものじゃ。カスタマイズ後のソースコードがこちら↓

#property strict

#property indicator_separate_window
#property indicator_buffers 4          // 表示用インジケーターバッファ個数
#property indicator_color1 clrSilver   // 1つ目の色
(中略)
#property indicator_width4 2           // 4つ目の太さ


// LINE Notify 1 ************************************
#import "line_notify_lib.ex4"
bool LineNotify(string token, string message);
#import
extern string LINE_Token   = "";
// ************************************ LINE Notify 1


extern int  FastEMA_Period = 12;       // 短期EMAの期間
extern int  SlowEMA_Period = 26;       // 長期EMAの期間
extern int  Signal_Period  = 9;        // MACDシグナルライン期間

double macd[];                         // MACD用配列
double macd_sig[];                     // MACDシグナル用配列
double up[];                           // 上矢印用配列
double dn[];                           // 下矢印用配列
double fast_ema[];                     // 短期EMA用配列
double slow_ema[];                     // 長期EMA用配列

//+------------------------------------------------------------------+
int OnInit()
{
   // LINE Notify 2 ************************************
   string error_cmt = " ";
   if (IsLibrariesAllowed() == false) error_cmt = "Check \"Allow external experts imports\"";
   if (IsDllsAllowed() == false) error_cmt = "Check \"Allow DLL imports\"";
   if (error_cmt != " ")
   {
      Alert(error_cmt);
      return(INIT_FAILED);
   }
   // ************************************ LINE Notify 2
   
   
   IndicatorBuffers(6);             // インジケータ―用配列個数
   
   (中略)

   IndicatorShortName(short_name);
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
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[])
{
   int i, j;
   int limit;
   if (prev_calculated == 0)              // 最初
      limit = rates_total - 1;               // 左端のローソク足から全部
   else                                   // それ以外
      limit = rates_total - prev_calculated; // ローソク足増加時「1」、通常「0」
   
   for (i=limit; i>=0; i--)               // limit本前から現在のローソク足を処理
   {
      fast_ema[i] = iMA(NULL, 0, FastEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);   // Fast EMA
      slow_ema[i] = iMA(NULL, 0, SlowEMA_Period, 0, MODE_EMA, PRICE_CLOSE, i);   // Slow EMA
      
      macd[i] = fast_ema[i] - slow_ema[i];   // MACD
      
      if (i + Signal_Period <= Bars)         // MACDシグナル
      {
         macd_sig[i] = 0;
         for (j=0; j<Signal_Period; j++) macd_sig[i] += macd[i+j];
         macd_sig[i] /= Signal_Period;
      }
      
      // 矢印
      if (i + Signal_Period < Bars)
      {
         // 一旦矢印を消す
         up[i] = EMPTY_VALUE;
         dn[i] = EMPTY_VALUE;
         
         // 矢印表示判定
         if (macd[i+1] <= macd_sig[i+1] && macd[i] > macd_sig[i]) up[i] = macd_sig[i];
         if (macd[i+1] >= macd_sig[i+1] && macd[i] < macd_sig[i]) dn[i] = macd_sig[i];
      }
   }
   
   // LINE Notify 3 ************************************
   static int line_bar = 0;
   if (line_bar != Bars)
   {
      line_bar = Bars;
      if (up[1] != EMPTY_VALUE) LineNotify(LINE_Token, "上昇シグナル発生");
      if (dn[1] != EMPTY_VALUE) LineNotify(LINE_Token, "下落シグナル発生");
   }
   // ************************************ LINE Notify 3
   
   return(rates_total);
}

使用前の準備

当ツールは、LINE Notifyを利用してLINE通知します。その際に、アクセストークンが必要になりますので予めLINE Notifyにアクセスして、LINEアカウントのアクセストークンを発行しておきます。

LINE Notifyトップページへ

過去の記事【これは便利!MT4からLINEにメッセージを送信するスクリプト】でもアクセストークンの発行方法を解説していますので、参考にしてみてください。

機能搭載カスタマイズ方法

当ツールを利用したLINE通知機能の搭載方法を解説します。上記サンプルファイルのソースコードを例に、インジケーターに機能追加するカスタマイズ方法を紹介します。

インポートする

インジケーターのソースコードで、OnInit()関数より上のグローバル領域で、次のようにライブラリファイル「line_notify_lib.ex4」のLineNotify()関数をインポートします。

#import "line_notify_lib.ex4"
bool LineNotify(string token, string message);
#import

トークンを入力するパラメーターを設置する

LINE Notifyで発行したアクセストークンを入力するパラメーターを次のように追加します。

extern string LINE_Token   = "";

インポート許可をチェックする

次のように、OnInit()関数内でライブラリ(外部エキスパート)とDLLのインポートが許可されているかどうかをチェックして、許可されていない場合はアラートを出して終了するようにします。

   string error_cmt = " ";
   if (IsLibrariesAllowed() == false) error_cmt = "Check \"Allow external experts imports\"";
   if (IsDllsAllowed() == false) error_cmt = "Check \"Allow DLL imports\"";
   if (error_cmt != " ")
   {
      Alert(error_cmt);
      return(INIT_FAILED);
   }

LineNotify()関数を使用する

OnCalculate()関数内で、次のようにLINE通知するタイミングでLineNotify()関数を使用します。引数は(トークン, メッセージ)です。

   static int line_bar = 0;
   if (line_bar != Bars)
   {
      line_bar = Bars;
      if (up[1] != EMPTY_VALUE) LineNotify(LINE_Token, "上昇シグナル発生");
      if (dn[1] != EMPTY_VALUE) LineNotify(LINE_Token, "下落シグナル発生");
   }

シグナルインジケーター限定ライン通知ツール

LINE通知用ライブラリをインジケーターにインポートする作業が難しいと感じる方のために、シグナルインジケーター用のライン通知ツールを作成しました。

シグナルインジケーター用ライン通知インジケーター【LINEbySig_ind_v2.mq4】をダウンロード

※LINE通知用ライブラリファイルは必要です。

パラメーター説明

LINE_Token LINE Notifyで発行したアクセストークン
—Signal Setting—
CustomIndicatorName 使用するカスタムインジケーター名
UpSignalIndex 上昇シグナルの番号
DownSignalIndex 下降シグナルの番号
SignalShift シグナルのシフト数
—Parameters of Indicator Setting—
Para1 カスタムインジケーターのパラメーター1つ目
Para2 カスタムインジケーターのパラメーター2つ目
Para3 カスタムインジケーターのパラメーター3つ目
:
Para20 カスタムインジケーターのパラメーター20個目

シグナルの番号やシフト数については、次の記事を参考にしてください。

あとがき

質問等ありましたら、お気軽にコメントくださいね。
ではでは。