Исправление индикатора под новый билд

 

Доброго времени суток. Не совсем по теме здесь речь пойдет о 4-ом мукуле.

Столкнулся с нежеланием платформы использовать старый добрый индикатор после компиляции, хотя до компиляции исправно работал.

Вот собственно и сам код.

//+------------------------------------------------------------------+

//|                               AlligatorBollingerBandsFraktal.mq4 |

//|                                                 Mojo_Head © 2012 |

//|                                                   mojohead@bk.ru |

//+------------------------------------------------------------------+

#property copyright "Mojo_Head © 2012"

#property link      "mojohead@bk.ru"

#property indicator_chart_window

#property indicator_buffers 8

#property indicator_color1 Blue

#property indicator_color2 Red

#property indicator_color3 Lime

#property indicator_color4 Gold

#property indicator_color5 Black//C'250,250,250'

#property indicator_color6 Gold

#property indicator_color7 Peru

#property indicator_color8 MediumOrchid

#property indicator_width7 1

#property indicator_width8 1


/* 

Metod


MODE_SMA 0 Простое скользящее среднее 

MODE_EMA 1 Экспоненциальное скользящее среднее 

MODE_SMMA 2 Сглаженное скользящее среднее 

MODE_LWMA 3 Линейно-взвешенное скользящее среднее 


Price


PRICE_CLOSE 0 Цена закрытия 

PRICE_OPEN 1 Цена открытия 

PRICE_HIGH 2 Максимальная цена 

PRICE_LOW 3 Минимальная цена 

PRICE_MEDIAN 4 Средняя цена, (high+low)/2 

PRICE_TYPICAL 5 Типичная цена, (high+low+close)/3 

PRICE_WEIGHTED 6 Взвешенная цена закрытия, (high+low+close+close)/4 

*/

//---- input parameters

extern int JawsPeriod=13;

extern int JawsShift=8;

extern int TeethPeriod=8;

extern int TeethShift=5;

extern int LipsPeriod=5;

extern int LipsShift=3;

extern int bbPeriod=20;

extern int Metod=0;

extern int Price=0;

extern int  bbShift=0;

extern double  bbDev=2.0;

extern int fBars = 2;

int AveragePeriod=5;

//---- indicator buffers

double allblue[];

double allred[];

double allgren[];

double hbb[];

double mbb[];

double lbb[];

double frup[];

double frdn[];

//+------------------------------------------------------------------+

//| Custom indicator initialization function                         |

//+------------------------------------------------------------------+

int init()

  {

   SetIndexBuffer(0,allblue);

   SetIndexBuffer(1,allred);

   SetIndexBuffer(2,allgren);

   SetIndexBuffer(3,hbb);

   SetIndexBuffer(4,mbb);

   SetIndexBuffer(5,lbb);

   SetIndexBuffer(6,frup);

   SetIndexBuffer(7,frdn);

   //---- drawing settings

   SetIndexStyle(0,DRAW_LINE);

   SetIndexStyle(1,DRAW_LINE);

   SetIndexStyle(2,DRAW_LINE);

   SetIndexStyle(3,DRAW_LINE);

   SetIndexStyle(4,DRAW_LINE);

   SetIndexStyle(5,DRAW_LINE);

   SetIndexStyle(6,DRAW_ARROW);

   SetIndexStyle(7,DRAW_ARROW);

   SetIndexLabel(0, "All jaws");    

   SetIndexLabel(1, "All teeth"); 

   SetIndexLabel(2, "All lips");    

   SetIndexLabel(3, "BB upp (" + bbPeriod + ")"); 

   SetIndexLabel(4, "BB med (" + bbPeriod + ")");    

   SetIndexLabel(5, "BB dwn (" + bbPeriod + ")"); 

   SetIndexLabel(6, "Fr upp (" + fBars + ")");    

   SetIndexLabel(7, "Fr dwn (" + fBars + ")"); 

   SetIndexArrow(6,217);

   SetIndexEmptyValue(6,0.0);

   SetIndexArrow(7,218);

   SetIndexEmptyValue(7,0.0);

    

   return(0);

  }

//+------------------------------------------------------------------+

int deinit() { return(0);  }

//+------------------------------------------------------------------+

int start()

  {

   double  hFractal = 0, lFractal = 0,  hBand = 0, mBand = 0, lBand = 0;

   int limit; int counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1);

   if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; for(int i=0; i<limit; i++)

     {

      allblue[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);

      allred[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);

      allgren[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);

      ////////* расчет линий болинджера */

bband(bbPeriod, bbShift, bbDev, i, hBand, mBand, lBand); 

hbb[i] = hBand; mbb[i] = mBand; lbb[i] = lBand;

///////* расчет фракталов */

fractal(High, Low, i, fBars, hFractal, lFractal);

if (hFractal > 0) frup[i+fBars+1] = hFractal;

if (lFractal > 0) frdn[i+fBars+1] = lFractal;

 }

//---- done

   return(0);

  }

//+------------------------------------------------------------------+

// --->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>

void bband(int bbPeriod, int bbShift, double bbDev, int index, double& hBand, double& mBand, double& lBand)

    {

double sum = 0, ave = 0, sko = 0;

int j = 0;

mBand = iMA(NULL,0,bbPeriod,bbShift,Metod,Price,index);

sum = 0;

for (j = 0; j < bbPeriod; j++) sum += Close[index+j]; ave = sum / bbPeriod;

sum = 0;

for (j = 0; j < bbPeriod; j++) sum += (Close[index+j] - ave) * (Close[index+j] - ave);sko = MathSqrt(sum / bbPeriod);

hBand = mBand + bbDev * sko;lBand = mBand - bbDev * sko; 

    }


