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

 
whroeder1:

До сборки 600 (3 февраля2014 года) был только start(). Теперь есть OnTick (советники,) OnCalculate (индикаторы,) и OnStart (скрипты.) Я забыл, что вы говорили об индикаторе.

Начните использовать новые функции обработки событий - Функции - Основы языка - Справочник MQL4. См. раздел Как правильно делать возврат назад.

Да! Теперь я понял вас гораздо яснее, за что вам огромное спасибо.

А ваш комментарий #20 натолкнул меня на еще одну идею. (Когда-то вы поделились со мной этой идеей, и теперь я держу ее в голове).

Также я пытаюсь написать лучший код для моего индикатора, и сейчас я пытаюсьизучить комментарий#18-@Marco vd Heijden

Тогда я буду широко изучать ваш комментарий.

Еще раз спасибо!

 
Marco vd Heijden:

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

Что касается вопроса о барах, храните время открытия бара в переменной datetime и просто сравнивайте записанное время с реальным временем, тогда всякий раз, когда возникает новый бар, он будет срабатывать.

Вот пример:

datetime M1,M5,M15,M30,H1,H4,D1,W1,MN1;

Прежде всего, огромное спасибо за Ваш комментарий.

Я все еще остаюсь на Индикаторе. Я попробовал кое-что, и это хорошо работает для меня, но я столкнулся с одной проблемой, я не могу проверить его на 'Strategy Tester' - он выдает мне фатальную ошибку: MT4 'Not Responding'.

#1 - Марко, не могли бы вы сообщить мне, откуда это происходит, пожалуйста?

#2 - Приведенный ниже код правильный?

Ниже приведен код, который я пробовал.

string _prefix = "_Preriod_M5 - " ;
string _vlineName_M5 ;
int _prd = PERIOD_M5 ;

int _prd_add = PeriodSeconds( _prd ) ;
datetime _dt_Prd_M5 ;

int _time_M5 ;
datetime _prdCvrt_M5 ;
datetime _timeCvrt_M5 ;

//---init
EventSetMillisecondTimer( 10 );
_CreateLines();

//---timer
if ( _dt_Prd_M5 != iTime( Symbol(), _prd, 0 ) )
{
    _dt_Prd_M5 = iTime( Symbol(), _prd, 0 );
    _CreateLines();
}

//---_CreateLines()
    //---
    int _dayCnt_M5 = 0;
    int _cnt_M5 = iBarShift( Symbol(), 0, iTime( Symbol(), PERIOD_M15, _dayCnt_M5 ) );
    for ( int i = 0; i < _cnt_M5; i++ )
    {
        //---time convert
        _time_M5     = Time[i];
        _prdCvrt_M5  = PeriodSeconds( _prd );
        _timeCvrt_M5 = _time_M5 - ( _time_M5 % _prdCvrt_M5 ) + _prdCvrt_M5;

        //---name
        _vlineName_M5 = _prefix + "PERIOD_M5 - " + TimeToStr( _timeCvrt_M5, TIME_DATE|TIME_MINUTES );

        //---
        if ( _Period < PERIOD_M30 )
        {
            {
                ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
            }
        }
    }
    ObjectMove ( 0, _vlineName_M5, 0, _dt_Prd_M5, 0 );

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

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

 
Функция таймера не работает в тестере стратегий MT4, поэтому ее нужно поместить в функцию тика.
 
Marco vd Heijden: Функция таймера не работает в тестере стратегий MT4, поэтому ее нужно поместить в функцию тика.
В бэктесте OnTimer() не работает (М. Али) - Форум MQL4
Chart Event для бэктестера MT4 (Migel) - MQL4 форум
 
Marco vd Heijden:
Функция таймера не работает в тестере стратегий MT4, поэтому ее нужно поместить в функцию тика.

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

Я точно знаю, что проблема не из кода.

 
Откуда вы знаете?
 

Marco vd Heijden:

