Задержка выполнения на 5 минут

 

Доброго времени суток коллеги.


Хочу поинтересоваться, каким способом можно задерживать выполнение функции на 5 минут. Допустим поступил сигнал на выполнение трейда, заявка выставилась, а следующее выставление подобной заявки должно быть через 5 минут, конечно лучше что бы это было как-то привязано пятиминутному таймфрейму.


Пробовал Sleep() но это не то, что нужно.


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

 
nx0x2:

Доброго времени суток коллеги.


Хочу поинтересоваться, каким способом можно задерживать выполнение функции на 5 минут. Допустим поступил сигнал на выполнение трейда, заявка выставилась, а следующее выставление подобной заявки должно быть через 5 минут, конечно лучше что бы это было как-то привязано пятиминутному таймфрейму.


Пробовал Sleep() но это не то, что нужно.


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

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


 в блоке инициализации 

datetime TM = iTime(Symbol(),PERIOD_M5,0) запомнил время открытия текущей 5 минутной свечи

в OnTick()

  if (TM ! = iTime(Symbol(),PERIOD_M5,0) 

    { //если открылась новая 5-ти минутная свеча т.е. прошло примерно 5 минут

Выставил заявку и опять запомнил время текущей 5 минутной свечи

        TM = iTime(Symbol(),PERIOD_M5,0);

    }

 
Vitalii Ananev:

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


 в блоке инициализации 

datetime TM = iTime(Symbol(),PERIOD_M5,0) запомнил время открытия текущей 5 минутной свечи

в OnTick()

  if (TM ! = iTime(Symbol(),PERIOD_M5,0) 

    { //если открылась новая 5-ти минутная свеча т.е. прошло примерно 5 минут

Выставил заявку и опять запомнил время текущей 5 минутной свечи

        TM = iTime(Symbol(),PERIOD_M5,0);

    }


Задумка приблизительно ясна, но iTime()(из mql 4) в mql 5 почему то определяться не хочет:)

 
nx0x2:

Задумка приблизительно ясна, но iTime()(из mql 4) в mql 5 почему то определяться не хочет:)

Вставьте функцию для mql5

datetime iTime(string symb,ENUM_TIMEFRAMES tf,int index) {
datetime Arr[1];
  return((CopyTime(symb,tf,index,1,Arr)==1)?Arr[0]:WRONG_VALUE);
 }
Вообще, наверное лучше брать время последней открытой позиции, и от неё отсчитывать N-минут
 
Vitaly Muzichenko:

Вставьте функцию для mql5

Вообще, наверное лучше брать время последней открытой позиции, и от неё отсчитывать N-минут
ну и обязательно время открытия последней закрывшейся по Хистори.
ибо может ордер прожил менее указанного периода
 

Что-то не пойму, зачем такие проблемы.

Выставили заявку, и запомнили ее время в отдельной переменной. Пока не пройдет определенный срок новые заявки - не выставляем. Прошел определенный срок - выставляем новую заявку, обновляем время выставления... Какие iTime ???

 

В шапке советника объявляете переменную, в которой будет храниться время последней сделки с типом "вход".

В OnTradeTransaction() отлавливаете сделки с типом "вход" и запоминаете время этой сделки в свою переменную.

В OnTick() проверяете время.

//--- в шапке объявляете переменную, в которой храниться последнее время сделки с типом "вход"
datetime       m_last_trade_IN=0;
***
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   double res=0.0;
   int losses=0.0;
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_ticket       =0;
      long     deal_order        =0;
      long     deal_time         =0;
      long     deal_time_msc     =0;
      long     deal_type         =-1;
      long     deal_entry        =-1;
      long     deal_magic        =0;
      long     deal_reason       =-1;
      long     deal_position_id  =0;
      double   deal_volume       =0.0;
      double   deal_price        =0.0;
      double   deal_commission   =0.0;
      double   deal_swap         =0.0;
      double   deal_profit       =0.0;
      string   deal_symbol       ="";
      string   deal_comment      ="";
      string   deal_external_id  ="";
      if(HistoryDealSelect(trans.deal))
        {
         deal_ticket       =HistoryDealGetInteger(trans.deal,DEAL_TICKET);
         deal_order        =HistoryDealGetInteger(trans.deal,DEAL_ORDER);
         deal_time         =HistoryDealGetInteger(trans.deal,DEAL_TIME);
         deal_time_msc     =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC);
         deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_entry        =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_reason       =HistoryDealGetInteger(trans.deal,DEAL_REASON);
         deal_position_id  =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);

         deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);
         deal_price        =HistoryDealGetDouble(trans.deal,DEAL_PRICE);
         deal_commission   =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION);
         deal_swap         =HistoryDealGetDouble(trans.deal,DEAL_SWAP);
         deal_profit       =HistoryDealGetDouble(trans.deal,DEAL_PROFIT);

         deal_symbol       =HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_comment      =HistoryDealGetString(trans.deal,DEAL_COMMENT);
         deal_external_id  =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID);
        }
      else
         return;
      if(deal_reason!=-1)
         DebugBreak();
      if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
            m_last_trade_IN=deal_time;
     }
  }
***
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(TimeCurrent()-60*5<m_last_trade_IN)
      return;
***
  }

ds

 

Воспользуйтесь OnTimer () 

 
nx0x2:


Задумка приблизительно ясна, но iTime()(из mql 4) в mql 5 почему то определяться не хочет:)


В МТ5 нет такой функции, для MT5 надо использовать CopyTime(). Но смысл алгоритма не меняется.

 
George Merts:

Что-то не пойму, зачем такие проблемы.

Выставили заявку, и запомнили ее время в отдельной переменной. Пока не пройдет определенный срок новые заявки - не выставляем. Прошел определенный срок - выставляем новую заявку, обновляем время выставления... Какие iTime ???

А при перезагрузке терминала что будет в этой переменной?
Вы предложите запоминать её во внешних? Ок. Но имхо проще и надёжнее использовать проверку "на лету".
Например - что Вы ответите заказчику, когда он подключится к счету терминалом с другого компьютера, на котором нет значения во внешней переменной? Робот откроет сделку вопреки логике стратегии. Трейдер возможно потеряет деньги. Что Вы ему ответите? Ответите - а не надо было переподключаться? Почему Вы не предусмотрели такое событие?
 
Vladimir Karputov:

В шапке советника объявляете переменную, в которой будет храниться время последней сделки с типом "вход".

В OnTradeTransaction() отлавливаете сделки с типом "вход" и запоминаете время этой сделки в свою переменную.

В OnTick() проверяете время.

ds

Хранить и писать такие вещи в переменную - очень плохая затея, если и писать, тогда её инициализировать не нулём, а LONG_MAX