Breakout panca eagleについて
レンジを描いてくれる良いインジケータ無いかと探してたところ、Breakout panca eagleなるものを見つけました。1日ごとに、指定期間における高値安値のボックスを描いてくれるものです。あと名前がちょっと格好良い。しかしMT4用のものしか見つからなかったので、MT5用のものを作成してみました。
下記画像ですと、青い四角が高値安値のボックスです。高値安値算出の期間を00:00 - 05:30に設定、ボックスが終わる時間を23:00に設定しています。赤いラインはオフセット領域で、ラインの厚みは自由に設定できます。不要な場合は0にすると消せます。主な使い方は、赤いラインを超えたらその方向のトレンドに沿ってエントリー、そこからボックスの中に戻ってしまったら損切という感じです。基本は動きの少ない時間帯、ユーロドルなら東京時間、を高値安値算出期間に設定するのが良いかと思います。
本家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); }
不具合、要改善点等ございましたらご連絡いただけますと幸いです。