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

Vladimir | 21 10月, 2015

はじめに

経験からすると、開発者は、自身の開発する指標にアラートやコメントの表示機能を盛り込んでいないことがある。それにより、シグナル情報を表示する可能性を付け加えるリクエストが寄せられます。

MQL4プログラミング言語でテクニカル指標の情報を表示する可能性

MQL4言語には、プログラムコード作成の簡易化に役立つであろうコメント・アラート表示機能の追加などの指標バッファ拡張機能がありません。一方では、MQL4言語でだオブジェクトの位置など詳細特徴が取得できます。

この記事では、チャートにドラッグ&ドロップされたテクニカル指標の売買シグナル情報の受信方法や、[コメント]・[アラート]画面の表示方法について説明します。また、EA間でのデータの受け渡し等を提供するグローバル変数を作成する可能性も紹介します。

チャート上に適用する全ての記号は、特殊文字と矢印コードです。そのため、記号情報の取得は難しくありません。ちなみに、指標開発者がOBJ_ARROWオブジェクトの説明を詳細にすることにより、ユーザーはシグナルを容易に識別できるようになります。例としては、古典的なローソク足チャート作成者の記号説明があります。この指標の標準設定では、記号にカーソルを合わせるだけで、適当なヘルプ情報をポップアップウィンドウから得ることができます。



通常のシグナルの表示


MQL4では、詳細情報を提供するために、組込みオプションが利用可能です。

MQL4コマンド中の関数

double ObjectGet (string name, int prop_id)

は、指定されたオブジェクトプロパティの値を返します。GetLastError()関数を呼び出すと、エラー情報を得ることができます。
ObjectSet()も参

パラメータ:
name - オブジェクト名
prop_id - オブジェクトプロパティIDプロパティの一覧からどんな値でも一致します。

プロパティ識別子は、ObjectGet() および ObjectSet() の機能に使用されます。以下の一覧からどんな値でも一致します。

定数 説明
OBJPROP_TIME10datetime最初の座標の時刻部分の取得および設定
OBJPROP_PRICE11double最初の座標の価格部分の取得および設定
OBJPROP_TIME22datetime2 番目の座標の時刻部分の取得および設定
OBJPROP_PRICE23double2 番目の座標の価格部分の取得および設定
OBJPROP_TIME34datetime3 番目の座標の時刻部分の取得および設定
OBJPROP_PRICE35double3 番目の座標の価格部分の取得および設定
OBJPROP_COLOR6colorオブジェクトの の取得および設定
OBJPROP_STYLE7intオブジェクトの線種の取得および設定
OBJPROP_WIDTH8intオブジェクトの線の幅の取得および設定(1~5)
OBJPROP_BACK9boolオブジェクトの背景(塗潰し)を表示するフラグの取得および設定
OBJPROP_RAY10boolOBJ_TREND 等のオブジェクトの線(輪郭)フラグの設定/取得
OBJPROP_ELLIPSE11boolオブジェクト OBJ_FIBOARC の楕円フラグの取得および設定
OBJPROP_SCALE12doubleスケール オブジェクトのプロパティの取得および設定
OBJPROP_ANGLE13doubleオブジェクト OBJ_TRENDBYANGLE の角度のプロパティの取得および設定

OBJPROP_ARROWCODE

14

int

オブジェクト OBJ_ARROW の矢印コードプロパティ取得および設定
特殊文字または矢印列挙体の中から1つ)

OBJPROP_TIMEFRAMES15int時間枠オブジェクトのプロパティの所得および設定
オブジェクトの可視定数の1つまたは複数の値の組み合わせ
OBJPROP_DEVIATION16doubleオブジェクト OBJ_STDDEVCHANNEL の偏差プロパティの取得および設定
OBJPROP_FONTSIZE100intオブジェクト OBJ_TEXTやOBJ_LABEL のフォント サイズの取得および設定
OBJPROP_CORNER101intオブジェクト OBJ_LEVEL のアンカー コーナー プロパティの取得および設定
(0~3)
OBJPROP_XDISTANCE102intオブジェクト OBJ_LEVEL のX軸アンカー距離(ピクセル)プロパティの取得および設定
OBJPROP_YDISTANCE103intオブジェクト OBJ_LEVEL のY軸アンカー距離(ピクセル)プロパティの取得および設定
OBJPROP_FIBOLEVELS200intフィボナッチオブジェクトのレベル数の取得および設定
(1~32)
OBJPROP_LEVELCOLOR201colorオブジェクトレベルの線の色の取得および設定
OBJPROP_LEVELSTYLE202intオブジェクト レベルの線の種類の取得および設定
OBJPROP_LEVELWIDTH203intオブジェクトレベルの線の幅の取得および設定
(1~5)
OBJPROP_FIRSTLEVEL+n210+nintフィボナッチ オブジェクトレベルのインデックスnの値の取得および設定
(0~31)

OBJPROP_ARROWCODEプロパティを使ってオブジェクト一覧を取得します。その後一覧から必要なオブジェクトを検索し、リクエストされたフォームに応じてこれらのデータを入力します。

「japan」指標のためのローソク足チャートのデータ取り込みコードを書きましょう。コードは以下のようになります。

int    obj_total=ObjectsTotal(); // オブジェクトの総数を設定する
  for(int i=0;i<obj_total;i++) // 必要なオブジェクトを取得するには全オブジェクト数をループ
    {
            if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE) // コード読み取り

まず、どんな特殊文字を使うか決め、それに応じてプログラムコード内のパラメータを設定します。今回は図の中の100から始まる部分を例として使います。

if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE)>100&&
                     ObjectGet(ObjectName(i),OBJPROP_TIME1)>Time[ExtBars])

ExtBars変数は、チャート上の記号を検索するために、最後の足までのバーの数を定義します。

では、[コメント]・[アラート]画面を表示しましょう。

       if (ExtAlert==true){
                        Alert(Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                              TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                              TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                              ObjectName(i));}
       if (ExtComment==true){
                        Comment("\n","\n","\n",
                              Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                               TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                                TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                                ObjectName(i));}

コメント行

("\n","\n","\n",

は情報を3行目に表示するためのものです。

必要に応じて、EA内で使用するために、グローバル変数によるデータの受け渡しを設定できます。このように、著作権の侵害や開発者への機能追加オーダー等をすることなく、必要なシグナル情報を得ることができます。

上記の方法を用いた結果は以下の通りです。


外部の情報を表示する作業の結果


このコードは、ExCandles2指標と共に機能します。ExCnadles2はMQL4指標ベースにある2つ目の指標で、投稿済みのコードとともにテスト済みです

まとめ

テクニカル指標のシグナル情報を表示するには、以下のコードを実行します。

//+------------------------------------------------------------------+
//|                                                  AlertSignal.mq4 |
//|                                  Copyright © 2009, WWW.FIBOOK.RU |
//|                                                 http://fibook.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, FIBOOK.RU"
#property link      "http://fibook.ru"

#property indicator_chart_window
extern int ExtBars=10;        // 最後の足までのバーの数
extern int ExtArrow=100;      // コード番号
extern bool ExtAlert=true;    // アラートの表示・非表示
extern bool ExtComment=true;  // コメントの表示・非表示
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   if (per == Time[0]) return; // 期間中一回修正する
      per = Time[0];

   int cod=0;
//----

int    obj_total=ObjectsTotal();
  for(int i=0;i<obj_total;i++)
    {
            if (ObjectGet(ObjectName(i),OBJPROP_ARROWCODE)>ExtArrow&&
                     ObjectGet(ObjectName(i),OBJPROP_TIME1)>Time[ExtBars])
                {
                  if (ExtAlert==true){
                        Alert(Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                              TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                              TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                              ObjectName(i));}
                  if (ExtComment==true){
                        Comment("\n","\n","\n",
                              Symbol(),Period()," ",
                              TimeYear(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeDay(ObjectGet(ObjectName(i),OBJPROP_TIME1)),".",
                              TimeMonth(ObjectGet(ObjectName(i),OBJPROP_TIME1)),"; ",
                               TimeHour(ObjectGet(ObjectName(i),OBJPROP_TIME1)),":",
                                TimeMinute(ObjectGet(ObjectName(i),OBJPROP_TIME1))," ",
                                ObjectName(i));}
                }
     }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+