//+------------------------------------------------------------------+
//| High_Low_Chart_v103.mq4 |
//| Copyright 2021, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, UNCHARTED INDEX"
#property link "https://ameblo.jp/pec02225/"
#property version "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Red
input int kikan = 12; //期間
double Buffer1[];
double Buffer2[];
datetime master_hour[20];
double master_place[20];
int master_pm[20];
datetime backup_hour;
double backup_place;
int backup_pm;
datetime hh_hour[2];
double hh_place[2];
int hh_pm[2];
datetime mm_hour[2];
double mm_place[2];
int mm_pm[2];
int drow = 0;
int hh = 0;
int mm = 0;
int hhh = 0;
int mmm = 0;
datetime hhh_hour;
double hhh_place;
int hhh_pm;
datetime mmm_hour;
double mmm_place;
int mmm_pm;
int first_run =0;
datetime kari_hour[5];
double kari_place[5];
int kari_pm[5];
int kari;
datetime master_time;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexStyle(0,DRAW_LINE,EMPTY,3);
SetIndexStyle(1,DRAW_LINE,EMPTY,3);
SetIndexBuffer(0,Buffer1);
SetIndexBuffer(1,Buffer2);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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[])
{
//---
int limit;
limit = Bars - IndicatorCounted()- kikan -1;
if(first_run == 0)
{
hi_lo(limit);
}
else
{
int c = 0;
c = iBarShift(Symbol(),PERIOD_CURRENT,master_time,false);
hi_lo(c);
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
void hi_lo(int x)
{
while(x > 0)
{
if(drow == 0 && iHighest(Symbol(),PERIOD_CURRENT,MODE_HIGH,kikan,x) == iLowest(Symbol(),PERIOD_CURRENT,MODE_LOW,kikan,x))
{
}
else
{
if(hh == 0)
{
hh_hour[0] = iTime(Symbol(),PERIOD_CURRENT,iHighest(Symbol(),PERIOD_CURRENT,MODE_HIGH,kikan,x));
hh_place[0] = iHigh(Symbol(),PERIOD_CURRENT,iHighest(Symbol(),PERIOD_CURRENT,MODE_HIGH,kikan,x));
hh_pm[0] = 1;
hh = 1;
}
if(mm == 0)
{
mm_hour[0] = iTime(Symbol(),PERIOD_CURRENT,iLowest(Symbol(),PERIOD_CURRENT,MODE_LOW,kikan,x));
mm_place[0] = iLow(Symbol(),PERIOD_CURRENT,iLowest(Symbol(),PERIOD_CURRENT,MODE_LOW,kikan,x));
mm_pm[0] = -1;
mm = 1;
}
if(hh == 1)
{
hh_hour[1] = iTime(Symbol(),PERIOD_CURRENT,iHighest(Symbol(),PERIOD_CURRENT,MODE_HIGH,kikan,x));
hh_place[1] = iHigh(Symbol(),PERIOD_CURRENT,iHighest(Symbol(),PERIOD_CURRENT,MODE_HIGH,kikan,x));
hh_pm[1] = 1;
hh = 1;
}
if(mm == 1)
{
mm_hour[1] = iTime(Symbol(),PERIOD_CURRENT,iLowest(Symbol(),PERIOD_CURRENT,MODE_LOW,kikan,x));
mm_place[1] = iLow(Symbol(),PERIOD_CURRENT,iLowest(Symbol(),PERIOD_CURRENT,MODE_LOW,kikan,x));
mm_pm[1] = -1;
mm = 1;
}
if(hh == 1)
{
int m1 = iBarShift(Symbol(),PERIOD_CURRENT,hh_hour[0],false);
int m2 = iBarShift(Symbol(),PERIOD_CURRENT,hh_hour[1],false);
if(m1 > m2)
{
if(m1 <= m2 + kikan -1)
{
if(hh_place[0] <= hh_place[1])
{
hh_hour[0] = hh_hour[1];
hh_place[0] = hh_place[1];
hh_pm[0] = hh_pm[1];
}
}
else
{
hhh = 1;
hhh_hour = hh_hour[0];
hhh_place = hh_place[0];
hhh_pm = hh_pm[0];
hh_hour[0] = hh_hour[1];
hh_place[0] = hh_place[1];
hh_pm[0] = hh_pm[1];
}
}
}
if(mm == 1)
{
int m1 = iBarShift(Symbol(),PERIOD_CURRENT,mm_hour[0],false);
int m2 = iBarShift(Symbol(),PERIOD_CURRENT,mm_hour[1],false);
if(m1 > m2)
{
if(m1 <= m2 + kikan -1)
{
if(mm_place[0] >= mm_place[1])
{
mm_hour[0] = mm_hour[1];
mm_place[0] = mm_place[1];
mm_pm[0] = mm_pm[1];
}
}
else
{
mmm = 1;
mmm_hour = mm_hour[0];
mmm_place = mm_place[0];
mmm_pm = mm_pm[0];
mm_hour[0] = mm_hour[1];
mm_place[0] = mm_place[1];
mm_pm[0] = mm_pm[1];
}
}
}
if(hhh == 1 && mmm == 1)
{
if(hhh_hour > mmm_hour)
{
low();
high();
}
else
if(hhh_hour < mmm_hour)
{
high();
low();
}
else
{
if(master_pm[drow - 1] == hhh_pm)
{
low();
}
else
{
high();
}
}
}
else
if(hhh == 1)
{
high();
}
else
if(mmm == 1)
{
low();
}
}
if(drow > 2)
drows();
x--;
}
first_run = 1;
master_time = master_hour[0];
for(int i = 0; i < drow; i++)
{
kari_hour[i] = master_hour[i];
kari_place[i] = master_place[i];
kari_pm[i] = master_pm[i];
}
kari = drow;
if(hh_hour[0] > mm_hour[0])
{
if(kari_hour[kari-1] < mm_hour[0])
{
if(kari_pm[kari-1] != mm_pm[0])
{
kari_hour[kari] = mm_hour[0];
kari_place[kari] = mm_place[0];
kari_pm[kari] = mm_pm[0];
kari++;
kari_hour[kari] = hh_hour[0];
kari_place[kari] = hh_place[0];
kari_pm[kari] = hh_pm[0];
kari++;
}
else
{
if(kari_place[kari-1] >= mm_place[0])
{
kari_hour[kari-1] = mm_hour[0];
kari_place[kari-1] = mm_place[0];
kari_pm[kari-1] = mm_pm[0];
kari_hour[kari] = hh_hour[0];
kari_place[kari] = hh_place[0];
kari_pm[kari] = hh_pm[0];
kari++;
}
else
{
kari_hour[kari] = hh_hour[0];
kari_place[kari] = hh_place[0];
kari_pm[kari] = hh_pm[0];
kari++;
}
}
}
}
else
if(hh_hour[0] < mm_hour[0])
{
if(kari_hour[kari-1] < hh_hour[0])
{
if(kari_pm[kari-1] != hh_pm[0])
{
kari_hour[kari] = hh_hour[0];
kari_place[kari] = hh_place[0];
kari_pm[kari] = hh_pm[0];
kari++;
kari_hour[kari] = mm_hour[0];
kari_place[kari] = mm_place[0];
kari_pm[kari] = mm_pm[0];
kari++;
}
else
{
if(kari_place[kari-1] <= hh_place[0])
{
kari_hour[kari-1] = hh_hour[0];
kari_place[kari-1] = hh_place[0];
kari_pm[kari-1] = hh_pm[0];
kari_hour[kari] = mm_hour[0];
kari_place[kari] = mm_place[0];
kari_pm[kari] = mm_pm[0];
kari++;
}
else
{
kari_hour[kari] = mm_hour[0];
kari_place[kari] = mm_place[0];
kari_pm[kari] = mm_pm[0];
kari++;
}
}
}
}
else
{
if(kari_hour[kari-1] < hh_hour[0])
{
if(kari_pm[kari-1] == hh_pm[0])
{
kari_hour[kari] = hh_hour[0];
kari_place[kari] = hh_place[0];
kari_pm[kari] = hh_pm[0];
kari++;
}
else
{
kari_hour[kari] = mm_hour[0];
kari_place[kari] = mm_place[0];
kari_pm[kari] = mm_pm[0];
kari++;
}
}
}
if(kari_hour[kari -1] != 0)
{
kari_hour[kari] =iTime(Symbol(),PERIOD_CURRENT,0);
kari_place[kari] = iClose(Symbol(),PERIOD_CURRENT,0);
kari_pm[kari] = 0;
}
kari_drows();
}
//------------------------------------------------------------
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void drows()
{
while(drow > 2)
{
double sa = master_place[0] - master_place[1];
int m1 = iBarShift(Symbol(),PERIOD_CURRENT,master_hour[0],false);
int m2 = iBarShift(Symbol(),PERIOD_CURRENT,master_hour[1],false);
sa = sa / ((double)m1 - (double)m2);
int kk = 0;
for(int ww = m1 ; ww >= m2; ww--)
{
Buffer1[ww] = master_place[0] + ((double)kk * sa);
kk--;
backup_hour = master_hour[0];
backup_place = master_place[0];
backup_pm = master_pm[0];
}
for(int i = 0; i <=drow; i++)
{
master_hour[i] = master_hour[i+1];
master_place[i] = master_place[i+1];
master_pm[i] = master_pm[i+1];
}
drow--;
}
}
//-------------------------------------------------------------------
void kari_drows()
{
for(int i = 0; i < kari; i++)
{
double sa = kari_place[i] - kari_place[i+1];
int m1 = iBarShift(Symbol(),PERIOD_CURRENT,kari_hour[i],false);
int m2 = iBarShift(Symbol(),PERIOD_CURRENT,kari_hour[i+1],false);
sa = sa / ((double)m1 - (double)m2);
int kk = 0;
for(int ww = m1 ; ww >= (int)m2; ww--)
{
Buffer2[ww] = kari_place[i] + ((double)kk * sa);
kk--;
}
}
}
//-------------------------------------------
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void high()
{
if(drow == 0)
{
master_hour[drow] = hhh_hour;
master_place[drow] = hhh_place;
master_pm[drow] = hhh_pm;
hhh=0;
drow++;
}
else
{
if(master_pm[drow - 1] == hhh_pm)
{
if(master_place[drow - 1] <= hhh_place)
{
if(master_hour[drow -1] < hhh_hour)
{
master_hour[drow-1] = hhh_hour;
master_place[drow-1] = hhh_place;
master_pm[drow-1] = hhh_pm;
hhh=0;
}
}
}
else
{
if(master_hour[drow -1] < hhh_hour)
{
master_hour[drow] = hhh_hour;
master_place[drow] = hhh_place;
master_pm[drow] = hhh_pm;
hhh=0;
drow++;
}
else
{
if(drow >= 2)
{
if(master_hour[drow -2] < hhh_hour && master_hour[drow -1] > hhh_hour)
{
if(master_place[drow -2] <= hhh_place)
{
master_hour[drow -2] = hhh_hour;
master_place[drow -2] = hhh_place;
master_pm[drow -2] = hhh_pm;
hhh=0;
for(int i = drow; i > 0; i--)
{
master_hour[i] = master_hour[i-1];
master_place[i] = master_place[i-1];
master_pm[i] = master_pm[i-1];
}
master_hour[0] = backup_hour;
master_place[0] = backup_place;
master_pm[0] = backup_pm;
drow++;
}
}
}
}
}
}
}
//----------------------------------------------------------------
void low()
{
if(drow == 0)
{
master_hour[drow] = mmm_hour;
master_place[drow] = mmm_place;
master_pm[drow] = mmm_pm;
mmm=0;
drow++;
}
else
{
if(master_pm[drow - 1] == mmm_pm)
{
if(master_place[drow - 1] >= mmm_place)
{
if(master_hour[drow -1] < mmm_hour)
{
master_hour[drow-1] = mmm_hour;
master_place[drow-1] = mmm_place;
master_pm[drow-1] = mmm_pm;
mmm=0;
}
}
}
else
{
if(master_hour[drow -1] < mmm_hour)
{
master_hour[drow] = mmm_hour;
master_place[drow] = mmm_place;
master_pm[drow] = mmm_pm;
mmm=0;
drow++;
}
else
{
if(drow >= 2)
{
if(master_hour[drow -2] < mmm_hour &&master_hour[drow -1] > mmm_hour)
{
if(master_place[drow -2] >= mmm_place)
{
master_hour[drow -2] = mmm_hour;
master_place[drow -2] = mmm_place;
master_pm[drow -2] = mmm_pm;
mmm=0;
for(int i = drow; i > 0; i--)
{
master_hour[i] = master_hour[i-1];
master_place[i] = master_place[i-1];
master_pm[i] = master_pm[i-1];
}
master_hour[0] = backup_hour;
master_place[0] = backup_place;
master_pm[0] = backup_pm;
drow++;
}
}
}
}
}
}
}
//-------------ここまで------------------