проблема с циклом

 

 Голову сломал. Может я чего то не знаю?  Есть такие функции. Одна получает данные из другой. Первая находит индекс бара с помощью цикла вторая пытается получить индекс бара следующего сигнала на истории при помощи первого индекса.

 Первая функция Возвращает значение бара по первому найденному сигналу, а вот вторая возвращает значение первого бара после текущего [0]. По всей видимости принимает полученный индекс первого сигнала за нулевое значение, хотя если подставить вместо значения переменной целое число, все работает. Переменные объявлены в самом верху кода.

//+------------------------------------------------------------------+
//| IndexSELL                                                        |
//+------------------------------------------------------------------+
int IndexSELL()
  {
   int     copy_sell=0;
   int     copy_sell1=0;
   double  macd_current;
   double  macd_previous;
   double  signal_current;
   double  signal_previous;
   double  buff_MACD_main[];           // MACD for indicator main buffer
   double  buff_MACD_signal[];         // MACD for indicator signal buffer
   ArraySetAsSeries(buff_MACD_main,true);
   ArraySetAsSeries(buff_MACD_signal,true);
   bars=BarsCalculated(handle_macd);
   if(bars<=0)
   return(0);  
   copy_sell=CopyBuffer(handle_macd,0,0,bars,buff_MACD_main);       
   copy_sell1=CopyBuffer(handle_macd,1,0,bars,buff_MACD_signal);
   if(copy_sell<=0 || copy_sell1<=0)
     {
      Print("Error  copying of data ", GetLastError());
     }
   else
   for(int i=1;i<bars-1;i++)
     {
   macd_current    =buff_MACD_main[i];
   macd_previous   =buff_MACD_main[i+1];
   signal_current  =buff_MACD_signal[i];
   signal_previous =buff_MACD_signal[i+1];  
      if(macd_current>0)
      if(macd_current<signal_current && macd_previous>signal_previous)  break;
    if(index_sell!=i)  index_sell=i;         
      }            
        return(index_sell);
        }      

//+------------------------------------------------------------------+
//| IndexSELL2                                                       |
//+------------------------------------------------------------------+
int IndexSELL2()
  {
   int     copy_sell=0;
   int     copy_sell1=0;
   double  macd_current;
   double  macd_previous;
   double  signal_current;
   double  signal_previous;
   double  buff_MACD_main[];           // MACD for indicator main buffer
   double  buff_MACD_signal[];         // MACD for indicator signal buffer
   ArraySetAsSeries(buff_MACD_main,true);
   ArraySetAsSeries(buff_MACD_signal,true);
   bars=BarsCalculated(handle_macd);
   if(bars<=0)
   return(0);  
   copy_sell=CopyBuffer(handle_macd,0,0,bars,buff_MACD_main);        
   copy_sell1=CopyBuffer(handle_macd,1,0,bars,buff_MACD_signal);
   if(copy_sell<=0 || copy_sell1<=0)
   {
      Print("Error  copying of data ", GetLastError());
     }
   else
   for(int i=index_sell+1;i<bars-1;i++)
     {
   macd_current    =buff_MACD_main[i];
   macd_previous   =buff_MACD_main[i+1];
   signal_current  =buff_MACD_signal[i];
   signal_previous =buff_MACD_signal[i+1];  
      if(macd_current>0)
      if(macd_current<signal_current && macd_previous>signal_previous)  break;
    if(index_sell2!=i)  index_sell2=i;         
      }             
        return(index_sell2);
        }   


Что можно сделать? Джентльмены?

 
А где вызов функций? Может, порядок напутан? "for(int i=index_sell+1;i<bars;i++)" - это вызов переменной, а не функции.
 
Vitaly Stepanov:

 Голову сломал. Может я чего то не знаю?  Есть такие функции. Одна получает данные из другой. Первая находит индекс бара с помощью цикла вторая пытается получить индекс бара следующего сигнала на истории при помощи первого индекса.

 Первая функция Возвращает значение бара по первому найденному сигналу, а вот вторая возвращает значение первого бара после текущего [0]. По всей видимости принимает полученный индекс первого сигнала за нулевое значение, хотя если подставить вместо значения переменной целое число, все работает. Переменные объявлены в самом верху кода.


Что можно сделать? Джентльмены?

Сами функции вызываются в OnTick() при наступлении условий. Первая функция возвращает значение, с ней проблем нет, я получаю цену по этому индексу.

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

 
Vitaly Stepanov:

Сами функции вызываются в OnTick() при наступлении условий. Первая функция возвращает значение, с ней проблем нет, я получаю цену по этому индексу.

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

Ну и не жадничайте. Скиньте кусочек кода в начале, где они вызываются, и в OnTick().

 
Vitaly Stepanov:

Сами функции вызываются в OnTick() при наступлении условий. Первая функция возвращает значение, с ней проблем нет, я получаю цену по этому индексу.

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

Тут вопрос был в другом. В приведенном кусе кода не видно где идет присвоение значения переменной index_sell. Как и с некоторыми другими переменными, не видно их инициации и т.д..

 
Konstantin Nikitin:

Тут вопрос был в другом. В приведенном кусе кода не видно где идет присвоение значения переменной index_sell. Как и с некоторыми другими переменными, не видно их инициации и т.д..

Вместо переменной можно вставить саму первую функцию IndexSELL(), которая возвращает значение, результат тот же.

А переменные объявлены в самом верху советника, после входных параметров.

int    handle_stoch_M1=0;
int    handle_stoch=0;
int    handle_stoch_cl=0;
int    handle_macd_cl=0;
int    handle_macd=0;
int    handle_atr=0;
int    handle_atr2=0;
int    handle_maLOW=0;
int    handle_ma=0;
int    index_sell=0;
int    index_buy=0;
int    index_sell2=0;
int    index_buy2=0;
и тд



bool OpenSELL()
  {
   bool    res=false;
   double  macd_current;
   double  macd_previous;
   double  signal_current;
   double  signal_previous;
   double  buff_MACD_main[];           // MACD for indicator main buffer
   double  buff_MACD_signal[];         // MACD for indicator signal buffer
   ArraySetAsSeries(buff_MACD_main,true);
   ArraySetAsSeries(buff_MACD_signal,true);
   if(BarsCalculated(handle_macd)<2)
      return(false);
   if(CopyBuffer(handle_macd,0,0,2,buff_MACD_main)          !=2 ||
      CopyBuffer(handle_macd,1,0,2,buff_MACD_signal)        !=2)
     {
      Print("CopyBuffer failed, no data");
      return(false);
     } 
   macd_current    =buff_MACD_main[0];
   macd_previous   =buff_MACD_main[1];
   signal_current  =buff_MACD_signal[0];
   signal_previous =buff_MACD_signal[1]; 
      if(macd_current>0 && macd_current<signal_current && macd_previous>signal_previous)
       res=true;
              
        return(res);
        }
void OnTick(void)
  {
   if(OpenSELL()==true)
   {
      bars=BarsCalculated(handle_macd);
   if(bars<=0)
   return;
     {
      LevelSELL();
      LevelSELL2();
 

Поставьте между 

LevelSELL и LevelSELL2     Print(index_sell);

Будет видно, что происходит с переменной.

 
Sergey Savinkin:

Поставьте между 

LevelSELL и LevelSELL2     Print(index_sell);

Будет видно, что происходит с переменной.

Первая ф-я возвращает значение, вторая 0.

У меня через Comment значения выводятся на график. Стабильный "0".
 
Vitaly Stepanov:

Первая ф-я возвращает значение, вторая 0.

У меня через Comment значения выводятся на график. Стабильный "0".

Сложно без отладчика. Но, похоже, единственное место, где возможен возврат ноля - это

if(macd_current>0)
      if(macd_current<signal_current && macd_previous>signal_previous)  break;

Цикл прерывается на первом проходе, не успев присвоить значение переменной.

 
Sergey Savinkin:

Сложно без отладчика. Но, похоже, единственное место, где возможен возврат ноля - это

Цикл прерывается на первом проходе, не успев присвоить значение переменной.

Попробовал инициировать index_sell2 единицей, возвращает 1. Просто не присваивает новое значение.

 
Ну а  я Вам про что? Не доходит цикл до этого места. В первой функции Вы начинаете с 1, доходите до нужного места в массиве и прерываете цикл. А во второй - сразу начинаете с "правильного" места. И цикл прерывается.
Причина обращения: