Как правильно выяснить, что рынок закрыт? (mql4) - страница 2

 
Alexey:

int Weekday = TimeDayOfWeek(TimeLocal());                                                          //Локальное время  |
int Weekdays = TimeDayOfWeek(TimeCurrent());                                                       //Серверное время  |

while(IsExpertEnabled())                                                                 //До тех пор пока запушенно  |

     {
     if(Weekday!=0||Weekday!=6){Exp=true;if(Weekday==1){Info(4,Weekday,0);}}       //Если не Сбб. Воск. то разрешено  |
     if(Weekdays==0||Weekdays==6)                                                  //Если Сбб. Воск. то не разрешено  |
       {
       Exp=false;Info(5,Weekdays,0);
       if(Weekdays==6){Sleep(86400000);}                                                //Если суббота пауза 24 часа  |
       if(Weekdays==0){Sleep(3600000);}                                               //Если воскресение пауза 1 час  |
       }

Я примерно, так решил, через паузы и циклы, но это старый код, до обновления версии терминала. Сейчас есть более простые способы, нужно просто, немного почитать литературу.
Спасибо конечно, но это как говорится лезть к глазу через одно место) Я тоже могу влепить отложку на евро на цене 5.0 сервер позволит это делать, а потом при каждом цикле таймера пытаться изменить отложку, если ошибка 132 то рынок закрыт, если норм то торговля есть, но в торговое время это флуд сервера, хотелось бы решение проблемы по человечески, а не через "коромысло", а это уже к разработчикам МК.
 

IsTradeAllowed

Возвращает информацию о возможности торговли при помощи экспертов.

bool  IsTradeAllowed();

Вторая форма вызова возвращает информацию о возможности торговли для заданного символа в указанное время.

bool  IsTradeAllowed(
  const string symbol       // символ
  datetime     tested_time  // время
   );

Параметры

symbol

[in]  Символ.

tested_time

[in]  Время.

Возвращаемое значение

Возвращает true, если эксперту разрешено торговать и поток для выполнения торговых операций свободен, иначе возвращает false.

 
if(SymbolInfoInteger(NULL,SYMBOL_TIME)>60) return(0);
 
Kino:
Спасибо конечно, но это как говорится лезть к глазу через одно место) Я тоже могу влепить отложку на евро на цене 5.0 сервер позволит это делать, а потом при каждом цикле таймера пытаться изменить отложку, если ошибка 132 то рынок закрыт, если норм то торговля есть, но в торговое время это флуд сервера, хотелось бы решение проблемы по человечески, а не через "коромысло", а это уже к разработчикам МК.
Запрос на разрешение торговли нужен. У меня в примере этого запроса нет, потому что разница по времени с закрытием рынка в три часа, а 3 часа перед закрытием, проходят в основном во флете. По этому я там сделал, как то по другому но тоже, с паузами но гораздо меньшего промежутка.
 
offfline:

IsTradeAllowed

Возвращает информацию о возможности торговли при помощи экспертов.

bool  IsTradeAllowed();

Вторая форма вызова возвращает информацию о возможности торговли для заданного символа в указанное время.

bool  IsTradeAllowed(
  const string symbol       // символ
  datetime     tested_time  // время
   );

Параметры

symbol

[in]  Символ.

tested_time

[in]  Время.

Возвращаемое значение

Возвращает true, если эксперту разрешено торговать и поток для выполнения торговых операций свободен, иначе возвращает false.

Александр, вы ошибаетесь)


//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
  if (IsTradeAllowed() == True) Print("---- Ура торгуем -----");
   {
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
      {
         if (ticket <0) Print("---- Уже не торгуем -----",GetLastError());
      }
   }

  }
//+------------------------------------------------------------------+
 

вот такой вариант работает совсем не плохо

