2015年11月17日火曜日

[MT4プログラミング]スクリプトでトレンドラインを引く

どちらかというと小ネタの部類ですが、スクリプトを使ってトレンドラインを引きます。


何かしら決まった考え方があって、毎回チャートを開く時に、その考え方に合わせてオブジェクトを配置できると素早く取引が可能かと思います。

ということで、よく使うであろうトレンドラインのサンプルです。
20本毎の高値安値に合わせてトレンドラインを描画します。

トレンドラインの引き方も計算でびしっと決まることは少ないと思います。基本線を引いてあとは自分で調整といった使い方ができるように引いた線は修正可能にします。

・・・・・やってみましたが、単純に20本毎の線という意味では微妙にですね(^^; 期間についてはもう少し考えることが必要そうです。

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


プログラムはこちらから




//------------------------------------------------------------------
// トレンドラインを引く
#property copyright "Copyright 2015,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict

//オブジェクト名
#define OBJECT_NAME "OBJ_FRACTALS"

// 高値安値 判定期間
input int Period = 20;

// ライン色
input color LineColor = clrWhite;

//------------------------------------------------------------------
//スクリプト本体
void OnStart()
{
   // とりあえずのアルゴリズムとして20本の高値安値にトレンドラインを引いてみる。
   int highest1 = iHighest( NULL, PERIOD_CURRENT, MODE_HIGH, Period, Period + 1);
   int lowest1 = iLowest( NULL, PERIOD_CURRENT, MODE_LOW, Period, Period + 1);

   int highest2 = iHighest( NULL, PERIOD_CURRENT, MODE_HIGH, Period, 1);
   int lowest2 = iLowest( NULL, PERIOD_CURRENT, MODE_LOW, Period, 1);

   DrawOrReplaceTrendline(OBJECT_NAME + "TOP"
      , iTime(NULL, PERIOD_CURRENT, highest1)
      , iHigh(NULL, PERIOD_CURRENT, highest1)
      , iTime(NULL, PERIOD_CURRENT, highest2)
      , iHigh(NULL, PERIOD_CURRENT, highest2)
      , LineColor);

   DrawOrReplaceTrendline(OBJECT_NAME + "BOTTOM"
      , iTime(NULL, PERIOD_CURRENT, lowest1)
      , iLow(NULL, PERIOD_CURRENT, lowest1)
      , iTime(NULL, PERIOD_CURRENT, lowest2)
      , iLow(NULL, PERIOD_CURRENT, lowest2)
      , LineColor);
}

//------------------------------------------------------------------
//トレンドラインを描画する
bool DrawOrReplaceTrendline(
     string name
   , datetime time1
   , double price1
   , datetime time2
   , double price2
   , color lineColor)
{
   //オブジェクトを作成する。
   long chartId = ChartID();
   
   if( ObjectFind(chartId, name) >= 0 )
   {
      ObjectMove(chartId, name, 0, time1, price1);
      ObjectMove(chartId, name, 1, time2, price2);
      return true;
   }   
   else
   {
      //チャート縦幅いっぱいに表示する。
      if( !ObjectCreate(chartId, name, OBJ_TREND, 0, time1, price1, time2, price2) )
      {
         return false;
      }
      ObjectSetInteger(chartId, name, OBJPROP_COLOR, lineColor);
   }
   return true;
}