Скачать MetaTrader 5

iHigh||iHighest - показывает не правильный уровень!?

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

Возможно ли такое, где ошибка чет я не понял...

ищу хай и лоу в промежутке баров вывожу данные он мне показывает уровень хая выше чем в этом промежутке есть, где я ошибся???

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
double H,L;

datetime ny_time  = iTime(NULL,PERIOD_D1,0) + (4-Period()/60.0)*3600;
datetime time1 = ny_time + Period()*60;//время начала

datetime ny_time_  = iTime(NULL,PERIOD_D1,1) + (4-Period()/60.0)*3600;
datetime time_ = ny_time_ + Period()*60;//время конец

int b1 = iBarShift(NULL,0, time_);//бар до которого ищем лоу хай
int b2 = iBarShift(NULL,0, time1);//бар с которого начинаем поиск лоу хай



H=iHigh(Symbol(),0,iHighest(Symbol(),0,MODE_HIGH,b1,b2));//ищем хай в промежутке b1 - b2

L=iLow(Symbol(),0,iLowest(Symbol(),0,MODE_LOW,b1,b2));//ищем лоу в промежутке b1 - b2

Comment("\n","High:  ",DoubleToStr(H,Digits),"  Low:  ",DoubleToStr(L,Digits),"  bar_count:  ",b1,"   bar_start:  ",b2);
   return(0);
  }



PapaYozh
3768
PapaYozh  
Martingeil:

Возможно ли такое, где ошибка чет я не понял...

ищу хай и лоу в промежутке баров вывожу данные он мне показывает уровень хая выше чем в этом промежутке, где я ошибся???




Неправильно пользуетесь функциями iHigh и iLow
Martingeil1
898
Martingeil1  
PapaYozh:

Неправильно пользуетесь функциями iHigh и iLow

в каком смысле не правильно?
PapaYozh
3768
PapaYozh  
Martingeil:

в каком смысле не правильно?


В прямом. Посмотрите в документации параметры этих функций и сравните с теми, которые Вы передаете.

PS. Извиняюсь, имел ввиду iHighest() и iLowest()

ilunga
744
ilunga  
Martingeil:

Возможно ли такое, где ошибка чет я не понял...

ищу хай и лоу в промежутке баров вывожу данные он мне показывает уровень хая выше чем в этом промежутке есть, где я ошибся, или это баг мт???

int b1 = iBarShift(NULL,0, time_);//бар до которого ищем лоу хай
int b2 = iBarShift(NULL,0, time1);//бар с которого начинаем поиск лоу хай



H=iHigh(Symbol(),0,iHighest(Symbol(),0,MODE_HIGH,b1,b2));//ищем хай в промежутке b1 - b2

Перечитайте про iHighest:

int iHighest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)

count - Число элементов таймсерии (в направлении от текущего бара в сторону возрастания индекса), среди которых должен быть произведен поиск.
start - Индекс (смещение относительно текущего бара) начального бара, с которого начинается поиск наибольшего значения. Отрицательные значения игнорируются и заменяются нулевым значением.

А вы в него "запихиваете" стартовый и конечной номера баров

Martingeil1
898
Martingeil1  
ilunga:

Перечитайте про iHighest:

int iHighest( string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0)

count - Число элементов таймсерии (в направлении от текущего бара в сторону возрастания индекса), среди которых должен быть произведен поиск.
start - Индекс (смещение относительно текущего бара) начального бара, с которого начинается поиск наибольшего значения. Отрицательные значения игнорируются и заменяются нулевым значением.

А вы в него "запихиваете" стартовый и конечной номера баров



спасибо понял, вопрос снят ;-)
Martingeil1
898
Martingeil1  
PapaYozh:

Я имел ввиду iHighest, iLowest

все разобрался ;-) спасибо...
Martingeil1
898
Martingeil1  

Подзабыл эту функцию, может кому пригодится исправил, теперь все работает как надо...

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  { 
double H,L;

datetime ny_time  = iTime(NULL,PERIOD_D1,0) + (4-Period()/60.0)*3600;
datetime time1 = ny_time + Period()*60;//время начала

datetime ny_time_  = iTime(NULL,PERIOD_D1,1) + (4-Period()/60.0)*3600;
datetime time_ = ny_time_ + Period()*60;//время конец

int b1 = iBarShift(NULL,0, time_);//бар до которого ищем лоу хай
int b2 = iBarShift(NULL,0, time1);//бар с которого начинаем поиск лоу хай

b1 = b1-b2;//число элементов таймсерии

H=High[iHighest(NULL,0,MODE_HIGH,b1,b2)];//находим хай в промежутке b1 и b2
L=Low[iLowest(NULL,0,MODE_LOW,b1,b2)];//находим лоу в промежутке b1 и b2

Comment("\n","High:  ",DoubleToStr(H,Digits),"  Low:  ",DoubleToStr(L,Digits),"  bar_count:  ",b1,"   bar_start:  ",b2);
   return(0);
  }
//+------------------------------------------------------------------+
Владимир Тезис
4266
Владимир Тезис  

Я вот тоже столкнулся с непоняткой - она была и ранеее, но до сих пор так и не исправлена. Иинициализация переменной DayHigh=iHigh(Symbol(),PERIOD_D1,0); приводит к ошибкам. Сегдня советник торгует на М15 и переменная инициализируется нормально. Оставляю советника на ночь и утром обнаруживаю, что из-за неверной инициализации хая/лоу текущего дня он неправильно поставил мне стопы ордеров. Я сунул в код советника принт по этой переменной и оказалось, что после смены суток в переменную возвращается значение хая предыдущего дня. Но если руками шёлкнуть по графику Д1 а затем вернуться снова на М15, то хай текущего дня начинает нормально определяться. И что самое странное, что такая ошибка не всегда есть - бывают дни, когда смена периода не нужна - сутки сменились и хай нового дня нм М15 запрашивается с помошью iHigh() нормально сам собой.

Из-за этого глюка я около года назад сделал цикл перебора свеч для поиска экстремума - пришлось самому выходить из положения. Но глюк этот есть до сих пор. Разработчики, ну реально не удобно вместо элементарного iHigh() использовать цикл. Сделали бы вы что нибудь с этим, а?

Victor Nikolaev
Модератор
15649
Victor Nikolaev  
drknn:

Я вот тоже столкнулся с непоняткой - она была и ранеее, но до сих пор так и не исправлена. Иинициализация переменной DayHigh=iHigh(Symbol(),PERIOD_D1,0); приводит к ошибкам. Сегдня советник торгует на М15 и переменная инициализируется нормально. Оставляю советника на ночь и утром обнаруживаю, что из-за неверной инициализации хая/лоу текущего дня он неправильно поставил мне стопы ордеров. Я сунул в код советника принт по этой переменной и оказалось, что после смены суток в переменную всё равно возвращается значение предыдущего дня. Но если руками шёлкнуть по графику Д1 а затем вернуться снова на М15, то хай текущего дня начинает нормально определяться. И что самое странное, что такая ошибка не всегда есть - бывают дни, когда смена периода не нужна - сутки сменились и хай нового дня нм М15 запрашивается с помошью iHigh() нормально сам собой.

Из-за этого глюка я около года назад сделал цикл перебора свеч для поиска экстремума - пришлось самому выходить из положения. Но глюк этот есть до сих пор. Разработчики, ну реально не удобно вместо элементарного iHigh() использовать цикл. Сделали бы вы что нибудь с этим, а?


Может RefreshRates() поможет. Проверь
Владимир Тезис
4266
Владимир Тезис  
Vinin:

Может RefreshRates() поможет. Проверь


Ок, полез сейчас в код специально посмотреть. Там логика такая: Пришёл сигнал в шорт. Если есть лонговые позы, то сначала закрываем лонги и только после этого открываем шорт. Закрытие лонга и открытие шорта выполняется разными функциями и между ними рефрешратес вставлен. То же касается и противоположного сигнала. То есть, сначала вызывается обновление данных и только потом запрашивается хай дня с периода Д1. Увы, не помогает рефрешратес. :(

Но хорошо то, что такая тема тут создана - это мне напомнило, что код переделать надо - обойти сие недоразумение :) Так что не всё так плохо :)))))))))))

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