概要
MT4のトレンドラインと水平線について、価格をプログラム(MQL4)で取得する場合どうしたらいいかについて記載しています。
トレンドラインの価格帯を取得する方法については解説サイトがあったのですが、水平線の価格帯を取得する方法を見つけることができなかったので解決策を記載しました。
ObjectGetValueByShift()で水平線の価格帯は取得できない
まず、トレンドラインの価格帯を取得する場合、ObjectGetValueByShift()で取得する事ができます。
同じように水平線もObjectGetValueByShift()で取得できるのでは?と思ってやってみましたが、0になってうまく取得できませんでした。
水平線の価格帯を取得するにはObjectGet()で取得する必要があります。以下にサンプルソースを交えて解説します。
サンプルソースコード
サンプルのソースコードは単純にトレンドラインと水平線を引くEAを作り、その価格帯をObjectGetValueByShift()とObjectGet()の両方で取得し操作履歴に出力しています。

画像下段の赤枠(水平ライン①)を見ると分かりますが、水平線をObjectGetValueByShift()で取得すると0になっている事がわかります。
//+------------------------------------------------------------------+
//| test.mq4 |
//| Copyright 2020, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
// エントリー関数
void OnTick()
{
//トレンドラインを引く(斜め線)
ObjectDelete(0,"T_LINE");
ObjectCreate(0,"T_LINE",OBJ_TREND,0,Time[40],Close[40],Time[10],Close[10]);
ObjectSetInteger(0,"T_LINE",OBJPROP_COLOR,clrYellow);
ObjectSetInteger(0,"T_LINE",OBJPROP_STYLE,STYLE_SOLID);
ObjectSetInteger(0,"T_LINE",OBJPROP_WIDTH,2);
ObjectSetInteger(0,"T_LINE",OBJPROP_RAY_RIGHT,true);
//水平線を引く
ObjectDelete(0,"H_LINE");
ObjectCreate(0,"H_LINE",OBJ_HLINE,0,0,iLow(NULL, 0, 0));
ObjectSetInteger(0,"H_LINE",OBJPROP_COLOR,clrRed);
ObjectSetInteger(0,"H_LINE",OBJPROP_STYLE,STYLE_DOT);
ObjectSetInteger(0,"H_LINE",OBJPROP_WIDTH,2);
//各オブジェクトの値を取得する
double Sh_T = ObjectGetValueByShift("T_LINE", 0);
double OG_T = ObjectGet("T_LINE",OBJPROP_PRICE1);
double Sh_H = ObjectGetValueByShift("H_LINE", 0);
double OG_H = ObjectGet("H_LINE",OBJPROP_PRICE1);
Print("トレンドライン①" + Sh_T);
Print("トレンドライン②" + OG_T);
Print("水平ライン①" + Sh_H);
Print("水平ライン②" + OG_H);
}
ソースコードの解説
トレンドラインと水平線を引くサンプルソースの解説です。
まずトレンドラインと水平線は以下の箇所で引いています。
//トレンドラインを引く(斜め線)
ObjectDelete(0,"T_LINE");
ObjectCreate(0,"T_LINE",OBJ_TREND,0,Time[40],Close[40],Time[10],Close[10]);
ObjectSetInteger(0,"T_LINE",OBJPROP_COLOR,clrYellow);
ObjectSetInteger(0,"T_LINE",OBJPROP_STYLE,STYLE_SOLID);
ObjectSetInteger(0,"T_LINE",OBJPROP_WIDTH,2);
ObjectSetInteger(0,"T_LINE",OBJPROP_RAY_RIGHT,true);
//水平線を引く
ObjectDelete(0,"H_LINE");
ObjectCreate(0,"H_LINE",OBJ_HLINE,0,0,iLow(NULL, 0, 0));
ObjectSetInteger(0,"H_LINE",OBJPROP_COLOR,clrRed);
ObjectSetInteger(0,"H_LINE",OBJPROP_STYLE,STYLE_DOT);
ObjectSetInteger(0,"H_LINE",OBJPROP_WIDTH,2);
続いてトレンドラインと水平線の価格帯を取得する箇所です。
//各オブジェクトの値を取得する
double Sh_T = ObjectGetValueByShift("T_LINE", 0);
double OG_T = ObjectGet("T_LINE",OBJPROP_PRICE1);
double Sh_H = ObjectGetValueByShift("H_LINE", 0);
double OG_H = ObjectGet("H_LINE",OBJPROP_PRICE1);
ObjectGetValueByShift()とObjectGet()を使っています。
最後は出力箇所です。
Print("トレンドライン①" + Sh_T);
Print("トレンドライン②" + OG_T);
Print("水平ライン①" + Sh_H);
Print("水平ライン②" + OG_H);

トレンドライン①はObjectGetValueByShift()で取得している値ですが、最新のローソク足上のトレンドラインの値になっている事がわかります。
トレンドライン②はObjectGet()で取得している値ですが、トレンドラインの始点の値になっている事がわかります。
水平ライン①はObjectGetValueByShift()で取得している値ですが、0になっている事がわかります。
水平ライン②はObjectGet()で取得している値ですが、水平線を引いた値になっている事がわかります。
さいごに
以上が、『トレンドラインと水平線の価格帯の取得方法』です。
水平線の価格帯を取得する場合はObjectGet()を使用し、トレンドラインの価格帯を取得する場合はObjectGetValueByShift()を取得するという事がわかりました。
※ MT4・EAが使えるFX会社のおすすめ
※ EAのサンプルソースを一覧表にまとめました
コメント