Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2545

 
Игорь #:

Установил  параметр 5, сигналов стало больше, однако макд не изменился (остался сплющенным).

Откуда берет свои значения сигнальный индикатор?

 
Tretyakov Rostyslav #:

Откуда берет свои значения сигнальный индикатор?

input uint GSv_range=12;
input int Shift=0; // сдвиг индикатора по горизонтали в барах
 
Игорь #:

Вы не поняли. Покажите код сигнального индикатора

 
Tretyakov Rostyslav #:

Вы не поняли. Покажите код сигнального индикатора

int OnCalculateTwo(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[])

  {
//---- проверка количества баров на достаточность для расчёта
   if(rates_total<min_rates_total)
      return(0);

//---- индексация элементов в массивах как в таймсериях
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);

//---- Объявление целых переменных
   int i,bar,bar1,limit,count;

//---- расчёты стартового номера limit для цикла пересчёта баров
   if(prev_calculated>rates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора
     {
      limit=rates_total-min_rates_total; // стартовый номер для расчёта всех баров
      initfl=0;
      draw_up=0;
      draw_dn=0;
      cur_h=0;
      cur_l=0;
     }
   else
     {
      limit=rates_total-prev_calculated; // стартовый номер для расчёта новых баров
     }

//---- первоначальная инициализация
   if(initfl!=1)
      myInit(rates_total,open,high,low,close);
   int bars2=rates_total-2;
   int bars1=rates_total-1;

//---- основной цикл расчёта индикатора
   for(bar=limit; bar>=0 && !IsStopped(); bar--)
     {
      bar1=bar+1;
      count=bars1-bar;
      HighestBuffer[bar]=NULL;
      LowestBuffer[bar]=NULL;
      //---- если на предыдущем баре был отрисован экстремум
      if((HighestBuffer[bar1]>0 || LowestBuffer[bar1]>0)&& lb!=count)
        {
         if(draw_up)
            s_dn=0;
         else
            if(draw_dn)
               s_up=0;
        }
      if(lb!=count)
        {
         cur_h=0;
         cur_l=0;
        }
      if(bar>bars2-drawf || (high[bar]<=high[bar1] && low[bar]>=low[bar1]))
         continue;
      if(draw_up)
        {
         //---- если линия направлена вверх
         if(high[bar]>h)
           {
            //---- если достигнут новый максимум
            h=high[bar];
            cur_h=1;
           }
         if(low[bar]<l)
           {
            //---- если достигнут новый минимум
            l=low[bar];
            //---- если это не тот же самый бар
            if(lb!=count || cur_l!=1)
               s_dn++;
            cur_l=1;
           }
         //---- если счетчики равны
         if(s_up==s_dn)
           {
            //---- если последний бар одновременно новый максимум и минимум
            if(cur_h==cur_l && cur_l==1)
              {
               //---- если свеча медвежья
               if(close[bar]<=open[bar])
                 {
                  draw_up=0;
                  draw_dn=1;
                  fPoint_i=sPoint_i;
                  sPoint_i=count;
                  LowestBuffer[bar]=l;
                  for(i=bars2-fPoint_i; i>bar; i--)
                    {
                     HighestBuffer[i]=NULL;
                     LowestBuffer[i]=NULL;
                    }
                 }
               else
                 {
                  //---- если свеча бычья
                  sPoint_i=count;
                  HighestBuffer[bar]=h;
                  for(i=bars2-fPoint_i; i>bar; i--)
                    {
                     HighestBuffer[i]=NULL;
                     LowestBuffer[i]=NULL;
                    }
                 }
              }
            else
              {
               //---- если последний бар только новый максимум
               if(cur_h==1)
                 {
                  sPoint_i=count;
                  HighestBuffer[bar]=h;
                  l=low[bar];
                  for(i=bars2-fPoint_i; i>bar; i--)
                    {
                     HighestBuffer[i]=NULL;
                     LowestBuffer[i]=NULL;
                    }
                 }
               else
                 {
                  if(cur_l==1)
                    {
                     //---- если последний бар только новый минимум
                     draw_up=0;
                     draw_dn=1;
                     fPoint_i=sPoint_i;
                     sPoint_i=count;
                     LowestBuffer[bar]=l;
                     h=high[bar];
                     for(i=bars2-fPoint_i; i>bar; i--)
                       {
                        HighestBuffer[i]=NULL;
                        LowestBuffer[i]=NULL;
                       }
                    }
                 }
              }
           }
         else
           {
            //---- иначе если смены направления нет явно (счетчик Dn свечей не равен GSv_range)
            //---- если достигнут новый максимум
            if(cur_h==1)
              {
               sPoint_i=count;
               HighestBuffer[bar]=h;
               for(i=bars2-fPoint_i; i>bar; i--)
                 {
                  HighestBuffer[i]=NULL;
                  LowestBuffer[i]=NULL;
                 }
               l=low[bar];
              }
           }
        }
      else
        {
         //---- если линия направлена вниз
         if(high[bar]>h)
           {
            //---- если достигнут новый максимум
            h=high[bar];
            if(lb!=count || cur_h!=1)
               s_up++;
            cur_h=1;
            //---- если это не тот же самый бар
           }
         if(low[bar]<l)
           {
            //---- если достигнут новый минимум
            l=low[bar];
            cur_l=1;
           }
         //---- если счетчики равны
         if(s_up==s_dn)
           {
            //---- если последний бар одновременно новый максимум и минимум
            if(cur_h==cur_l && cur_l==1)
              {
               //---- если свеча медвежья
               if(close[bar]<=open[bar])
                 {
                  sPoint_i=count;
                  LowestBuffer[bar]=l;
                  for(i=bars2-fPoint_i; i>bar; i--)
                    {
                     HighestBuffer[i]=NULL;
                     LowestBuffer[i]=NULL;
                    }
                 }
               else
                 {
                  //---- если свеча бычья
                  draw_up=1;
                  draw_dn=0;
                  fPoint_i=sPoint_i;
                  sPoint_i=count;
                  HighestBuffer[bar]=h;
                  for(i=bars2-fPoint_i; i>bar; i--)
                    {
                     HighestBuffer[i]=NULL;
                     LowestBuffer[i]=NULL;
                    }
                 }
              }
            else
              {
               //---- если последний бар только новый максимум
               if(cur_h==1)
                 {
                  draw_up=1;
                  draw_dn=0;
                  fPoint_i=sPoint_i;
                  sPoint_i=count;
                  HighestBuffer[bar]=h;
                  l=low[bar];
                  for(i=bars2-fPoint_i; i>bar; i--)
                    {
                     HighestBuffer[i]=NULL;
                     LowestBuffer[i]=NULL;
                    }
                 }
               else
                 {
                  if(cur_l==1)
                    {
                     //---- если последний бар только новый минимум
                     sPoint_i=count;
                     LowestBuffer[bar]=l;
                     h=high[bar];
                     for(i=bars2-fPoint_i; i>bar; i--)
                       {
                        HighestBuffer[i]=NULL;
                        LowestBuffer[i]=NULL;
                       }
                    }
                 }
              }
           }
         else
           {
            //---- иначе если смены направления нет явно (счетчик Up свечей не равен GSv_range)
            //---- если достигнут новый минимум
            if(cur_l==1)
              {
               sPoint_i=count;
               LowestBuffer[bar]=l;
               for(i=bars2-fPoint_i; i>bar; i--)
                 {
                  HighestBuffer[i]=NULL;
                  LowestBuffer[i]=NULL;
                 }
               h=high[bar];
              }
           }
        }
      if(lb!=count)
         lb=count;
     }
//----
   return(rates_total);
  }

 
Maxim Kuznetsov #:

могут быть разные причины, но как правило - где-то есть мусор в индикаторном буфере. Внимательно проверьте код и/или "сжатый график" (нажать Ctrl-D и выискивать мышью где некорректные данные, обычно в крайних  частях самые левые и самые правые)

в коде явным образом должно быть прописано что если данных нет, то установлено значение EMPTY_VALUE

Я где то читал, если, в подвале с макд не совместимы некоторые индикаторы, то макд нужно перевести в  настройках в позицию: First Indicator Data. Правда, с чем это едят, я плохо представляю.

 
Игорь #:

ну конечно, у сигнального и макд катастрофически разные масштабы...сигнал - на уровне цены как она есть , а макд - разница средних то есть всего ничего несколько пунктов

 
Игорь #:

Вы присваиваете

HighestBuffer[bar]=h;

LowestBuffer[bar]=l;

Эти значения намного больше MACD!

Присвойте этим буферам текущее значение MACD

 
Tretyakov Rostyslav #:
текущее значение MACD

Вопрос. А это как? В сигнальном индюке у меня один параметр, а в макд у меня 3 параметра.

При этом значение одного индюка, только действуют в пределах одной функции. А глобально, если присвоение прописать, куча всякой фигни выйдет.

 
Игорь #:

Вопрос. А это как? В сигнальном индюке у меня один параметр, а в макд у меня 3 параметра.

Покажите код Вашего MACD

 
Tretyakov Rostyslav #:

Покажите код Вашего MACD

int OnCalculateOne(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[])
  {
   if(rates_total<InpSignalSMA)
      return(0);
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtFastMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtFastMaHandle is calculated (",calculated," bars). Error ",GetLastError());
      return(0);
     }
   calculated=BarsCalculated(ExtSlowMaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtSlowMaHandle is calculated (",calculated," bars). Error ",GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0)
      to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0)
         to_copy++;
     }
//--- get Fast EMA buffer
   if(IsStopped()) // checking for stop flag
      return(0);
   if(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
     {
      Print("Getting fast EMA is failed! Error ",GetLastError());
      return(0);
     }
//--- get SlowSMA buffer
   if(IsStopped()) // checking for stop flag
      return(0);
   if(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
     {
      Print("Getting slow SMA is failed! Error ",GetLastError());
      return(0);
     }
//---
   int start;
   if(prev_calculated==0)
      start=0;
   else
      start=prev_calculated-1;
//--- calculate MACD
   for(int i=start; i<rates_total && !IsStopped(); i++)
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
//--- calculate Signal
   SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }