Здравствуйте, друзья! Подскажите как написать код, который определит: какой фрактал из всех сформированных, за последние 50 свечей, имеет максимальную цену?
есть код, только он видит ближайший фрактал... в чем проблема...?
В операторе break - видимо, вы неправильно его используете.
У вас стоит проверка, если вы при получении фрактала получаете что-то отличное от нуля (ясное дело, получаете, в обычной ситуации) - то происходит выход из цикла. А вам надо в цикле проверить все фракталы.
В операторе break - видимо, вы неправильно его используете.
У вас стоит проверка, если вы при получении фрактала получаете что-то отличное от нуля (ясное дело, получаете, в обычной ситуации) - то происходит выход из цикла. А вам надо в цикле проверить все фракталы.
Неожиданная проблема появилась: не могу понять почему переменная min обнуляется?
for(int n = 0; n < 25; n ++)
{
if(iFractals(NULL, 0, MODE_UPPER, n) != NULL) fractal_up = n + 1;//индекс бара ближайшего фрактала up
if(iFractals(NULL, 0, MODE_LOWER, n) != NULL) fractal_low = n + 1;
}
for(int i = 0; i <= 25; i ++)
{
price_up[i] = iHigh(NULL, 0, fractal_up - i);
price_low[i] = iLow(NULL, 0, fractal_low - i);
}
int index_max_price = ArrayMaximum(price_up, WHOLE_ARRAY, 0);
int index_min_price = ArrayMinimum(price_low, WHOLE_ARRAY, 0);
double max = price_up[index_max_price];
double min = price_low[index_min_price];
Comment("max: ", max, ", min: ", min); // эта переменная иногда показывает ноль, кто знает из-за чего???
Неожиданная проблема появилась: не могу понять почему переменная min обнуляется?
Из-за того, что в массиве price_low не 25 фракталов, а меньше. В итоге те элементы массива, которые не были заполнены, содержат 0. А 0 - это минимальное значение в массиве, что и выдает ArrayMinimum.
P. S. Для поиска минимального и максимального значения фракталов на интервале N баров проще использовать поиск мин. и макс. цены на этом интервале при помощи iHighest и iLowest.
Из-за того, что в массиве price_low не 25 фракталов, а меньше. В итоге те элементы массива, которые не были заполнены, содержат 0. А 0 - это минимальное значение в массиве, что и выдает ArrayMinimum.
Цикл считывает не фрактылы, а бары. То есть, пытается найти за 25 баров все сформированные фракталы. Какой есть выход из ситуации?
Здравствуйте, друзья! Подскажите как написать код, который определит: какой фрактал из всех сформированных, за последние 50 свечей, имеет максимальную цену?
есть код, только он видит ближайший фрактал... в чем проблема...?
void OnTick()
{
double price_up[50];
for(int n = 0; n < (Bars-1); n ++)
{
if(iFractals(NULL, 0, MODE_UPPER, n) != NULL) break;
fractal_up = n + 1;//индекс бара ближайшего фрактала
price_up[n] = iHigh(NULL, 0, fractal_up - n);//через цикл заполняем массив ценами фракталов
}
int index_max_price = ArrayMaximum(price_up, WHOLE_ARRAY, 0);//поиск индекса в массиве с максимальной ценой
double max = price_up[index_max_price];//присваеваем переменной максимум цены
Comment("max: ", max);//но показывает ближайший фрактал
}
Такой скриптик поглядите:
//+------------------------------------------------------------------+ //| MaxMinFractals.mq4 | //| Copyright 2015, Artem A. Trishkin, Skype artmedia70 | //| https://login.mql5.com/ru/users/artmedia70 | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, Artem A. Trishkin, Skype artmedia70" #property link "https://login.mql5.com/ru/users/artmedia70" #property version "1.00" #property strict #property script_show_inputs //--- input parameters input int NumberFractalsForFind=25; int numberFractalsForFind=(NumberFractalsForFind<1)?1:NumberFractalsForFind; //--- global variables double priceMax=DBL_MIN; // Максимальная цена найденных фракталов double priceMin=DBL_MAX; // Минимальная цена найденных фракталов //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { //--- int numberUpFr=0, // количество проверенных верхних фракталов numberDnFr=0, // количество проверенных нижних фракталов barMaxFr=0, // бар максимального верхнего фрактала barMinFr=0; // бар максимального нижнего фрактала //--- for(int i=0; i<Bars; i++) { double frUp=iFractals(NULL,PERIOD_CURRENT,MODE_UPPER,i); double frDn=iFractals(NULL,PERIOD_CURRENT,MODE_LOWER,i); if(frUp!=0 && numberUpFr<numberFractalsForFind) { numberUpFr++; if(frUp>priceMax) { priceMax=frUp; barMaxFr=i; //Print("barMaxFr="+IntegerToString(barMaxFr)+", numberUpFr="+IntegerToString(numberUpFr)+", frUp="+DoubleToString(frUp,Digits)+", priceMax="+DoubleToString(priceMax,Digits)); } } if(frDn!=0 && numberDnFr<numberFractalsForFind) { numberDnFr++; if(frDn<priceMin) { priceMin=frDn; barMinFr=i; //Print("barMinFr="+IntegerToString(barMinFr)+", numberDnFr="+IntegerToString(numberDnFr)+", frDn="+DoubleToString(frDn,Digits)+", priceMin="+DoubleToString(priceMin,Digits)); } } } Alert("Из верхних максимальная цена (priceMax): "+DoubleToString(priceMax,Digits)+" на баре "+IntegerToString(barMaxFr)+", время бара: "+TimeToString(Time[barMaxFr])+"\n"+ "Из нижних минимальная цена (priceMin): "+DoubleToString(priceMin,Digits)+" на баре "+IntegerToString(barMinFr)+", время бара: "+TimeToString(Time[barMinFr])); } //+------------------------------------------------------------------+
Такой скриптик поглядите:
Aleksandr Glebov:
Цикл считывает не фрактылы, а бары. То есть, пытается найти за 25 баров все сформированные фракталы. Какой есть выход из ситуации?
Выход простой: понять суть ошибки и написать правильно.
double max = 0.0, min = 0.0; for(int n = 0; n < 25; n ++) { if(iFractals(NULL, 0, MODE_UPPER, n) != NULL) max = MathMax(iHigh(NULL, 0, n)); if(iFractals(NULL, 0, MODE_LOWER, n) != NULL) if (min == 0.0 || iLow(NULL, 0, n) < min) min = iLow(NULL, 0, n); } Comment("max: ", max, ", min: ", min);
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте, друзья! Подскажите как написать код, который определит: какой фрактал из всех сформированных, за последние 50 свечей, имеет максимальную цену?
есть код, только он видит ближайший фрактал... в чем проблема...?
void OnTick()
{
double price_up[50];
for(int n = 0; n < (Bars-1); n ++)
{
if(iFractals(NULL, 0, MODE_UPPER, n) != NULL) break;
fractal_up = n + 1;//индекс бара ближайшего фрактала
price_up[n] = iHigh(NULL, 0, fractal_up - n);//через цикл заполняем массив ценами фракталов
}
int index_max_price = ArrayMaximum(price_up, WHOLE_ARRAY, 0);//поиск индекса в массиве с максимальной ценой
double max = price_up[index_max_price];//присваеваем переменной максимум цены
Comment("max: ", max);//но показывает ближайший фрактал
}