2015年4月9日木曜日

[MT4プログラミング]MT4のチャート上に矢印を表示する。

※矢印の位置を調整する記事です。

矢印の縦位置をチャートの高さを見て調整する。
http://mt4program.blogspot.jp/2015/10/blog-post_17.html

本記事は、オブジェクトを使って矢印を出すやり方を記載しています。バッファーを使っても矢印が描画可能です。そちらの記事はこちらから

[MT4インジケータ]値動きが一定を超えたら矢印を出す
http://mt4program.blogspot.jp/2016/04/mt4_12.html


実際取引に使う上で、グラフ上に何かの記号が出せるとよりわかりやすい場合があります。
結局今買うべき?売るべき?様子見?などわかりやすい記号で出せると便利ですよね。きっと。

Arrow.PNG

今回はコードの前にまず使う関数を説明します。
MT4ではObjectCreate関数で、チャート上にオブジェクトを表示できます。

OjbectCreate
bool ObjectCreate(
long chart_id, // チャートID
string object_name, // オブジェクト名
ENUM_OBJECT object_type, // オブジェクト種別
int sub_window, // 0:価格チャート、1~子チャート
datetime time1, // 横軸(時間)の表示位置
double price1, // 縦軸(価格)の表示位置
...
datetime timeN=0, // オブジェクトの種類によって複数、
double priceN=0 // 縦軸横軸を指定します。指定不要の場合省略可能です。
);

作ったオブジェクトは、インジケーター終了後削除する必要があります。
ObjectDelete
bool ObjectDelete(
long chart_id, // チャートID
string object_name // オブジェクト名
);

チャートのプロパティを設定する場合はObjectSetXXXXXを使用します。XXXXXは型が入ります。たとえばIntegerだと次のようになります。
ObjectSetInteger
bool ObjectSetInteger(
long chart_id, // チャートID
string object_name, // オブジェクト名
int index, // プロパティ種別
long value // 値
);
XXXXXの部分と、値引数の型が異なるものが、ObjectSetDouble、ObjectSetInteger、ObjectSetStringの3種類用意されています。
旧MQL4で使用されていたObjectSetも引き続き利用できるようですが将来のことも考えて新しい関数で作成します。

各関数でのchart_id引数は、ChartID()関数で取得した値を設定するのが間違いなさそうです。

上記関数を使って、チャートウィンドウに今買うべきか売るべきかを示すサインを出すプログラムを書きたいと思います。
今回はオブジェクトを表示するサンプルですので、サインそのものはいい加減な値です。

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



ソースコードはこちらです。



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

//UPDOWN サインオブジェクト名
const string OBJECT_NAME = "OjbectSign";

//------------------------------------------------------------------
//初期化
int OnInit()
{
   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[])
{

   if( rates_total < 2 )
   {
      return (rates_total - 1);
   }
   // 売買サインを表示する。
   // 適当に前のバーのクローズ値より今のバーのクローズ値が大きければ買、それ以外は売
   CreateArrawObject( close[0] > close[1] ? OBJ_ARROW_BUY : OBJ_ARROW_SELL, time[0], close[0]);

   return(rates_total - 1);
}

//------------------------------------------------------------------
//終了
void OnDeinit(const int reason)
{
   //オブジェクトを削除する。
   ObjectDelete(ChartID(), OBJECT_NAME);
}

//------------------------------------------------------------------
//売買矢印オブジェクトを生成する。
bool CreateArrawObject(
   ENUM_OBJECT objectType,  //オブジェクトの種類(OBJ_ARROW_BUY/OBJ_ARROW_SELL)
   datetime time,           //表示時間(横軸)
   double price )           //表示時間(縦軸)
{
   //オブジェクトを作成する。
   long chartId = ChartID();

   ObjectDelete(chartId, OBJECT_NAME);

   if( !ObjectCreate(chartId, OBJECT_NAME, objectType, 0, time, price) )
   {
      return false;
   }
   ObjectSetInteger(chartId, OBJECT_NAME, OBJPROP_HIDDEN, true);
   ObjectSetInteger(chartId, OBJECT_NAME, OBJPROP_COLOR, objectType == OBJ_ARROW_BUY ? C'200,200,255' : C'255,128,128');
   ObjectSetInteger(chartId, OBJECT_NAME, OBJPROP_ARROWCODE, objectType == OBJ_ARROW_BUY ? 233 : 234);

   return true;
}
//+------------------------------------------------------------------+


プログラム内でC'200,200,255'という記述がありますが、これはカラー値(R,G,B)となります。

OBJPROP_ARROWCODEプロパティを設定しないと全部矢印が右方向矢印になるのが最初わかりませんでした。
罠ですね(汗)OBJ_ARROW_BUYのリファレンスに、どこにも書いてありません・・・。

3項演算子objectType == OBJ_ARROW_BUY ? 233 : 234が登場しています。これはC言語の書き方です。
条件 ? 条件が真の時の値 : 条件が偽の時の値
という形になり
if( 条件 )
{
条件が真の場合
}
else
{
条件が偽の場合
}
といったif文と同様の動きをしますがコードを短く書けます。
見にくくなるという事で嫌う人も多いですが、自分で書くプログラムならキーボードのタッチ量が少ないことは正義です(笑)

OBJPROP_ARROWCODEについては気ままにMT4: さんを参考にさせていただきました。