外部指標のためのアラートとコメント:第二部

Vladimir | 22 10月, 2015

はじめに

最初の記事「外部指標のためのアラートとコメント」は、指標データの取得と、特殊文字を用いた表への反映について説明しました。

この記事では、指標バッファからのデータ検索方法、また特定の指標イベントの通知方法をまとめて紹介します。

オペレーターグループは必要な設定の取得に使われます。GUI パラメータの読み込みにはつかえますが、指標バッファのパラメータは手動で設定する必要があります。価格・時間以外のパラメーター、例えば色などが取得できないのです。例として、情報を色の変化で示すテクニカル指標を見てみましょう。

このようなタイプの指標の指標バッファ上に情報を記憶する方法の一つとして、2つの指標バッファを用いて線を1本だけ表示するというものがあります。各バッファを特定の色で塗りつぶします。情報の出力方法について言えば、指標バッファは2つですが、表示させるのは常にどちらか1つだけという設定になります。バッファのパラメータ値は、有効な時は整数、無効な時は0です。

このように、指標の変更情報を出力する方法を分析します。

指標バッファからのデータ出力

MQLリソースで、8つの指標バッファのデータを入力・出力できます。
なので、全ての8つの指標バッファを分析してみましょう。

分析条件は以下の通りです。テクニカル指標の値が0から整数、または整数から0に変更する場合、それをユーザーに通知する必要があります。一番目のバッファの値を使用しましょう。そして全てのバッファの値を最初の、または任意のバーから1つずつチェックします。 

extern int     StartBar=1;       // スタートバー

以下のように情報を出力する Slope Trend_mtf 指標を例として見てみましょう。


図1

変更箇所を見つけると指標はそれを登録し、動作を止めます。

情報出力のためのMQL4リソースがいくつかあります。

データ出力サブプログラムは以下のようになります。

//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator Subfunction                             |
//+------------------------------------------------------------------+

void AlertComment (string text)
   {
      if (SignalAlert   == true)    Alert    (text);
      if (SignalComment == true)    Comment  (text);
      if (SignalPlay    == true)    PlaySound(Signal);
   }

ユーザ定義できる必要な変数を追加します。

ユーザーが設定したコメントの出力も可能にしましょう。

extern int     StartBar=1;                            // スタートバー
extern string  indicator = "Insert Indicator Name";   // カスタム指標
extern bool    VLine = true;                          // 縦線出力
extern bool    SignalAlert=false;                     // アラートの表示・非表示</s5>
extern bool    SignalComment=true;                    // コメントの表示・非表示</s5>
extern bool    SignalPlay= false;                     // サウンドプレイ
extern string  Signal = "alert.wav";                  // カスタム音楽ファイル
extern string  UserText = "изменил направление";      // ユーザコメント

ここで:

StartBar

は計算を開始する時刻の設定、

indicator 

は分析するテクニカル指標の名前です。

また、以下のような論理変数を使います。
指標パラメータに変更があった際に

VLine 

その部分に縦線を表示・非表示(true/false)

SignalAlert

アラートの表示・非表示(true/false)

SignalComment

コメントの表示・非表示(true/false)

SignalPlay

音声ファイルの再生をする・しない(true/false)
が設定できます。 

Signal 

また、再生する音声ファイル名は上に入力します。

UserText 

チャートに表示される通常のメッセージをユーザー独自のメッセージを設定することもできます。

同じように、関連情報をメールアドレスに送信する設定もできます。

あとは指標データを読み込み、設定を調節するだけです。

コードは以下の通りです。

   for(int ii=StartBar;ii<ExtBars;ii++)
      for(int i=0;i<8;i++)
        {
         First =iCustom(NULL,0,indicator,i,ii);
         Second=iCustom(NULL,0,indicator,i,ii+1);
         if((Second==0 && First>0) || (Second>0 && First==0))
           {
            text=StringConcatenate(Str+" -  На ",ii+1," баре ",Symbol()," -  ",indicator," ");
            AlertComment(text+UserText);
            if(VLine==true)
               ObjectCreate(STRING_ID+"VL_"+i,0,0,Time[ii],Bid);
            return;
           }
        }

上記の方法で縦線表示のパラメータを設定すると、以下のようになります。


図2


まとめ

批評的な意見も少なくないですが、MQL4言語は様々な取引・情報アプリケーションのプログラミングなど多岐にわたる使用、そして己のプログラミングセンス向上、既存アプリケーションの膨大なライブラリの可能性を秘めている言語なのです。

指標のソースコードは以下の通りです。

//+------------------------------------------------------------------+
//|                                               AlertSignal_v1.mq4 |
//|                                  Copyright © 2009, WWW.FIBOOK.RU |
//|                                                 http://fibook.ru |
//+------------------------------------------------------------------+
#property copyright  "Copyright © 2009, FIBOOK.RU"
#property link       "http://fibook.ru"
#define Str           "http://fibook.ru"
#define STRING_ID    "AlertSignal_"
#property indicator_chart_window
extern int     StartBar=1;                       // スタートバー
extern string indicator="Insert Indicator Name"; // カスタム指標
extern bool    VLine=true;                       // 縦線出力
extern bool    SignalAlert=false;                // アラートの表示・非表示</s5>
extern bool    SignalComment=true;               // コメントの表示・非表示</s5>
extern bool    SignalPlay=false;                 // サウンドプレイ
extern string  Signal="alert.wav";               // カスタム音楽ファイル
extern string  UserText="反転";   // ユーザコメント
IndicatorShortName("AlertSignal_v1 ");
//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator deinitialization function               |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for(int i=0;i<8;i++)
      ObjectDelete(STRING_ID+"VL_"+i);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator iteration function                      |
//+------------------------------------------------------------------+
int start()
  {
   string     text;
   int        ExtBars=150;  // 最後の足までのバーの数</s5>
   double     First;        // 内部変数
   double     Second;       // 内部変数
   int        per;          // 内部変数
   if(indicator=="Insert Indicator Name")
     {
      Alert(indicator);
      return;
     }
   if(per==Time[0]) return; // 期間中一回修正する</s11>
   per=Time[0];
//----
   for(int ii=StartBar;ii<ExtBars;ii++)
      for(int i=0;i<8;i++)
        {
         First =iCustom(NULL,0,indicator,i,ii);
         Second=iCustom(NULL,0,indicator,i,ii+1);
         if((Second==0 && First>0) || (Second>0 && First==0))
           {
            text=StringConcatenate(Str+" - На ",ii+1," баре ",Symbol()," -  ",indicator," ");
            AlertComment(text+UserText);
            if(VLine==true)
               ObjectCreate(STRING_ID+"VL_"+i,0,0,Time[ii],Bid);
            return;
           }
        }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator Subfunction                             |
//+------------------------------------------------------------------+

void AlertComment(string text)
  {
   if(SignalAlert==true) Alert(text);
   if(SignalComment==true) Comment(text);
   if(SignalPlay==true) PlaySound(Signal);
  }
//+------------------------------------------------------------------+