Вот пример:

datetime  M5;

//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(250);

//--- create some things

   CreateLines(); // Function that creates time lines

//--- load open times
   M5=iTime(Symbol(),PERIOD_M5,0);

//--- set timelines

   ObjectMove(0,"Time-M5",0,M5,0);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(M5!=iTime(Symbol(),PERIOD_M5,0))
     {
      M5=iTime(Symbol(),PERIOD_M5,0);  // overwrite old value with new value  
      //Alert("New Bar on M5! ",TimeToString(M5,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-M5",0,M5,0);
     }
  }
//+------------------------------------------------------------------+

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

Этот комментарий многому меня научил.

Похоже, что этот код работает хорошо для меня, который я разместил в предыдущем комментарии.

Но мне нужно, чтобы этот код (который работает для Period_M5) не работал в часы 12:00 (это может быть 13:00, 14:00...) и ниже код игнорирует 'OBJ_VLINE' прошлые времена (это хорошо для меня), но в то время как сейчас часы 12:00 ниже код показывает мне дополнительно текущее время VLINE, но я не хочу этого.

if ( TimeHour( _timeCvrt_M5 ) != 12 )
{
    ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
}   //---if Close

Я попробовал кое-что, что решило мою проблему, но это не работает правильно.

Также я добавил скриншот.


Пожалуйста, помогите мне, мне очень нужно решить эту проблему.

Огромная благодарность заранее.

Файлы:
 
Marco vd Heijden:
Как вы узнали?

Из-за потери соединения я попробовал использовать"Тестер стратегий" во время разрыва соединения, и он отлично работает для меня.

После того, как я прочитал ваши и г-на Уильяма комментарии, и тогда я знаю наверняка об этом.

Этого недостаточно, прости те?

 
if ( TimeHour( _timeCvrt_M5 ) != 12 )
{
    ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
}   //---if Close

В этом примере вы получите строку в каждый час, кроме 12:00, потому что вы исключили оператор != differ then 12, поэтому когда он == равен 12, строки нет.

 
Marco vd Heijden:

В этом примере вы получаете строку в каждый час, кроме 12:00, потому что вы исключаете с != differ then 12 оператор, так что когда он == равен 12 нет строки.

Гениальный человек, спасибо :))

Это просто, но я не возражаю против этого. Просто просто и просто вау.

(На самом деле я использую '==' в моем индикаторе, но я действительно сосредоточился на 'OnTimer')

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

Это работает хорошо для меня, но когда время будет 00:00 - дополнительное текущее время VLINE показывает снова.

if (
     TimeHour( _timeCvrt_M5 ) == 1  ||
     TimeHour( _timeCvrt_M5 ) == 2  ||
     TimeHour( _timeCvrt_M5 ) == 3  ||

     TimeHour( _timeCvrt_M5 ) == 5  ||
     TimeHour( _timeCvrt_M5 ) == 6  ||
     TimeHour( _timeCvrt_M5 ) == 7  ||

     TimeHour( _timeCvrt_M5 ) == 9  ||
     TimeHour( _timeCvrt_M5 ) == 10 ||
     TimeHour( _timeCvrt_M5 ) == 11 ||

     TimeHour( _timeCvrt_M5 ) == 13 ||
     TimeHour( _timeCvrt_M5 ) == 14 ||
     TimeHour( _timeCvrt_M5 ) == 15 ||

     TimeHour( _timeCvrt_M5 ) == 17 ||
     TimeHour( _timeCvrt_M5 ) == 18 ||
     TimeHour( _timeCvrt_M5 ) == 19 ||

     TimeHour( _timeCvrt_M5 ) == 21 ||
     TimeHour( _timeCvrt_M5 ) == 22 ||
     TimeHour( _timeCvrt_M5 ) == 23
)

(Я несколько раз обновлял этот комментарий, потому что я был исследован).

Пожалуйста, помогите мне.