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

 
Artyom Trishkin:
Это не очень хорошо. У вас наверное при компиляции предупреждения были? Нужно в таких случаях избавляться от причин предупреждений, а не от #property strict
Когда было прописано #property strict, то компилятор выдавал ошибки в каждом цикле for(), что переменные должны иметь тип, и поэтому в каждом цикле приходилось прописывать int i и int p. После этого компилятор ошибок не выдавал, но линия не строилась. Когда убрал #property strict, то компилятор уже не требовал объявлять тип в каждом цикле, и линия построилась.
 

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

 
Timur1988:
Когда было прописано #property strict, то компилятор выдавал ошибки в каждом цикле for(), что переменные должны иметь тип, и поэтому в каждом цикле приходилось прописывать int i и int p. После этого компилятор ошибок не выдавал, но линия не строилась. Когда убрал #property strict, то компилятор уже не требовал объявлять тип в каждом цикле, и линия построилась.

Типичный случай эксплуатации неявных ошибок в логике. После того, как компилятор стал "строже", самообман исчезает потихоньку.

Всё хотел спросить, зачем там столько одинаковых циклов?

И почему вас никак не напрягает ошибка "выход за пределы массива" при запуске индикатора на графике?

Например, вот тут:

    for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {  
         sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
         }        
      }


 

 
7u6y5t4r3e2w1q:

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

Терминал тот же, нужно просто перелогиниться на реальный счёт. Как это делается: Файл - Подключиться к торговому счёту - указать в открывшемся окошке номер счёта, пароль и сервер. Все эти данные выдал ДЦ, в случае чего спрашивайте их.
 
Timur1988:
Когда было прописано #property strict, то компилятор выдавал ошибки в каждом цикле for(), что переменные должны иметь тип, и поэтому в каждом цикле приходилось прописывать int i и int p. После этого компилятор ошибок не выдавал, но линия не строилась. Когда убрал #property strict, то компилятор уже не требовал объявлять тип в каждом цикле, и линия построилась.

ответ предельно простой -- у вас идёт банальный выход за пределы массива -- и по этой ошибке ваш индикатор прекращает свою работу

    for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {  
         sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
        
         }        
      }
  
   for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {      
         Mx[i][p]=sum_x[p+1][m-1]/(n-1);  
         My[i][p]=sum_y[p+1][m-1]/(n-1);

увидеть эту ошибку можно на этапе выполнения -- запустить индикатор и посмотреть запись лога на вкладке Терминал -- Эксперты:

 

 
Vitalie Postolache:

Типичный случай эксплуатации неявных ошибок в логике. ...

Выход за пределы массива -- это грубая ошибка в логике -- и "неявной" такую ошибку назвать никак нельзя.
 
Vitalie Postolache:

Типичный случай эксплуатации неявных ошибок в логике. После того, как компилятор стал "строже", самообман исчезает потихоньку.

Всё хотел спросить, зачем там столько одинаковых циклов?

И почему вас никак не напрягает ошибка "выход за пределы массива" при запуске индикатора на графике?

Например, вот тут:

    for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {  
         sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
         }        
      }


 

А как тогда посчитать сумму цен закрытия в каждом измерении??? 
По поводу одинаковых циклов, то я, из-за ограниченного знания программирования и алгоритмов, ничего лучше не придумал, чтобы выбирать тот элемент массива из нужного измерения, который был необходим для подстановки в формулу.
 
Andrey F. Zelinsky:

ответ предельно простой -- у вас идёт банальный выход за пределы массива -- и по этой ошибке ваш индикатор прекращает свою работу

    for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {  
         sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
        
         }        
      }
  
   for(int i=1; i<n; i++)
      {    
      for(int p=0; p<m; p++)
         {      
         Mx[i][p]=sum_x[p+1][m-1]/(n-1);  
         My[i][p]=sum_y[p+1][m-1]/(n-1);

увидеть эту ошибку можно на этапе выполнения -- запустить индикатор и посмотреть запись лога на вкладке Терминал -- Эксперты:

 

Скажите, плиз, как исправить эту ошибку?
 
Timur1988:
А как тогда посчитать сумму цен закрытия в каждом измерении??? 
По поводу одинаковых циклов, то я, из-за ограниченного знания программирования и алгоритмов, ничего лучше не придумал, чтобы выбирать тот элемент массива из нужного измерения, который был необходим для подстановки в формулу.

Например так:

     for(int i=1; i<n; i++)

      {    
      for(int p=1; p<m; p++)
         {   
         sum_x[i][p]=sum_x[i][p-1]+Price_CloseX[i][p];                                        
         sum_y[i][p]=sum_y[i][p-1]+Price_CloseY[i][p];
         }         
      }
 
Timur1988:
Скажите, плиз, как исправить эту ошибку?

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

И только тогда получится перебрать ваш алгоритм и устранить выход за пределы массива

Методом "тыка" и непониманием формулы -- вы устраните ошибку, но сделаете неправильным расчёт.

p.s. Распишите словами подробно что и зачем вы считаете -- можете подробно прокомментировать свой код -- и тогда поймём как надо исправить эту ошибку.

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