Вопрос по iFractals в while

 
Почему этот код зацикливает советник ? Может я где ошибся ? Идет поиск значения последнего фрактала верх/низ(по mode).

double GetPriceLastFractal(string symbol, int timeframe, int mode, int shift)
{
double currprice;

while(currprice == 0)
{

currprice = iFractals (symbol, timeframe, mode, shift);


shift++;
}

return(currprice);
}
 
Ты изменяешь параметр функции shift. Не нравится мне это. Введи другую переменную внутри цикла. И вообще - какой смысл у тебя играет этот параметр в функции? По логике, он при ее вызове всегда должен быть равным нулю, чтобы найти последний фрактал. И зачем его тогда в параметры вводить, если это константа? Короче, попробуй так:

double GetPriceLastFractal(string symbol, int timeframe, int mode)
{
 double currprice;
 int shift = 0;
 
while(currprice == 0)
  {
     
  currprice =  iFractals (symbol, timeframe, mode, shift);
 
     
  shift++;
 }
 
 return(currprice);
}
 
Mathemat писал (а):
Ты изменяешь параметр функции shift. Не нравится мне это. Введи другую переменную внутри цикла. И вообще - какой смысл у тебя играет этот параметр в функции? По логике, он при ее вызове всегда должен быть равным нулю, чтобы найти последний фрактал. И зачем его тогда в параметры вводить, если это константа? Короче, попробуй так:

double GetPriceLastFractal(string symbol, int timeframe, int mode)
{
 double currprice;
 int shift = 0;
 
while(currprice == 0)
  {
     
  currprice =  iFractals (symbol, timeframe, mode, shift);
 
     
  shift++;
 }
 
 return(currprice);
}
Пробывал и так все равно зацикливает. Может это и не зацикливание, но тогда что? Тестирую на истории именно этот участок кода, после запуска все подвисает пока Стоп не нажмёш.
 
Во-первых, Сравнение вещественных чисел
А во-вторых, Поиск ближайшего фрактала
В общем, поиск рулит =)
 

Да, komposter, вот только рулит-то опыт...

 
while(currprice == 0)
У тебя currprice - double. Поэтому нужно например:

while(NormalizeDouble(currprice, Digits) == 0)
 
Написал ответ, но из-за непонятного глюка форума он не появился (кстати, заметил, что такие глюки бывают в момент, когда два человека оодновременно размещают свой пост в одной ветке - мне не повезло :))

Но так как никто не дал до сих пор совета, то я повторю тот пост. Всегда в таких случаях (даже если уверен, что поиск увенчается успехом) нужно ставить ограничитель поиска :

double GetPriceLastFractal(string symbol, int timeframe, int mode, int shift)
{
 double currprice;
 
int limit=shift+1000;
while(currprice == 0 && shift<limit)
  {
     
  currprice =  iFractals (symbol, timeframe, mode, shift);
 
     
  shift++;
 }
 
 if (shift>=limit) Print("Ну не шмогла я, не шмогла");
 return(currprice);
}


Мой маленький опыт говорит, что без ограничителя мы будем завешивать комп в 2 случаях из трех :)
 
DonTabak:
Почему этот код зацикливает советник ? Может я где ошибся ? Идет поиск значения последнего фрактала верх/низ(по mode).






//+---------------------------------------------------------------------+
//| GetPriceLastFractal(string symbol, int timeframe, int mode) function|                                                |
//+---------------------------------------------------------------------+
double GetPriceLastFractal(string symbol, int timeframe, int mode)
   { 
     double currprice =  iFractals (symbol, timeframe, mode, 0);        
     return(currprice);
   }
//+------------------------------------------------------------------+
Чтобы найти последний верхний(нижний) фрактал, цикл вообще не нужен:
Другое дело, что он может оказаться как выше(ниже) текущей цены, так и наоборот. Если надо первый фрактал, кот. будет выше(ниже) Close[0],
тогда действительно придётся организовывать цикл с переменным начальным баром для поиска фрактала.
 
komposter писал (а):
Во-первых, Сравнение вещественных чисел
А во-вторых, Поиск ближайшего фрактала
В общем, поиск рулит =)

int isFractalUp()
{
for(int i=0; i != 10; i++)
{
if(iFractals(NULL, 0, MODE_UPPER, i)!= NULL) return(i);
}
return(-1);
}

int isFractalDn()
{
for(int i=0; i != 10; i++)
{
if(iFractals(NULL, 0, MODE_LOWER, i)!= NULL) return(i);
}
return(-1);
}

Это ищет последний из десяти баров на котором сформирован фрактал но не цену фрактала. Её потом можно узнать я наверно так и зделаю 
 
Rosh писал (а):
Написал ответ, но из-за непонятного глюка форума он не появился (кстати, заметил, что такие глюки бывают в момент, когда два человека оодновременно размещают свой пост в одной ветке - мне не повезло :))

Но так как никто не дал до сих пор совета, то я повторю тот пост. Всегда в таких случаях (даже если уверен, что поиск увенчается успехом) нужно ставить ограничитель поиска :

double GetPriceLastFractal(string symbol, int timeframe, int mode, int shift)
{
 double currprice;
 
int limit=shift+1000;
while(currprice == 0 && shift<limit)
  {
     
  currprice =  iFractals (symbol, timeframe, mode, shift);
 
     
  shift++;
 }
 
 if (shift>=limit) Print("Ну не шмогла я, не шмогла");
 return(currprice);
}
Этот цикл в 100% из 100% выходит по лимиту

Мой маленький опыт говорит, что без ограничителя мы будем завешивать комп в 2 случаях из трех :)
 
DonTabak:
Вот код для случая, когда мы хотим найти ближайший фрактал, который выше (ниже) текущей цены:
//+---------------------------------------------------------------------+
//| GetPriceLastFractal(string symbol, int timeframe, int mode) function|                                                |
//+---------------------------------------------------------------------+
double GetPriceLastFractal(string symbol, int timeframe, int mode)
   { 
     double currprice;
     int i;
     if (mode == 0)
       {
        while (currprice <= iHigh(symbol,timeframe,0))
          {if (i>=iBars(symbol,timeframe)-5) return(0); // Превышен исторический Max графика
           currprice = iFractals(symbol, timeframe, MODE_UPPER,i);i++;}       
        return(currprice);
       }
     else
       {
         while (currprice == 0 || currprice >=iLow(symbol,timeframe,0))
           {if (i>=iBars(symbol,timeframe)-5) return(0); // Превышен исторический Min графика
            currprice = iFractals(symbol, timeframe, MODE_LOWER,i);i++;}       
        return(currprice);
       } 
   }
//+------------------------------------------------------------------+

Если фрактал не найден, то возвращает 0.
Причина обращения: