[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 367

 
LOA:


Три максимума за период, не последних. Вернее не обязательно последних.

Смотрите: у вас есть массив со значениями. Вам нужно найти в этом массиве три максимума. Они не обязаны быть ни последними, ни первыми в массиве таймсерии. Нужно просто найти три максимума.

1. Копируем ваш массив во временный (искать будем во временном массиве):

int ArrayCopy( object &dest[], object source[], int start_dest=0, int start_source=0, int count=WHOLE_ARRAY)

Копирует один массив в другой. Массивы должны иметь одинаковый тип. Массивы типа double[], int[], datetime[], color[], и bool[], можно копировать как массивы одного типа.
Возвращает количество скопированных элементов.
Параметры:
dest[] - Массив-приемник.
source[] - Массив-источник.
start_dest - Начальный индекс для приемного массива. По умолчанию, стартовый индекс - 0.
start_source - Начальный индекс для исходного массива. По умолчанию, стартовый индекс - 0.
count - Количество элементов, которые нужно скопировать. По умолчанию, весь массив (WHOLE_ARRAY).


2. Ищем во временном массиве максимальное значение:

int ArrayMaximum( double array[], int count=WHOLE_ARRAY, int start=0)

Поиск элемента с максимальным значением. Функция возвращает позицию максимального элемента в массиве.
Параметры:
array[] - Числовой массив, в котором производится поиск.
count - Количество элементов для поиска.
start - Начальный индекс для поиска.


3. Сохраняем найденный индекс в массиве (напр. MassIndexMaxValue[])

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

5. Опять ищем во временном массиве следующее максимальное значение (индекс первого найденного у нас уже сохранён в MassIndexMaxValue[] и значение этого максимума обнулено)

Этот цикл продолжаем до тех пор, пока не найдём нужное количество максимальных значений во временном массиве.

Теперь массив MassIndexMaxValue[] будет содержать индексы нужного количества максимальных значений в вашем массиве.
Размер временного массива после завершения поиска обнуляем - память незачем засорять

Вот как-то так...

ЗЫ... тут вот на коленке набросал по-быстрому... может где и ошибся - писал спросонья и не проверял ничего, но функция примерно такого содержания:

void FindMaxValue(double &ms[], int &ind[], int NumMaxValue) {   
   int i, IndMax;
   double tmp[];                       // создаём временный массив
   ArrayResize(ind,NumMaxValue);       // изменяем размер массива индексов максимальных значений под количество макс. значений
   ArrayResize(tmp,ArraySize(ms));     // размер временного массива = размеру вашего массива значений
   ArrayCopy(tmp, ms);                 // копируем ваш массив во временный
   for (i=0; i<NumMaxValue; i++) {     // цикл по количеству искомых максимумов
      IndMax=ArrayMaximum(tmp);        // ищем индекс максимального значения
      ind[i]=IndMax;                   // сохраняем индекс i-го максимального значения
      tmp[IndMax]=0;                   // обнуляем i-е найденное максимальное значение во временном массиве
      }
   ArrayResize(tmp,0);                 // обнуляем размер временного массива
   return;   
}

При её вызове:

FindMaxValue(Ваш_Массив_Значений, MassIndexMaxValue, 3);

... ранее определённый массив int MassIndexMaxValue[] должен содержать индексы найденных трёх максимальных значений в Ваш_Массив_Значений[];

 

Не могу понять как вычисляется процент прибыли на сделку и процент убытка на сделку. Подскажите?

http://www.assessor.ru/forum/index.php?t=822

 
artmedia70:

Смотрите: у вас есть массив со значениями. Вам нужно найти в этом массиве три максимума. Они не обязаны быть ни последними, ни первыми в массиве таймсерии. Нужно просто найти три максимума.


Артём, спасибо Вам большое!

Рада, что моя мысль с обнуленим максимального значения массива была правильной, а Вы расписали всё в деталях, с копированием в другой массив, теперь буду разбираться в мелочах

и по совету Владимира начну с алгоритма программы, обработаю Вашу информацию и уверена всё получится - учителя хорошие.

ОТДЕЛЬНОЕ СПАСИБО ЗА СТАТЬЮ https://www.mql5.com/ru/articles/1357

 

Добрый день!

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

Я воспользовался iCustom, но сов все равно не получает сигнала

double Signal_I=iCustom(NULL,0,"FL",0,0);
 
skyjet:

Добрый день!

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

Я воспользовался iCustom, но сов все равно не получает сигнала


Возможно код индикатора iCustom не поддается... слишком мало в Вашем вопросе информации для ответа.
 
skyjet:

Добрый день!

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

Я воспользовался iCustom, но сов все равно не получает сигнала


А с другими индикаторами такая же история? Если да, то Вы не верно задействуете функцию iCustom(). Если нет, то попробуйте посмотреть код индикатора - вполне может так случиться, что Ваш индикатор ввобще не задействует ни одного индикаторного буффера - работает с построением графических объектов.
 

Здравствуйте. Имеется функция:

bool Trade()
{
  if(!IsConnected())
  {
     Print("Связь отсутствует.");
     return(false);
  }

  if(!IsExpertEnabled())
  {
     Print("Торговля экспертами выключена.");
     return(false);
  }
  
  if(DayOfWeek()==0 || DayOfWeek()==6)
  {
     Print("В выходные не торгуем.");
     return(false);
  }
  
  if(!IsTradeAllowed())
  {
     Print("Торговля запрещена? WTF???.");
     return(false);
  }
  return(true);
}

Но она почему-то не работает. Вызывается в советнике сразу в начале после int start() следующим образом:

  if(!Trade())
  {
    Sleep(5000);
    return;
  }

Во вкладках Журнал и Эксперты советник loaded successfully, и больше ничего. Хотя должно появиться "В выходные не торгуем.", т.к. 26.11.2011 - суббота.

Где ошибка и что я делаю не так?

 
Roman.:

Возможно код индикатора iCustom не поддается... слишком мало в Вашем вопросе информации для ответа.
Индикатор рисует линии поддержки и сопротивления,с чем и справляется во время визуализации. Сам индикатор при пересечении дает сигнал LT_1 == 1 или -1.
if((Close[i] > BuyLevel) 
         {
    
          LT_1=1;
               
         }                                 
       if((Close[i] < CloseLevel)
         {
           
           LT_1=-1;
               
         }
 
ivan2k2:

Здравствуйте. Имеется функция:

Но она почему-то не работает. Вызывается в советнике сразу в начале после int start() следующим образом:

Во вкладках Журнал и Эксперты советник loaded successfully, и больше ничего. Хотя должно появиться "В выходные не торгуем.", т.к. 26.11.2011 - суббота.

Где ошибка и что я делаю не так?


Сегодня суббота - выходной. Вы запускаете эксперта, происходит инициализация, но поскольку выходной и тика нет, функция старта не запускается (то есть Trade() не вызывается.). Для проверки правильности её работы нужно сунуть вызов этой функции в блок инициализации, ну или тестить в тестере.
 
skyjet:
Индикатор рисует линии поддержки и сопротивления,с чем и справляется во время визуализации. Сам индикатор при пересечении дает сигнал LT_1 == 1 или -1.

ТОгда вообще не парься - чисто перенеси код индюка в эксперта как есть на выполнение торговых критериев и все - далее в сове по этим перенесенным торговым условиям с этого индюка открываешь позы через советника и все...
Причина обращения: