Почему не работает советник с оператором "for"?

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

Подскажите, пожалуйста, кто знает, что не так в коде? 

void CheckForOpen()

  {

   double osma1=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,1);

   double osma2=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,2);

   double osma3=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,3);

   double Osmadown[], Osmaup[];

   int    res;

   

   for(int i=2; i<100; i++)

     {

      Osmadown[i]=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,i); //---все значения Osma от 2-го бара включительно, которые меньше 0.

      if(Osmadown[i]>0)                                //---как только Osma на каком-то баре поднимается выше 0, это значение не учитывается

      break;

      }

      

      

   for(int k=2; k<100; k++)

     {

     Osmaup[k]=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,k);    //---все значения Osma от 2-го бара включительно, которые больше 0.

     if(Osmaup[k]<0)                                   //---как только Osma на каком-то баре опускается ниже 0, это значение не учитывается

     break;

     }

    

//--- go trading only for first tiks of new bar

   if(Volume[0]>1) return;

//--- get Moving Average 

//--- sell conditions

   if(osma1<Osmadown[i])

     {

      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Ask+sl*Point,Bid-tp*Point,"",MAGICMA,0,Red);

      return;

     }

//--- buy conditions

   if(osma1>Osmaup[k])

   {

      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Bid-sl*Point,Ask+tp*Point,"",MAGICMA,0,Blue);

      return;

     }


Смысл такой, чтобы перед открытием сделки программа проверяла значения индикатора Osma на предыдущих барах. То есть, для продажи: osma[1] должен быть меньше значений индикатора на предыдущих барах вплоть до того бара, на котором индикатор >0. Для покупок - наоборот. Если в условиях сделки указывать osma с конкретным индексом, то все четко срабатывает, а как добавил этот оператор "for", так открывает все подряд без разбору.

В чем ошибка? При компиляции никаких ошибок MetaEditor не видит.

Буду благодарен за советы! Не судите строго новичка (

Ihor Herasko
21905
Ihor Herasko  

Массивы Osmadown и Osmaup объявлены, но память под них не распределена. Их размер как был нулевым, так и остался. Соответственно, любое обращение к этим массивам вызывает ошибку выхода за пределы массива (см. вкладку "Эксперты" окна терминал после запуска эксперта в онлайн).

P. S. Чтобы вставить код, используйте пиктограмму "</>" или Alt+S.

scorp99999
14
scorp99999  
void CheckForOpen()
  {
   double osma1=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,1);
   double osma2=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,2);
   double osma3=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,3);
   double Osmadown[], Osmaup[];
   int    res;
   
   for(int i=2; i<100; i++)
     {
      Osmadown[i]=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,i); //---все значения Osma от 2-го бара включительно, которые меньше 0.
      if(Osmadown[i]>0)                                //---как только Osma на каком-то баре поднимается выше 0, это значение не учитывается
      break;
      }
      
      
   for(int k=2; k<100; k++)
     {
     Osmaup[k]=iOsMA(NULL,0,12,26,9,PRICE_CLOSE,k);    //---все значения Osma от 2-го бара включительно, которые больше 0.
     if(Osmaup[k]<0)                                   //---как только Osma на каком-то баре опускается ниже 0, это значение не учитывается
     break;
     }
    
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- get Moving Average 
//--- sell conditions
   if(osma1<Osmadown[i])
     {
      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Ask+sl*Point,Bid-tp*Point,"",MAGICMA,0,Red);
      return;
     }
//--- buy conditions
   if(osma1>Osmaup[k])
   {
      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Bid-sl*Point,Ask+tp*Point,"",MAGICMA,0,Blue);
      return;
     }
//---
  }
scorp99999
14
scorp99999  
Ihor Herasko:

Массивы Osmadown и Osmaup объявлены, но память под них не распределена. Их размер как был нулевым, так и остался. Соответственно, любое обращение к этим массивам вызывает ошибку выхода за пределы массива (см. вкладку "Эксперты" окна терминал после запуска эксперта в онлайн).

P. S. Чтобы вставить код, используйте пиктограмму "</>" или Alt+S.

как же под них распределить память? 
Konstantin Nikitin
9318
Konstantin Nikitin  
   double Osmadown[100], Osmaup[100];
Или ArrayResize
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий