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

 
PolarSeaman:

Таких циклов 3. Заменил их, терминал завис.

Я насчитал четыре:

   int i;

   SetIndexDrawBegin(0,Bars-cb);
   SetIndexDrawBegin(1,Bars-cb);

   double avg;

   ki=2.0/(p+1);

   int total;
   int limit = GetRecalcIndex(total,rates_total,prev_calculated);

   for(i=limit; i>=0; i--) 
      fx1[i]=Close[i];

   for(int m=0; m<=s; m++)
     {
      z1=fx1[0];
      for(i=0; i<=limit; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

      z2=fx1[limit];
      for(i=limit; i>=0; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/2;}
     }

   fs=0;
   for(i=limit; i>=0; i--)
     {
      if(fx1[i]>fx1[i+1]) fs=1;
      if(fx1[i]<fx1[i+1]) {if(fs==1) fx2[i+1]=fx1[i+1]; fs=2;}
      if(fs==2) fx2[i]=fx1[i]; else fx2[i]=0.0;

      avg=iATR(NULL,0,ATR,i+10);
      upper[i] = hp[i] + distance*avg;
      lower[i] = hp[i] - distance*avg;

      if(Close[i+1+barsig]<upper[i+1+barsig] && Close[i+barsig]>upper[i+barsig])
         dnar[i]=High[i]+arrots*Point; else dnar[i]=EMPTY_VALUE;

      if(Close[i+1+barsig]>lower[i+1+barsig] && Close[i+barsig]<lower[i+barsig])
         upar[i]=Low[i]-arrots*Point; else upar[i]=EMPTY_VALUE;
     }

Ничего не виснет. Выходов за пределы массивов быть не должно. Только вот значение на нулевом баре, по-моему, неправильно рассчитывается. 

 
Ihor Herasko:

Я насчитал четыре:

Ничего не виснет. Выходов за пределы массивов быть не должно. Только вот значение на нулевом баре, по-моему, неправильно рассчитывается. 

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

sell_1_B=NormalizeDouble(iCustom(Symbol(),0,"HiLo",1,1),Digits);
sell_1_1_B=NormalizeDouble(iCustom(Symbol(),0,"HiLo",1,2),Digits);

if(sell_1_1_B==0.0&&sell_1_B!=0.0)
{открываю sell}
if(sell_1_1_B!=0.0&&sell_1_B==0.0)
{открываю buy}

почему?

 
Ihor Herasko:

В тестере, на визуализации вот что

оопп

первый излом, начало теста, тот индикатор, который с ошибкой, строит ровную линию, когда бросаю его на график после начала теста

чёта мы сломали)

 

Подскажите, как на кнопку в эксперте поставить "выбор" графического инструмента, так чтобы нажав на кнопку  под курсором появлялся значок инструмента и его можно было бы натягивать?

Причем чтобы он уже с заданными свойствами был

 
PolarSeaman:

В тестере, на визуализации вот что

первый излом, начало теста, тот индикатор, который с ошибкой, строит ровную линию, когда бросаю его на график после начала теста

чёта мы сломали)

Ну да. Это ведь перерисовывающийся индикатор, который на каждом тике заново пересчитывает всю историю за указанное количество баров. Очень плохое решение. Тогда нужно делать так:

   int i;

   SetIndexDrawBegin(0,Bars-cb);
   SetIndexDrawBegin(1,Bars-cb);

   double avg;

   ki=2.0/(p+1);

   int total;
   int limit = GetRecalcIndex(total,rates_total,prev_calculated);

   for(i=total; i>=0; i--) 
      fx1[i]=Close[i];

   for(int m=0; m<=s; m++)
     {
      z1=fx1[0];
      for(i=0; i<=total; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

      z2=fx1[total];
      for(i=total; i>=0; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/2;}
     }

   fs=0;
   for(i=total; i>=0; i--)
     {
      if(fx1[i]>fx1[i+1]) fs=1;
      if(fx1[i]<fx1[i+1]) {if(fs==1) fx2[i+1]=fx1[i+1]; fs=2;}
      if(fs==2) fx2[i]=fx1[i]; else fx2[i]=0.0;

      avg=iATR(NULL,0,ATR,i+10);
      upper[i] = hp[i] + distance*avg;
      lower[i] = hp[i] - distance*avg;

      if(Close[i+1+barsig]<upper[i+1+barsig] && Close[i+barsig]>upper[i+barsig])
         dnar[i]=High[i]+arrots*Point; else dnar[i]=EMPTY_VALUE;

      if(Close[i+1+barsig]>lower[i+1+barsig] && Close[i+barsig]<lower[i+barsig])
         upar[i]=Low[i]-arrots*Point; else upar[i]=EMPTY_VALUE;
     }

Некрасиво, конечно, но работает.

 
почему такая конструкция не работает в объявлении переменных?
int K=20;
int TIKET[K];
 
igrok333:
почему такая конструкция не работает в объявлении переменных?

Потому что K - переменная. Ее значение на момент компиляции неизвестно. Чтобы получилось, нужно сделать К константой:

#define K 20
int TIKET[K];
 
Ihor Herasko:

Ну да. Это ведь перерисовывающийся индикатор, который на каждом тике заново пересчитывает всю историю за указанное количество баров. Очень плохое решение. Тогда нужно делать так:

Некрасиво, конечно, но работает.

Спасибо. Столько мы с вами времени потратили, а он, сцуко, рисует 20(!) баров, может и больше, дальше смотреть не стал.

Создадим петицию?

Запретить, законодательно, распространение индикаторов перерисовывающих больше трёх баров! 

Для рассмотрения парламентом, нужно собрать за год, всего 100к подписей.

 
PolarSeaman:

Спасибо. Столько мы с вами времени потратили, а он, сцуко, рисует 20(!) баров, может и больше, дальше смотреть не стал.

Ставьте меньшее значение cb, будет меньше  перерисовывающихся баров.

Создадим петицию?

Запретить, законодательно, распространение индикаторов перерисовывающих больше трёх баров! 

Для рассмотрения парламентом, нужно собрать за год, всего 100к подписей.

)))

 

Подскажите пожалуйста, как исключить/добавить в советник конкретную дату?

Например, не торговать 2 марта 2018. Разные варианты пробовал, запутался с датами.

TimeDayOfYear (TimeCurrent()) != StrToTime("2018.03.02")
Причина обращения: