トレンドラインと水平線の価格帯の取得方法

記事内に商品プロモーションを含む場合があります
スポンサーリンク

今回は、MT4のEAサンプルソース(FX用)を公開します。

はじめに

MT4のトレンドラインと水平線について、価格をプログラム(MQL4)で取得する場合どうしたらいいかについて記載しています。

トレンドラインの価格帯は簡単に取得できたのですが、水平線の価格帯をなかなかうまく取得する事ができなかったため、調査及び解決策を記載しています。

ObjectGetValueByShift()で水平線の価格帯は取得できない

まず、トレンドラインの価格帯を取得する場合、ObjectGetValueByShift()で取得する事ができます。

同じように水平線もObjectGetValueByShift()で取得できるのでは?と思ってやってみましたが、0になってうまく取得できませんでした。

結論として

水平線の価格帯を取得するにはObjectGet()で取得する必要がある

以下にサンプルソースを交えて解説します。

調査する

単純にトレンドラインと水平線を引き、その価格帯をObjectGetValueByShift()とObjectGet()の両方で取得し操作履歴に出力するEAを作っています。

以下サンプルソースです。

//+------------------------------------------------------------------+
//|                                                         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);

}

サンプルのEAをビジュアルモード等で実行し操作履歴の画像下段の赤枠(水平ライン①)を見てください。

この部分はObjectGetValueByShift()で水平線の値を取得していますが、前述したように0になっている事がわかります。

スポンサーリンク

ソースコードの解説と結果

ソース解説

では先ほどのトレンドラインと水平線を引くサンプルソースの解説です。

まずトレンドラインと水平線は以下の箇所で引いています。

   //トレンドラインを引く(斜め線)
   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()側)は0になり、水平ライン(ObjectGet()側)は正確に水平線を引いた値を取得出来ている事がわかります。

不思議ですが、水平線はObjectGet()で取得しようという事ですね!

また、トレンドライン①(ObjectGetValueByShift()側)は最新のローソク足上のトレンドラインの値になっている事がわかります。

そしてトレンドライン②(ObjectGet()側)はトレンドラインの始点の値になっている事がわかります。中々面白いですね!

ちなみにトレンドラインは、『ObjectGetValueByShift(“T_LINE”, 0);』の箇所を変えてあげるとバーシフトにちなんだトレンドラインの値を取得する事が可能です。

  • ObjectGetValueByShift(“T_LINE”, 1); ➡133.887
  • ObjectGetValueByShift(“T_LINE”, 2); ➡133.869
  • ObjectGetValueByShift(“T_LINE”, 3); ➡133.851
  • ObjectGetValueByShift(“T_LINE”, 4); ➡133.833
  • ObjectGetValueByShift(“T_LINE”, 5); ➡133.815

さいごに

以上が、『トレンドラインと水平線の価格帯の取得方法』です。

水平線の価格帯を取得する場合はObjectGet()を使用し、トレンドラインの価格帯を取得する場合はObjectGetValueByShift()を取得するという事がわかりました。

トレンドライン系の処理は以下の記事にも記載していますので良ければ参考にしてみてください。

※ EAのサンプルソースを一覧表にまとめました

※オンラインレッスンやってます


コメント