Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 195

 
Artyom Trishkin:

Находите точку, в которой цена пересекла МАшку вверх. Это будет старт диапазона поиска.

Находите точку, в которой цена пересекла МАшку вниз. Это будет стоп диапазона.

Берёте iHighest() только в этом диапазоне.

А как реализовать поиск точек МА, так чтоб искало всего 2 крайних а не до бесконечности. словами я это тоже понимаю, но  если не трудно как это реализовать в код.
 
GlaVredFX:
А как реализовать поиск точек МА, так чтоб искало всего 2 крайних а не до бесконечности. словами я это тоже понимаю, но  если не трудно как это реализовать в код.

Один из способов: завести переменную на глобальном программном уровне советника (объявить переменную в "шапке" советника) - в эту переменную записывать время открытия бара на котором было последнее пересечение. Это поможет использовать третью форму вызова CopyBuffer:

Обращение по начальной и конечной датам требуемого интервала времени

int  CopyBuffer(
   int       indicator_handle,     // handle индикатора
   int       buffer_num,           // номер буфера индикатора
   datetime  start_time,           // с какой даты
   datetime  stop_time,            // по какую дату
   double    buffer[]              // массив, куда будут скопированы данные
   );

здесь start_time - как раз и есть время из нашей переменной, а stop_time - время последней известной котировки сервера.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Отсчет элементов копируемых данных (индикаторный буфер с индексом buffer_num) от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар (значение индикатора для текущего бара). При копировании заранее неизвестного количества данных в качестве массива-приемника buffer[] желательно...
 
GlaVredFX:
А как реализовать поиск точек МА, так чтоб искало всего 2 крайних а не до бесконечности. словами я это тоже понимаю, но  если не трудно как это реализовать в код.

Нужно делать перебор в цикле до тех пор, пока не будет найден уход за МА.

Один момент, это участок выделенный жёлтым прямоугольником, он прервёт цикл до того, как дойдёт до второго пересечения цены и МА. По итогу максимум будет найден на первом справа пересечении


P.S. Чем отличаются выделенных 2 участка?

 
Vitaly Muzichenko:

P.S. Чем отличаются выделенных 2 участка?

Они могут отличатся - а именно первая точка, может быть выше второй или ниже. 

Это пример просто такой получился. Но это не значит что они одинаковые будут всегда. 



Кто может накидать примеров кода с похожими условиями.: 

Текущее значение МА> 0 бара
Ищем номер Бара, Цена<МА, нашли номер 1 бара, записываем значение в буфер 2
Ищем следующий номер Цена>МА нашли номер 2 бара, записываем в значение в буфер 1.
Останавливаем поиск.
Далее между значениями буфера 1 и 2 ищем самую низкую цену Low.
Если Текущее значение МА< 0 бара
Ищем номер Бара, Цена>МА, нашли номер 1 бара, записываем значение в буфер 2
Ищем следующий номер Цена<МА нашли номер 2 бара, записываем в значение в буфер 1.
Останавливаем поиск.
Далее между значениями буфера 1 и 2 ищем самую высокую цену High.

 
GlaVredFX:

Они могут отличатся - а именно первая точка, может быть выше второй или ниже. 

Это пример просто такой получился. Но это не значит что они одинаковые будут всегда. 



Кто может накидать примеров кода с похожими условиями.: 

Текущее значение МА> 0 бара
Ищем номер Бара, Цена<МА, нашли номер 1 бара, записываем значение в буфер 2
Ищем следующий номер Цена>МА нашли номер 2 бара, записываем в значение в буфер 1.
Останавливаем поиск.
Далее между значениями буфера 1 и 2 ищем самую низкую цену Low.
Если Текущее значение МА< 0 бара
Ищем номер Бара, Цена>МА, нашли номер 1 бара, записываем значение в буфер 2
Ищем следующий номер Цена<МА нашли номер 2 бара, записываем в значение в буфер 1.
Останавливаем поиск.
Далее между значениями буфера 1 и 2 ищем самую высокую цену High.

Если следовать изображению, то нужно запустить цикл и делать поиск до тех пор, пока не будет обнаружено условие МА<Цена.

Как только нашли это место - заполняем массив ценами High. Идём в цикле до тех пор, пока не будет обнаружено условие МА>Цена, как только нашли это место - прерываем цикл (break)

Ну и в массиве ищем пиковые цены

 
Vitaly Muzichenko:

Если следовать изображению, то нужно запустить цикл и делать поиск до тех пор, пока не будет обнаружено условие МА<Цена.

Как только нашли это место - заполняем массив ценами High. Идём в цикле до тех пор, пока не будет обнаружено условие МА>Цена, как только нашли это место - прерываем цикл (break)

Ну и в массиве ищем пиковые цены 

Все верно и я так же написал, а как это реализовать в Код можно хотя бы пример кода вот этого :


запустить цикл и делать поиск до тех пор, пока не будет обнаружено условие МА<Цена.

Как только нашли это место - заполняем массив ценами High 

Документация по MQL5: Операции с массивами / ArrayFill
Документация по MQL5: Операции с массивами / ArrayFill
  • www.mql5.com
При вызове функции ArrayFill() всегда подразумевается обычное направление индексации – слева направо, то есть изменение порядка доступа к элементам массива с помощью функции ArraySetAsSeries() не принимается во внимание. Многомерный массив при обработке функцией ArrayFill() представляется одномерным, например...
 
GlaVredFX:

Все верно и я так же написал, а как это реализовать в Код можно хотя бы пример кода вот этого :


запустить цикл и делать поиск до тех пор, пока не будет обнаружено условие МА<Цена.

Как только нашли это место - заполняем массив ценами High 

Я сейчас код не могу написать, может кто другой напишет - он простой

 

Вот такое надо, может кто то помочь с этим кодом. 

int start()                           

  {

  int    i;

  double No_1;

  double No_2;

  double k=iClose(NULL,0,i);
  double h=iHigh(NULL,0,i);

  if (ma>k) ma=iMA(NULL,0,24,0,1,0,i);

  for (i=0; i< Bars; i++) {

  //---- Код поиска номер крайнего бара где  iHigh>ma

  //---- Если нашли то возвращаем номер бара No_1

            

          }

Потом надо найти следующее значение где iLow>ma и возвратить номер бара No_2 .
Остановить поиск и с помощью функции iHighest найти вершину между этими барами
int val_index=iHighest(NULL,0,MODE_HIGH,No_2,No_1);

 
GlaVredFX:

if (ma>k) ma=iMA(NULL,0,24,0,1,0,i);

Это не MQL5 код. 

 
Vladimir Karputov:

Это не MQL5 код. 

Это макет, здесь нет разницы между 4 и 5

:)
Причина обращения: