Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Продавай свои разработки в Маркете. Это безопасно!
Sergey Vedmanov
2028
Sergey Vedmanov 2014.03.28 07:24 

Доброго времени суток. Не совсем по теме здесь речь пойдет о 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));

 }


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


Vladimir Karputov
Модератор
46052
Vladimir Karputov 2014.03.28 11:17  
SWitch:

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

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

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

Вам, что чернил не жалко? (Зачем вставлять после каждой строки кода пустую строку?)
Vladimir Karputov
Модератор
46052
Vladimir Karputov 2014.03.28 11:24  

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

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

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

void fractal(double &arUp[],double &arDown[],int index,int bars,double &hFractal,double &lFractal)
argrig777
5
argrig777 2014.03.28 14:18  

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

Ilnur Khasanov
1822
Ilnur Khasanov 2014.03.28 16:01  

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

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

Automated-Trading
Админ
99862
Automated-Trading 2014.03.31 09:56  
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: примеры использования экспертов, тестирования и оптимизации
Sergey Vedmanov
2028
Sergey Vedmanov 2014.04.01 06:49  
Automated-Trading:

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

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

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

Mikhail Vdovin
1222
Mikhail Vdovin 2014.04.01 10:07  
SWitch:

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

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

Так и скачайте прикрепленный файл...
Sergey Vedmanov
2028
Sergey Vedmanov 2014.04.01 10:14  
micle:
Так и скачайте прикрепленный файл...
Нужно больше файлов ))))
Sergey Vedmanov
2028
Sergey Vedmanov 2014.04.02 20:10  

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

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

Mikhail Vdovin
1222
Mikhail Vdovin 2014.04.02 20:18  
SWitch:

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

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

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


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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий