Ты изменяешь параметр функции 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. Не нравится мне это. Введи другую переменную внутри цикла. И вообще - какой смысл у тебя играет этот параметр в функции? По логике, он при ее вызове всегда должен быть равным нулю, чтобы найти последний фрактал. И зачем его тогда в параметры вводить, если это константа? Короче, попробуй так:
Пробывал и так все равно зацикливает. Может это и не зацикливание,
но тогда что? Тестирую на истории именно этот участок кода, после
запуска все подвисает пока Стоп не нажмёш.
Ты изменяешь параметр функции 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)
Написал ответ, но из-за непонятного глюка форума он не появился
(кстати, заметил, что такие глюки бывают в момент, когда два человека
оодновременно размещают свой пост в одной ветке - мне не повезло
:))
Но так как никто не дал до сих пор совета, то я повторю тот пост. Всегда в таких случаях (даже если уверен, что поиск увенчается успехом) нужно ставить ограничитель поиска :
Мой маленький опыт говорит, что без ограничителя мы будем завешивать комп в 2 случаях из трех :)
Но так как никто не дал до сих пор совета, то я повторю тот пост. Всегда в таких случаях (даже если уверен, что поиск увенчается успехом) нужно ставить ограничитель поиска :
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).
Почему этот код зацикливает советник ? Может я где ошибся ? Идет поиск значения последнего фрактала верх/низ(по 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 писал (а):
Написал ответ, но из-за непонятного глюка форума он не появился (кстати, заметил, что такие глюки бывают в момент, когда два человека оодновременно размещают свой пост в одной ветке - мне не повезло :))
Но так как никто не дал до сих пор совета, то я повторю тот пост. Всегда в таких случаях (даже если уверен, что поиск увенчается успехом) нужно ставить ограничитель поиска :
Мой маленький опыт говорит, что без ограничителя мы будем завешивать комп в 2 случаях из трех :)
Написал ответ, но из-за непонятного глюка форума он не появился (кстати, заметил, что такие глюки бывают в момент, когда два человека оодновременно размещают свой пост в одной ветке - мне не повезло :))
Но так как никто не дал до сих пор совета, то я повторю тот пост. Всегда в таких случаях (даже если уверен, что поиск увенчается успехом) нужно ставить ограничитель поиска :
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.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
double GetPriceLastFractal(string symbol, int timeframe, int mode, int shift)
{
double currprice;
while(currprice == 0)
{
currprice = iFractals (symbol, timeframe, mode, shift);
shift++;
}
return(currprice);
}