// --->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>

// --->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>

void fractal(double arUp[], double arDown[], int index, int bars, double& hFractal, double& lFractal)

 {

int pos = 0, i = 0;

hFractal = 0; lFractal = 0;

pos = index + bars + 1; 

/* фрактал верх */

for(i = 1; i <= bars; i++)

if(N(arUp[pos] - arUp[pos - i]) <= 0) { break; } /* правая сторона */

if(N(arUp[pos] - arUp[pos + i]) <= 0) { break; } /* левая сторона */

}

/* запоминаем значение на баре, где верхний фрактал */

if (i == bars + 1) hFractal = arUp[pos];

/* фрактал низ */

for(i = 1; i <= bars; i++)

if(N(arDown[pos] - arDown[pos - i]) >= 0) { break; } /* правая сторона */

if(N(arDown[pos] - arDown[pos + i]) >= 0) { break; } /* левая сторона */

}

 

/* запоминаем значение на баре, где нижний фрактал */ 

if (i == bars + 1) lFractal = arDown[pos];


}


// --->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>

double N(double source, string symb="0")

 {

int digits = Digits;

   if (symb == "0") 

   {

      digits = MarketInfo(Symbol(), MODE_DIGITS);

   } 

return(NormalizeDouble(source,digits));

 }


// --->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>--->>


 
SWitch:

Доброго времени суток. Не совсем по теме здесь речь пойдет о 4-ом мукуле.

Столкнулся с нежеланием платформы использовать старый добрый индикатор после компиляции, хотя до компиляции исправно работал.

Вот собственно и сам код.

Вам, что чернил не жалко? (Зачем вставлять после каждой строки кода пустую строку?)
 

Обратите внимание на сообщения компилятора об ошибках (если не понятно то воспользуйтесь переводчиком).

Например сообщение об ошибке: ...arrays are passed by reference only, означает, что массивы должны передаваться только по ссылке.

Правильный вариант функции fractal:

void fractal(double &arUp[],double &arDown[],int index,int bars,double &hFractal,double &lFractal)
 

Привет всем. я тоже сталкивался с такой проблемой на мт4 , после обновления некоторые индюки не работали. Я случайно нашел стары мт4 без апдейта и сохранил , могу скинуть если че .

 

Гы, я тоже такое встретил, например, recycle с базы кодов mql4 нормально компилируется в старых билдах, а в новых уже появляются запятые лишние внутри оператора for.

Устранить то проще репки, но так не очень хорошо... Доведите до сервисдеска

 
SWitch:

Доброго времени суток. Не совсем по теме здесь речь пойдет о 4-ом мукуле.

Столкнулся с нежеланием платформы использовать старый добрый индикатор после компиляции, хотя до компиляции исправно работал.

Вот собственно и сам код.

Функцию start нужно скорректировать следующим образом (чтобы избежать ошибок компиляции и выполнения, см. 1.5 и 2.1):

int start()
  {
//--- массив для хранения значений цен High/Low
   double HighPrices[],LowPrices[];
   double  hFractal=0,lFractal=0,hBand=0,mBand=0,lBand=0;
   int limit;
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   //--- если counted_bars=0, то число limit нужно уменьшить на 1+макс. индекс переменной цикла
   if(counted_bars==0) limit-=1+MathMax(bbPeriod,fBars+1);
   for(int i=0; i<limit; i++)
     {
      allblue[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
      allred[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
      allgren[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
      ////////* расчет линий болинджера */
      bband(bbPeriod,bbShift,bbDev,i,hBand,mBand,lBand);
      hbb[i]=hBand; mbb[i]=mBand; lbb[i]=lBand;
      //--- копируем значения цен в массивы
      ArrayCopy(HighPrices,High,0,0,WHOLE_ARRAY);
      ArrayCopy(LowPrices,Low,0,0,WHOLE_ARRAY);
      ///////* расчет фракталов */
      fractal(HighPrices,LowPrices,i,fBars,hFractal,lFractal);
      if(hFractal > 0) frup[i+fBars+1] = hFractal;
      if(lFractal > 0) frdn[i+fBars+1] = lFractal;
     }
//---- done
   return(0);
  }
Типичные ошибки в программах на MQL4 и методы их устранения - Статьи по MQL4
  • www.mql5.com
Типичные ошибки в программах на MQL4 и методы их устранения - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
 
Automated-Trading:

Функцию start нужно скорректировать следующим образом (чтобы избежать ошибок компиляции и выполнения, см. 1.5 и 2.1):

Благодарю за разъяснение. 

С удовольствием посмотрел бы на советник и индикатор реализованный в новом коде. С моим опытом программирования это просто необходимо. 

 
SWitch:

Благодарю за разъяснение. 

С удовольствием посмотрел бы на советник и индикатор реализованный в новом коде. С моим опытом программирования это просто необходимо. 

Так и скачайте прикрепленный файл...
 
micle:
Так и скачайте прикрепленный файл...
Нужно больше файлов ))))
 

Что изменилось в четверке с графическим управлением?

И как теперь поменять wile на for , подсмотрел в Haken Ashi но так и не понял сути. Хотелось бы разъяснений.

 
SWitch:

Что изменилось в четверке с графическим управлением?

И как теперь поменять wile на for , подсмотрел в Haken Ashi но так и не понял сути. Хотелось бы разъяснений.

wile нужно заменить на while...


зы. оно работало в четвёрке? )))

Причина обращения: