Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 352

 

спасибо, но она 

Vitaly Muzichenko:

iCustom в помощь


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

int rates_total=Bars;

определил глобальную переменную

int prev_calculated=0;

вылетает на количестве элементов массива

 
ijonhson:

простите разобрался,но непонятно зачем в oncalculate передавать значения предопределенных переменных, если они глобальные и так-же доступны

Вот посмотрите пример

//+-------------------------------------------------------+
//|Параметры функции                             PROBA.mq4|
//+-------------------------------------------------------+
#property   strict

void OnStart()
{
 Alert(Сумма(2,5));
 
 int Сум=0;
 Сумма(2,5,Сум);  // Передаем в функцию 2 числа и получаем сумму
 Alert(Сум);
}

int Сумма(int a, int b)
{
  return a+b;
}

void Сумма(int a, int b, int & s)
{
  s= a+b;
}

Параметры функции могут быть входные - которые мы ей передаем, и выходные - которые она нам возвращает

 
ijonhson:  int rates_total=Bars;      int prev_calculated=0;

Эти переменные нужны для расчета всей линии индикатора, а Вам надо одно значение. Все намного проще. Проанализируйте программу-индикатор и определите, по какой формуле производится расчет. И эту формулу используйте в эксперте

 

Ребят подскажите, как реализовать такой алгоритм:

Есть таймcерия с объёмом Volume

Нужно сделать сравнение, что-бы последний бар Volume[1] был больше каждого из предыдущих, и что-бы окно(кол-во) предыдущих баров задавалось внешней переменной (extern int)


Напишите пример кода, если не сложно

 
John Smith:

Ребят подскажите, как реализовать такой алгоритм:

Есть таймcерия с объёмом Volume

Нужно сделать сравнение, что-бы последний бар Volume[1] был больше каждого из предыдущих, и что-бы окно(кол-во) предыдущих баров задавалось внешней переменной (extern int)


Напишите пример кода, если не сложно

  for(int i=1; i<NumBar; i++) {
    ArrayResize(Buf, i);
    Buf[i-1] = Volume[i];
  }

 double min= Buf[ArrayMinimum(Buf)];
 double max= Buf[ArrayMaximum(Buf)];

 if(max < Volume[0]) { ... }
 
STARIJ:

Помогло? А как раньше работало?


Работало без ошибок, я похоже сам убрал, автозаменой через ctrl+h, и не заметил >_<. А в общем,наверняка это иллюминаты постарались. Еще раз спасибо !

 
John Smith:

Ребят подскажите, как реализовать такой алгоритм:

Есть таймcерия с объёмом Volume

Нужно сделать сравнение, что-бы последний бар Volume[1] был больше каждого из предыдущих, и что-бы окно(кол-во) предыдущих баров задавалось внешней переменной (extern int)


Напишите пример кода, если не сложно

Не сложно. На коленке написал по памяти (может чего и упустил)...

//+------------------------------------------------------------------+
bool IsLastVolumeTheLargest(const string symbol_name, const ENUM_TIMEFRAMES timeframe,const int start_pos,const int count)
  {
   long array[];  // Массив для хранения объёмов
   //--- если скопировалось меньше, чем нужно, вернём false
   if(CopyTickVolume(symbol_name,timeframe,start_pos,count,array)<count) return false;
   //--- вернём флаг того, что максимальный объём находится в последней ячейке массива (соответствует индексу start_pos)
   return ArrayMaximum(array)==count-1;
  }
//+------------------------------------------------------------------+
 

Здравствуйте. Не могу получить общий доступ к файлу. Задача - нужно, чтобы при ручном тестировании в тестере МТ4 (MQL4) на М1 формировался файл более старшего периода (например М20). Для этого написан индикатор на базе скрипта PeriodConverter. Т.к. в режиме теститрования нельзя сохранить файл (EURUSD20.csv) сразу в папку History, файл сохраняется в общей для всех терминалов папке - \\MetaQuotes\Terminal\Common. Далее зацикленный скрипт, работающий уже на обычном графике М1 копирует данные из файла EURUSD20.csv в файл EURUSD20.hst, расположенный в папке History.  В скрипте файл EURUSD20.csv не открывается, если в это же время он открыт в индикаторе в тестере (5004 ERR_FILE_CANNOT_OPEN Ошибка открытия файла). Если удалить индикатор из тестера, то этот файл в скрипте открывается и копирутся без проблем. Файл в индикаторе открыт так: ExtHandle=FileOpen(c_symbol+(string)20+".csv",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ|FILE_SHARE_READ|FILE_COMMON);
Файл в скрипте открыт так: ExtHandleR=FileOpen("EURUSD20.csv",FILE_BIN|FILE_READ|FILE_SHARE_READ);
Прошу указать на мою ошибку.

 
tvv:

Здравствуйте. Не могу получить общий доступ к файлу. Задача - нужно, чтобы при ручном тестировании в тестере МТ4 (MQL4) на М1 формировался файл более старшего периода (например М20). Для этого написан индикатор на базе скрипта PeriodConverter. Т.к. в режиме теститрования нельзя сохранить файл (EURUSD20.csv) сразу в папку History, файл сохраняется в общей для всех терминалов папке - \\MetaQuotes\Terminal\Common. Далее зацикленный скрипт, работающий уже на обычном графике М1 копирует данные из файла EURUSD20.csv в файл EURUSD20.hst, расположенный в папке History.  В скрипте файл EURUSD20.csv не открывается, если в это же время он открыт в индикаторе в тестере (5004 ERR_FILE_CANNOT_OPEN Ошибка открытия файла). Если удалить индикатор из тестера, то этот файл в скрипте открывается и копирутся без проблем. Файл в индикаторе открыт так: ExtHandle=FileOpen(c_symbol+(string)20+".csv",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ|FILE_SHARE_READ|FILE_COMMON);
Файл в скрипте открыт так: ExtHandleR=FileOpen("EURUSD20.csv",FILE_BIN|FILE_READ|FILE_SHARE_READ|FILE_COMMON);
Прошу указать на мою ошибку.

Указал?

 
Alexey Viktorov:

Указал?

Я не понял. Эта опция указывает на местоположение файла - \\MetaQuotes\Terminal\Common. Без этой опции я не смогу взять файл, который сформировался в тестере. Без этой опции файл будет искаться в MQL4\Files - а туда файл из тестера я не смогу положить.

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