今後の立ち回り日記

今後の立ち回り日記

最近思ったことを、気が向いたら書きます。

MENU

Breakout Panca Eagle インジケータ MT5用

Breakout panca eagleについて

レンジを描いてくれる良いインジケータ無いかと探してたところ、Breakout panca eagleなるものを見つけました。1日ごとに、指定期間における高値安値のボックスを描いてくれるものです。あと名前がちょっと格好良い。しかしMT4用のものしか見つからなかったので、MT5用のものを作成してみました。
下記画像ですと、青い四角が高値安値のボックスです。高値安値算出の期間を00:00 - 05:30に設定、ボックスが終わる時間を23:00に設定しています。赤いラインはオフセット領域で、ラインの厚みは自由に設定できます。不要な場合は0にすると消せます。主な使い方は、赤いラインを超えたらその方向のトレンドに沿ってエントリー、そこからボックスの中に戻ってしまったら損切という感じです。基本は動きの少ない時間帯、ユーロドルなら東京時間、を高値安値算出期間に設定するのが良いかと思います。
f:id:scand:20201108132829p:plain
本家Panca Eagle(MT4用)https://forum.mt5.com/showthread.php?14742-Panca-Eagle-Breakout

ソースコード Breakout panca eagle.mq5

本家(MT4用)のものはオブジェクトとしてボックスを描いているようでしたが、今回はDRAW_FILLINGを使ってみました。
コピペで使えると思います。
期間をおかしな時間(開始時間>終了時間など)にするとうまく表示できないと思います。

//+------------------------------------------------------------------+
//|                                         Breakout panca eagle.mq5 |
//|                                            Copyright 2020,  scand|
//+------------------------------------------------------------------+
#property copyright "scand"
#property link     "https://scand.hatenablog.com"
#property description "Breakout panca eagle for MT5"

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_plots   3

//--- plot Intersection
#property indicator_type1   DRAW_FILLING
#property indicator_color1  MidnightBlue
#property indicator_width1  1
#property indicator_type2   DRAW_FILLING
#property indicator_color2  Crimson
#property indicator_width2  1
#property indicator_type3   DRAW_FILLING
#property indicator_color3  Crimson
#property indicator_width3  1

//--- input parametrs
input string periodBegin    = "00:00"; //Time to begin serching high and low values. Input as HH:MM
input string periodEnd      = "05:30"; //Time to end serching high and low values. Input as HH:MM
input string BoxEnd         = "23:00"; //Time to end box drawing. Input as HH:MM
input int    BoxBreakOut_Offset = 20;  //Setting of Offset area from box. Input by minimum unit(point) of the symbol

//--- Indicator buffers
double RangeBuffer1[];
double RangeBuffer2[];
double UpperBreakBuffer1[];
double UpperBreakBuffer2[];
double LowerBreakBuffer1[];  
double LowerBreakBuffer2[];  

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
   {
   //--- indicator buffers mapping
   SetIndexBuffer(0,RangeBuffer1,INDICATOR_DATA);
   SetIndexBuffer(1,RangeBuffer2,INDICATOR_DATA);
   SetIndexBuffer(2,UpperBreakBuffer1,INDICATOR_DATA);
   SetIndexBuffer(3,UpperBreakBuffer2,INDICATOR_DATA);
   SetIndexBuffer(4,LowerBreakBuffer1,INDICATOR_DATA);
   SetIndexBuffer(5,LowerBreakBuffer2,INDICATOR_DATA);

   //--- set like as timeseries  
   ArraySetAsSeries(RangeBuffer1,true);
   ArraySetAsSeries(RangeBuffer2,true);
   ArraySetAsSeries(UpperBreakBuffer1,true);
   ArraySetAsSeries(UpperBreakBuffer2,true);
   ArraySetAsSeries(LowerBreakBuffer1,true);
   ArraySetAsSeries(LowerBreakBuffer2,true);

   //---
   return(INIT_SUCCEEDED);
   }
  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
   {
   int periodBeginBar;
   int periodEndBar;
   int BoxEndBar;

   //--- main cycle
   int limit = rates_total - prev_calculated;
   if(limit == 0) limit = 1;
   for(int j=0; j<limit && !IsStopped(); j++)
      {
      //--- get this bar index and date
      int jBar=iBarShift(_Symbol, _Period, iTime(_Symbol, _Period, j));
      string jBar_date=TimeToString(iTime(_Symbol, _Period, j), TIME_DATE);
      
      //--- get period bar index in this day  
      periodBeginBar=iBarShift(_Symbol, _Period, StringToTime(jBar_date + " " +periodBegin));
      periodEndBar=iBarShift(_Symbol, _Period, StringToTime(jBar_date + " " +periodEnd));
      BoxEndBar=iBarShift(_Symbol, _Period, StringToTime(jBar_date + " " +BoxEnd));

      //--- Box drawing area
      if(periodBeginBar>=jBar && jBar>=BoxEndBar) 
         {
         //--- get Upper and Lower RangeValue in this day  
         double UpperRangeValue=iHigh(_Symbol, _Period, iHighest(_Symbol, _Period, MODE_HIGH, periodBeginBar-periodEndBar, periodEndBar));
         double LowerRangeValue=iLow(_Symbol, _Period, iLowest(_Symbol, _Period, MODE_LOW, periodBeginBar-periodEndBar, periodEndBar));      
         
         //--- set Buffer values for Draw_Filling area               
         RangeBuffer1[j]=UpperRangeValue;
         RangeBuffer2[j]=LowerRangeValue;
         UpperBreakBuffer1[j]=UpperRangeValue+BoxBreakOut_Offset*AdjustPoint(_Symbol);
         UpperBreakBuffer2[j]=UpperRangeValue;       
         LowerBreakBuffer1[j]=LowerRangeValue;  
         LowerBreakBuffer2[j]=LowerRangeValue-BoxBreakOut_Offset*AdjustPoint(_Symbol);  
         }
      //--- except Box drawing area
      else
         {
         RangeBuffer1[j]=0;
         RangeBuffer2[j]=0;
         UpperBreakBuffer1[j]=0;
         UpperBreakBuffer2[j]=0;
         LowerBreakBuffer1[j]=0;  
         LowerBreakBuffer2[j]=0;  
         }

      if(Period() >= PERIOD_D1) 
         {
         RangeBuffer1[j]=0;
         RangeBuffer2[j]=0;
         UpperBreakBuffer1[j]=0;
         UpperBreakBuffer2[j]=0;
         LowerBreakBuffer1[j]=0;  
         LowerBreakBuffer2[j]=0;  
         }
      }  

   //--- return value of prev_calculated for next call
   return(rates_total);
  }

//Point Adjustment function
double AdjustPoint(string Currency)
   {
   long Symbol_Digits=SymbolInfoInteger(Currency,SYMBOL_DIGITS);
	double Calculated_Point=0;
	if (Symbol_Digits==2)
   	{
   	   Calculated_Point=0.01;
   	}
	else if (Symbol_Digits==3)
   	{
   	   Calculated_Point=0.001;
   	}
	else if (Symbol_Digits==4)
   	{
   	   Calculated_Point=0.0001;
   	}
	else if (Symbol_Digits==5)
   	{
   	   Calculated_Point=0.00001;
   	}
	return(Calculated_Point);
   }

不具合、要改善点等ございましたらご連絡いただけますと幸いです。