Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Все программы в Code Base доступны из MetaTrader 5. Опубликуй и ты свою!
Mikhail Filimonov
5931
Mikhail Filimonov 2012.03.21 05:25 

Добрый день!

Мне в эксперте необходимо использовать таймер,

но тестер стратегий не правильно работает с таймером или

я ошибаюсь?

Код:

//+------------------------------------------------------------------+
//|                                                     Time_BUG.mq5 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "BUG"
#property link      ""
#property version   "1.00"
//

bool  timer_set;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return( 0 );
  }
 
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  { 
    EventKillTimer();   
  }
 
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- variables
    MqlTick  current_tick;
   
//--- Check for tick Synchronized with server
    if ( SymbolIsSynchronized( _Symbol ) )
    {
//--- Take tick   
      if ( SymbolInfoTick( _Symbol, current_tick ) )
      {
   
//--- Check for timer set
        if ( !timer_set )
        {
          EventSetTimer( CheckTime( current_tick.time ) );
          timer_set = true;
        }        
      }
    }     
  }
//+------------------------------------------------------------------+
//| Set time function                                                |
//+------------------------------------------------------------------+ 
uint CheckTime( const datetime aTime )
  {
//--- Variables
    MqlDateTime  struct_time;
    uint  curr_time, delta_time, value_time;
    uint  day_time   = 86400;
    uint  trade_time = 7200;
   
    TimeToStruct( aTime, struct_time );
   
    curr_time = struct_time.hour * 3600 + struct_time.min * 60 + struct_time.sec;
   
//--- Set timer for next candle
    if ( ( curr_time >= 0 ) && ( curr_time <= trade_time - 1 ) )                  delta_time = 1;
    if ( ( curr_time >= trade_time ) && ( curr_time <= trade_time * 2 - 1 ) )     delta_time = 2;
    if ( ( curr_time >= trade_time * 2 ) && ( curr_time <= trade_time * 3 - 1 ) ) delta_time = 3;
    if ( ( curr_time >= trade_time * 3 ) && ( curr_time <= trade_time * 4 - 1 ) ) delta_time = 4;
    if ( ( curr_time >= trade_time * 4 ) && ( curr_time <= trade_time * 5 - 1 ) ) delta_time = 5;
    if ( ( curr_time >= trade_time * 5 ) && ( curr_time <= trade_time * 6 - 1 ) ) delta_time = 6;
    if ( ( curr_time >= trade_time * 6 ) && ( curr_time <= trade_time * 7 - 1 ) ) delta_time = 7;
    if ( ( curr_time >= trade_time * 7 ) && ( curr_time <= trade_time * 8 - 1 ) ) delta_time = 8;

    value_time = trade_time * delta_time - ( day_time - ( day_time - curr_time ) );
   
    if ( value_time == 0 ) value_time = 1;
   
    return( value_time );   
  } 

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+ 
void OnTimer()
  {
    Print( "TIMER OK!" );
    timer_set = false;  
  }
Файлы:
Timer_bug.jpg 240 kb
Anatoli Kazharski
56774
Anatoli Kazharski 2012.03.21 05:52  
Вставьте код через SRC или Ctrl + Alt + M при редактировании сообщения.
Mikhail Filimonov
5931
Mikhail Filimonov 2012.03.21 06:12  

Добрый день!

К сожалению, у меня не получается отредактировать своё сообщение.

(не появляется правка, только ответить) 

 

Rashid Umarov
Админ
11805
Rashid Umarov 2012.03.21 06:14  
Mikalas:

К сожалению, у меня не получается отредактировать своё сообщение.

(не появляется правка, только ответить) 

Я поправил. Каким браузером вы пользуетесь? При вставке кода из Оперы добавляются лишние переносы строк, которые портят вид. Лучше взять FF.
MQL5.community - Памятка пользователя
MQL5.community - Памятка пользователя
  • 2010.02.23
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы недавно зарегистрировались и у вас возникли вопросы: Как вставить картинку в сообщение на форуме, как красиво оформить исходный код MQL5, где находятся ваши Личные сообщения? В этой статье мы подготовили для вас несколько практических советов, которые помогут быстрее освоиться на сайте MQL5.community и позволят в полной мере воспользоваться доступными функциональными возможностями.
Mikhail Filimonov
5931
Mikhail Filimonov 2012.03.21 06:16  

Я пользуюсь IE9

Rashid Umarov
Админ
11805
Rashid Umarov 2012.03.21 06:43  

Вы не там и не так используете функцию EventSetTimer(). Там же сказано:

Примечание

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

Каждый эксперт и каждый индикатор работает со своим таймером, и получает события только от него. При завершении работы mql5-программы таймер уничтожается принудительно, если он был создан, но не был отключен функцией EventKillTimer().

Для каждой программы может быть запущено не более одного таймера.

И что вы передаете в параметре этой функции?
Mikhail Filimonov
5931
Mikhail Filimonov 2012.03.21 07:13  

Спасибо, всё это написано в файле помощи.

 Обычно, это не значит обязательно.

Я же не использую два таймера, только ОДИН, но устанавливаю его на разное время. 

В фунции EventSetTimer( CheckTime( current_tick.time ) ); 

передаю секунды, ( время) на которое нужно установить таймер,

чтобы начался новый таймфрейм 00:00:00, 02:00:00, 04:00:00 и т.д

Rashid Umarov
Админ
11805
Rashid Umarov 2012.03.21 07:33  
Mikalas:В фунции EventSetTimer( CheckTime( current_tick.time ) ); 

передаю секунды, ( время) на которое нужно установить таймер,

чтобы начался новый таймфрейм 00:00:00, 02:00:00, 04:00:00 и т.д

Вставьте Print(urrent_tick.time) перед тем как взвести таймер. Посмотри какое там число будет.
Mikhail Filimonov
5931
Mikhail Filimonov 2012.03.21 07:42  

Лучше секунды, которые передаются таймеру

Print(" Remain seconds = ", value_time );

 

См. картинку. 

Таймфрейм 3 часа =10800 сек

08:53:30 - не должно быть! (равно как и 19:10:30) Таймер срабатывает самопроизвольно... (Remain seconds = НЕТ!) почему-то.

Мне нужно ТОЧНО "вставать" на начало Тамфрейма(не по тику, который может прийти или нет) 

Для этого и нужен таймер . Не правильная работа таймера рушит всю мою стратегию....

 

Файлы:
Timer_bug1.jpg 150 kb
Rashid Umarov
Админ
11805
Rashid Umarov 2012.03.21 09:26  

Mikalas:

См. картинку. 


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

Mikhail Filimonov
5931
Mikhail Filimonov 2012.04.05 07:41  

Уважаемые разработчики MT5!

 

Кто-нибудь ответит на мой вопрос? 

(Фунция Check time изменена на)

uint CheckTime( const datetime aTime )
  {
//--- Variables
    MqlDateTime  struct_time;
    uint         curr_time, delta_time, value_time; 
    uint         trade_time;
    uint         i, factor; 
    uint         DAY_TIME = 86400; 

//--- Take time frame in seconds
    trade_time = ( PeriodSeconds( PERIOD_CURRENT ) );

    TimeToStruct( aTime, struct_time );

    curr_time = struct_time.hour * 3600 + struct_time.min * 60 + struct_time.sec;

//--- Calc factor   
    factor = DAY_TIME / trade_time;  
    
//--- Set timer for next candle
    for ( i = 0; i < factor; i++ )
    {
      if ( ( curr_time >= trade_time * i ) && ( curr_time <= trade_time * ( i + 1 ) - 1 ) )
      {
        delta_time = i + 1;
        break;
      } 
    }
    value_time = trade_time * delta_time - ( DAY_TIME - ( DAY_TIME - curr_time ) );
   
    if ( value_time <= 0 ) value_time = 1;

    return( value_time );    
  }

Бага

С уважением, Михаил 

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий