Доброго времени суток коллеги.
Хочу поинтересоваться, каким способом можно задерживать выполнение функции на 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);
}
Примерно так можно. Но время "задержки" будет не точно 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 почему то определяться не хочет:)
Задумка приблизительно ясна, но 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-минут
Вставьте функцию для mql5
Вообще, наверное лучше брать время последней открытой позиции, и от неё отсчитывать N-минутибо может ордер прожил менее указанного периода
В шапке советника объявляете переменную, в которой будет храниться время последней сделки с типом "вход".
В 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 ()
Задумка приблизительно ясна, но iTime()(из mql 4) в mql 5 почему то определяться не хочет:)
В МТ5 нет такой функции, для MT5 надо использовать CopyTime(). Но смысл алгоритма не меняется.
Что-то не пойму, зачем такие проблемы.
Выставили заявку, и запомнили ее время в отдельной переменной. Пока не пройдет определенный срок новые заявки - не выставляем. Прошел определенный срок - выставляем новую заявку, обновляем время выставления... Какие iTime ???
Вы предложите запоминать её во внешних? Ок. Но имхо проще и надёжнее использовать проверку "на лету".
Например - что Вы ответите заказчику, когда он подключится к счету терминалом с другого компьютера, на котором нет значения во внешней переменной? Робот откроет сделку вопреки логике стратегии. Трейдер возможно потеряет деньги. Что Вы ему ответите? Ответите - а не надо было переподключаться? Почему Вы не предусмотрели такое событие?
В шапке советника объявляете переменную, в которой будет храниться время последней сделки с типом "вход".
В OnTradeTransaction() отлавливаете сделки с типом "вход" и запоминаете время этой сделки в свою переменную.
В OnTick() проверяете время.
ds
Хранить и писать такие вещи в переменную - очень плохая затея, если и писать, тогда её инициализировать не нулём, а LONG_MAX
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Доброго времени суток коллеги.
Хочу поинтересоваться, каким способом можно задерживать выполнение функции на 5 минут. Допустим поступил сигнал на выполнение трейда, заявка выставилась, а следующее выставление подобной заявки должно быть через 5 минут, конечно лучше что бы это было как-то привязано пятиминутному таймфрейму.
Пробовал Sleep() но это не то, что нужно.
Заранее спасибо.