Индикатор Разные вопросы - страница 4

 

Вы можете использовать оператор switch.

      switch(TimeHour())
        {
         case 0:
          // Do Something...
            break;

         case 1:
          // Do Something...  
            break;

         case 2:

            break;

         case 3:

            break;

         case 4:

            break;

         case 5:

            break;

         case 6:

            break;
         // etc...
        }

Или использовать простой двойной оператор if:

if(TimeHour()>0 && TimeHour()< 22)
{
  // Do Something...
}

Если время часа выше > 0, но также && ниже < 22 и т.д.

Или вы можете использовать:

if(TimeHour()>=0 && TimeHour()<= 22)
{
  // Do Something...
}

If time hour is above > or == equal to 0 but also && below < or == equal to 22 etc.

Это немного отличается, потому что включает час, когда он равен, тогда как предыдущий пример >0 исключает сам 0, потому что он равен, а не выше.

 

Линии #Month - Закрыты для меня.

Я тестировал с помощью 'Strategy Tester' и в реальном времени пока работает идеально.

Я узнал много нового из ваших комментариев, и я сделал мой индикатор настолько хорошим, большое спасибо @Marcovd Heijden

Особая благодарность г-ну Марко и г-ну Уильяму.

 

Приведенный ниже код работает хорошо, но иногда он занимает много времени (1250).

EventSetMillisecondTimer( 1250 );

// which is good?

EventSetTimer( 1 );

Дополнительно, могу ли я использовать функцию'Switch' для этого?

//--- 2-й раз редактировалось

Я не хочу использовать функцию start(). На самом деле мне нужно установить как показано ниже.

EventSetMillisecondTimer( 10   ); // 1st will read in 10
EventSetMillisecondTimer( 250  ); // 2nd will read in 250
EventSetMillisecondTimer( 1250 ); // 3rd will read in 1250

Но мне нужна помощь, пожалуйста.

//--- 3-й раз редактировалось

switch ( EventSetMillisecondTimer( 10 ) )
{
    case    1   :   EventSetMillisecondTimer( 100  );
    case    2   :   EventSetMillisecondTimer( 250  );
    case    3   :   EventSetMillisecondTimer( 1250 );
    default     :   EventSetMillisecondTimer( 10   ); break;
}   //---switch Close

Это не работает, как я хочу.

Если кто-то понял мою проблему, пожалуйста, дайте мне совет или помогите.

Заранее спасибо.

 
Max Enrik: Я не хочу использовать функцию start().
  1. Почему нет? Пока вы не получите новый тик, ничего (на рынке) не изменилось. Таймер имеет ограниченное применение.
  2. Начните использовать новые функции обработки событий - Функции - Основы языка - Справочник MQL4. start как обесцененный С 3 февраля2014 года (Build 600).
 
Max Enrik:

Я не хочу использовать функцию start(). На самом деле мне нужно установить, как показано ниже.

EventSetMillisecondTimer( 10   ); // 1st will read in 10
EventSetMillisecondTimer( 250  ); // 2nd will read in 250
EventSetMillisecondTimer( 1250 ); // 3rd will read in 1250

Но мне нужна помощь, пожалуйста.

Это не работает, как я хочу.

Если кто-то понимает мою проблему, пожалуйста, дайте мне совет или помогите.

Заранее спасибо.


Нет, так не работает, вы используете один таймер и только один таймер.

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

int clock;
OnTimer()
{
  clock++;
  
  switch(clock)
   {
    case 500:
    //Do something...
    break;

    case 1000:
    //Do something...
    clock=0; // reset counter if need be.
    break;

    // Etc...
   }
}
 
whroeder1:
  1. Почему нет? Пока вы не получите новый тик, ничего (на рынке) не изменилось. Таймер имеет ограниченное применение.
  2. Начните использовать новые функции обработки событий - Функции - Основы языка - Справочник по MQL4. start as been depreciated Since February 3,2014 (Build 600)
Спасибо за ваш комментарий.

Вы дважды упомянули "Event Handling Functions", и я прочитал несколько раз (возможно, я не совсем понял всю эту страницу - также я использую функцию "OnTimer" ), но я беспокоюсь об этой странице, которая потянет меня в другую сторону - но мой этот индикатор почти закончен.

Но я вижу, что просто 'EventSetMillisecondTimer( 1250 );' иногда занимает "нерелевантное" время.


Лучше всего.
 
Marco vd Heijden:

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

Я пробовал как показано ниже.

Правильный ли это код?

void OnTimer()
{
    //---
    _clock++;
    //---
    switch ( _clock )
    {
        case    500 :
            if ( // will be same thing in here? ) )
            {
                ...
                _CreateLines_M5();
            }   //---if Close
        break;
        
        case    1000:
            if ( // will be same thing in here? ) )
            {
                ...
                _CreateLines_M5();
            }   //---if Close

        _clock = 0;
        break;
    }   //---switch Close
}

Но он не работает для меня.

Спасибо.

 
Max Enrik: Я пробовал как показано ниже.
void OnTimer()
{
    //---
    _clock++;
    //---
    switch ( _clock )
    {
        case    500 :
            if ( // will be same thing in here? ) )
            {
                ...
                _CreateLines_M5();
            }   //---if Close
        break;
        
        case    1000:
            if ( // will be same thing in here? ) )
            {
                ...
                _CreateLines_M5();
            }   //---if Close

        _clock = 0;
        break;
    }   //---switch Close
}

Но у меня это не работает.

  1. Вы не пробуете это в тестере? В бэктесте OnTimer() не срабатывает (M. Ali) - MQL4 форум Chart Event For MT4 Backtester (Migel) - MQL4 форум
  2. Ваш код упрощен.
    void OnTimer()
    {
        if(++_clock % 500 == 0)_CreateLines_M5();
    }

 
whroeder1:
  1. Ваш код упрощен
    void OnTimer()
    {
        if(++_clock % 500 == 0)_CreateLines_M5();
    }

Большое спасибо!

Я попробовал, он постоянно обновляется в течение минуты, даже если я выбираю PERIOD_M5.

Также я хотел бы знать, нужно ли мне использовать PERIOD_M1 и PERIOD_M5, могу ли я использовать как показано ниже?

if(++_clock % 500 == 0)_CreateLines_M1();
if(++_clock % 500 == 0)_CreateLines_M5();

Также, пожалуйста, является ли приведенный ниже метод правильным?

if ( ++_clock % 500 == 0 || _dt_Prd_M5 != iTime( Symbol(), _prd_M5, 0 ) )
{
    _dt_Prd_M5 = iTime( Symbol(), _prd_M5, 0 );
    _CreateLines_M5();
}

Всего наилучшего.

 
Max Enrik:

Большое спасибо!

Я попробовал, он постоянно обновляется в течение минуты, даже если я выбираю PERIOD_M5.

Также я хотел бы знать, нужно ли мне использовать PERIOD_M1 и PERIOD_M5, могу ли я использовать как показано ниже?

if(++_clock % 500 == 0)_CreateLines_M1();
if(++_clock % 500 == 0)_CreateLines_M5();

Также, пожалуйста, является ли приведенный ниже метод правильным?

if ( ++_clock % 500 == 0 || _dt_Prd_M5 != iTime( Symbol(), _prd_M5, 0 ) )
{
    _dt_Prd_M5 = iTime( Symbol(), _prd_M5, 0 );
    _CreateLines_M5();
}

Всего наилучшего.

Пожалуйста, опишите, что вы пытаетесь сделать.