Помогите с ЭКСПЕРТОМ!

 

Я новичок в програмировании, не могу никак розобратса в коде.

Это из учебника.

Задача 26.Найти минимальное и максимальное значения цены среди последних n баров.

??? Как сделать так, чтобы он видавал первое сообщение не при первом тике а при появлении нового бара???

//--------------------------------------------------------------------
// newbar.mq4  
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
extern int Quant_Bars=15;                       // Количество баров
bool New_Bar=false;                             // Флаг нового бара
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   double Minimum,                              // Минимальная цена
          Maximum;                              // Максимальная цена
//--------------------------------------------------------------------
   Fun_New_Bar();                               // Обращение к ф-ии
   if (New_Bar==false)                          // Если бар не новый..
      return;                                   // ..то уходим
//--------------------------------------------------------------------
   int Ind_max =ArrayMaximum(High,Quant_Bars,1);// Индекс бара макс.ц. 
   int Ind_min =ArrayMinimum(Low, Quant_Bars,1);// Индекс бара мин. ц. 
   Maximum=High[Ind_max];                       // Искомая макс цена
   Minimum=Low[Ind_min];                        // Искомая мин. цена
   Alert("За последние ",Quant_Bars,            // Вывод на экран  
   " баров Min= ",Minimum," Max= ",Maximum);
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
void Fun_New_Bar()                              // Ф-ия обнаружения ..
  {                                             // .. нового бара
   static datetime New_Time=0;                  // Время текущего бара
   New_Bar=false;                               // Нового бара нет
   if(New_Time!=Time[0])                        // Сравниваем время
     {
      New_Time=Time[0];                         // Теперь время такое
      New_Bar=true;                             // Поймался новый бар
     }
  }
//--------------------------------------------------------------------
 

надо скорее всего Volume анализировать...

 
MOLET писал (а) >>

static datetime New_Time=0;

Это присвоение надо делать одтн раз при старте эксперта, т.е. в init или в "глобальных переменных"

 
if(New_Time!=Time[0])

Это условие не есть правильным. Time[0] возвращает количество секунд, прошедших начиная от 1970.01.01 до момента появления нулевого бара. Думаю, правильнее будет так:

if(TimeCurrent()==Time[0])
...

Если текущее время совпадает с временем открытия новго бара, тогда..

 
Fduch писал (а) >>
if (Volume[0] == 1)
{
   ...//новый бар
}
 
Fduch писал (а) >>

Это условие не есть правильным. Time[0] возвращает количество секунд, прошедших начиная от 1970.01.01 до момента появления нулевого бара. Думаю, правильнее будет так:

Если текущее время совпадает с временем открытия новго бара, тогда..

if(TimeCurrent()==Time[0])

ошибка! так пролетать будете

 
TheXpert писал (а) >>
if (Volume[0] == 1)
{
   ...//новый бар
}

это не лучший способ поиска нового бара

---

есть достаточно высокая вероятность есть получить на первом тике значение VOLUME[0] >= 2


есть такая проблема - называется - пропущенные бары


а вот конструкция

if(New_Time!=Time[0])
{
    New_Time =Time[0] ;
   
    // новый бар
}

не пропустит новый бар

 

Чтобы эксперт при установке не выдавал сообщений, а ждал до появления нового бара, надо вынести переменную New_Time в глобальные и инициализировать её в ф-ции init.

datetime New_Time;

int init()
{
 New_Time=Time[0];
 return;
}
 
Помогу:

icq 379296833

rtfi91@rambler.ru
 
Xupypr писал(а) >>

Чтобы эксперт при установке не выдавал сообщений, а ждал до появления нового бара, надо вынести переменную New_Time в глобальные и инициализировать её в ф-ции init.

А если эксперт запущен в самом начале нового бара и надо чтобы он отреагировал?

Вот более универсальное решение ( пример для заданного ТФ 4Н ):

extern int WorkingTF = 240;
extern int MaxNewWorkingTFBarTime = 10;

datetime WorkingTFBar = 0;


// Проверим сколько реально времени прошло от начала нового бара к приходу первого тика:
int minutes = TimeMinute( TimeCurrent( ));
if( WorkingTF > 60 )
{
	int houres = TimeHour( TimeCurrent( ));
	if(( houres % ( WorkingTF / 60 )) > 0 )
	{
		return( 0 );
	}
}
if( minutes > MaxNewWorkingTFBarTime )
{
	return( 0 );
}

// Итак, это новый бар на заданном ТФ и в заданном временном промежутке от начала бара, - значит идем дальше:
WorkingTFBar = iTime( Symbol( ), WorkingTF, 0 );
Причина обращения: