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


                    }

                 }
              }

           }


        }




     }


  }

//-------------ここまで------------------

 

 

 

リアル取引口座を開設する

 

デモ口座を開設する

 

にほんブログ村 為替ブログ システムトレード 自作EA派へ
にほんブログ村