//+------------------------------------------------------------------+
//|                                                         тест.mq4 |
//|                                                   Sergey Gritcay |
//|                                               sergey1294@list.ru |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritcay"
#property link      "sergey1294@list.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   if(isNewTime())
     {
      Print("---- Ура торгуем -----");
      int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,0,0,"My order",16384,0,clrGreen);
        {
         if(ticket<0) Print("---- Уже не торгуем -----",GetLastError());
        }
     }
     else Print("---- функция isNewTime() = false, возможно торговля закрыта ");

  }
//+------------------------------------------------------------------+
bool isNewTime()
  {
//--- в статической переменной будем помнить время 
   static datetime last_time=0;
//--- текущее время
   datetime time=TimeCurrent();

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем 
      last_time=time;
      return(false);
     }

//--- если время отличается
   if(last_time!=time)
     {
      //--- запомним время и вернем true
      last_time=time;
      return(true);
     }
//--- дошли до этого места - значит время сервера не обновилось, вернем false
   return(false);
  }
 
sergey1294:

вот такой вариант работает совсем не плохо

Спасибо, попробую.
 
Kino:
Спасибо за наводку на путь истинный, но когда рынок открыт пытаться определить возможность работы с ордерами это как то всеравно не корректно, но работать будет.

Со своей стороны рассуждаю следующим образом.

Если необходимо торговать на текущем символе, то косвенным признаком того, что рынок открыт, является приход новых тиков. Таким образом, достаточно события OnTick и вопрос закрыт.

Если же необходимо работать с символами, отличными от текущего, то факт открытия торгов по текущему символу не гарантирует нам того, что торги идут по какому-то другому символу. Например, советник запущен на EURUSD, время 09:00 UTC, а торговать нужно в том числе и акциями компаний США, рынок которых откроется только в 13:00 UTC. То есть OnTick не поможет. Потребуется определять факт открытия рынка по другим символам именно путем попыток отсылки приказов на сервер с некоторым интервалом. Отсылка приказа один раз в минуту - это ни в коем случае не бомбежка сервера, а вполне нормальный подход. Что тут некорректного?

 

нет тиков нет торговли как мне когда то ответили в сервисдеск по этой проблеме определения дня недели,

предложено ими решение как

TimeDayOfWeek(TimeLocal());

 хотя оно конечно не совсем верно, ведь день недели может отличаться от терминального.

 
В одном из недавних проектов как раз стояла задача определить факт того, что торговля по произвольному инструменту открыта и доступна.
Важным условием было - не пытаться открывать ордера, хотя в прочих проектах неоднократно прибегал к такому. И, честно говоря, мне кажется, что пока это самый простой и надёжный метод.

Итак пока лучшим вариантом у меня получилось сделать так (но я всё ещё в поиске, см. ниже):
1) Определяем, разрешена ли торговля "в лоб" - вторая форма функции IsTradeAllowed() (выше про неё говорилось). Если нет, то и суда нет :)
2) Сравниваем время последней котировки по символу SymbolInfoInteger(<symbol>, SYMBOL_TIME) с временем одной из торговых сессий (SymbolInfoSessionTrade()), если время котировки попадает в диапазон одной из сессий - считаем, что торговать можно.
3) Проверяем, чтобы время котировки не было слишком "устаревшим": если оно было более xx минут назад (сравниваем SymbolInfoInteger(<symbol>, SYMBOL_TIME) и TimeCurrent()), то считаем, что котировка устаревшая, а следовательно торговать по ней не выйдет (если не ошибась, у нас шла речь о трёх минутах).

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

Справедливости ради следует отметить, что при реальной торговле с таким не сталкивался. Так что в "обычных" условиях решение видится сносным. Но я всё же пока скорее в поиске :)

P.S. шаги 1 и 2 видится возможным объединить (в функцию IsTradeAllowed передавать SymbolInfoInteger(<symbol>, SYMBOL_TIME)), но тестов такого варианта пока не проводил и утверждать не буду.

SymbolInfoSessionTrade - Документация на MQL4
  • docs.mql4.com
SymbolInfoSessionTrade - Документация на MQL4
Причина обращения: