2016年6月23日木曜日

[MT4プログラム] 小ネタ チャートに垂直線、水平線、トレンドラインではない、縦線、横線、斜め線を引く

昨日フィボナッチリトレースメントラインインジケータをリリースしました。

■フィボナッチリトレースメントライン一挙表示

980円で販売中~
過去にさかのぼって、フィボナッチを一挙表示でタイミングをつかむ
複数頂点のフィボナッチリトレースメント一挙表示


MT4プログラムをやっている人は、このインジケータをみて、あれー?とおもったかもしれません。

というのもMT4の水平線、垂直線、トレンドラインは、基本チャート幅いっぱいに引かれてしまいます。

■MT4に垂直線、水平線、トレンドラインを引いた場合

リリースしたインジケータのようにある決まった時間/価格の範囲だけに線をひくというオブジェクトは用意されていません。
私も最初やれないのだろうなぁと思っていたら、海外のインジケータで実現しているものがあり、あれ?これ何とかできる???と思い調べてみました。

■MT4 一部分だけ、線を引きたい・・・・。

結論から行くと、四角形と三角形を工夫すると、描画可能です。

まず、OBJPROP_BACKプロパティをFalseにして外形ライン描画にします。
上記のオブジェクトに対して四角形の始点終点の価格を同じにすると、横線。
時間を同じにすると縦線

三角形の2点目3点目を同一の点にすると斜め線が描画できます。

サンプルプログラムはこんな感じになります。

//------------------------------------------------------------------
// 横線・縦線・斜め線

#property copyright "Copyright 2016,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

#define OBJECT_NAME "OBJ_DRAW_LINE"

//------------------------------------------------------------------
//開始処理
int OnInit()
{
   return(INIT_SUCCEEDED);
}
  
//------------------------------------------------------------------
//終了処理
void OnDeinit( const int reason )
{
   ClearObject();
}

//------------------------------------------------------------------
//計算処理
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[])
{
   ClearObject();

   long chartId = ChartID();
   
   //横線、OBJ_RECTANGLEにおいて、始点終点価格が同一で、OBJPROP_BACK=falseにすると横線になる。
   string name = OBJECT_NAME + "_HLINE";
   if ( ObjectCreate( chartId, name, OBJ_RECTANGLE, 0, time[0], high[0], time[20], high[0] ) == false )
   {
      return false;
   }
   ObjectSetInteger( chartId, name, OBJPROP_COLOR, clrRed );
   ObjectSetInteger( chartId, name, OBJPROP_BACK, false );

   //縦線、OBJ_RECTANGLEにおいて、始点終点時間が同一で、OBJPROP_BACK=falseにすると縦線になる。
   name = OBJECT_NAME + "_VLINE";
   if ( ObjectCreate( chartId, name, OBJ_RECTANGLE, 0, time[1], low[iLowest(NULL,0, MODE_LOW, 20)], time[1], high[iHighest(NULL, 0, MODE_HIGH, 20)] ) == false )
   {
      return false;
   }
   ObjectSetInteger( chartId, name, OBJPROP_COLOR, clrRed );
   ObjectSetInteger( chartId, name, OBJPROP_BACK, false );

   //斜め線、OBJ_TRIANGLEにおいて、2点目と3点目が同一、時間価格でOBJPROP_BACK=falseにすると斜め線になる。
   name = OBJECT_NAME + "_ANGLELINE";
   if ( ObjectCreate( chartId, name, OBJ_TRIANGLE, 0, time[20], low[20], time[1], high[1], time[1], high[1] ) == false )
   {
      return false;
   }
   ObjectSetInteger( chartId, name, OBJPROP_COLOR, clrRed );
   ObjectSetInteger( chartId, name, OBJPROP_BACK, false );

   return(rates_total);
}

//------------------------------------------------------------------
//オブジェクトの全削除
void ClearObject()
{
   long chartId = ChartID();

   int total = ObjectsTotal( chartId );
   //生成したオブジェクトを削除する。
   //0から削除するとインデックス位置がずれて
   //正しく削除できないため、後ろから削除するようにする。
   for( int i = total - 1; i >= 0 ; i--)
   {
      string name = ObjectName( chartId, i );
      
      // 先頭文字列がRangeRectangleNameと一致する場合、削除する。
      if ( StringFind( name, OBJECT_NAME ) == 0 )
      {
         ObjectDelete( chartId, name );
      }
   }
}


これができると、インジケータ表現の幅が広がります。ぜひ皆さまもお試しください。

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ MetaTraderへ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。