Как узнать, что по выходным нет торговли?

 

Пытаюсь дать понять советнику, что по выходным дням торговать не нужно :)

Для этого делаю так:

        intTradeMode=(int)SymbolInfoInteger(strSymbol,SYMBOL_TRADE_MODE);
        
        switch(intTradeMode) {
            case SYMBOL_TRADE_MODE_DISABLED:
                strTemp="NO TRADE";
                clrColor=clrRed;
                break;
            case SYMBOL_TRADE_MODE_LONGONLY:
                strTemp="only LONG";
                clrColor=clrRed;
                break;
            case SYMBOL_TRADE_MODE_SHORTONLY:
                strTemp="only SHORT";
                clrColor=clrRed;
                break;
            case SYMBOL_TRADE_MODE_CLOSEONLY:
                strTemp="only CLOSE";
                clrColor=clrRed;
                break;
            case SYMBOL_TRADE_MODE_FULL:
                strTemp="ALL";
                clrColor=clrGreen;
                break;
            default:
                strTemp="N/A !!!";
                clrColor=clrRed;
                break;
        }
        
        ObjectSetInteger(0,strTradeMode_Name,OBJPROP_COLOR,clrColor);
        strTemp="Trade: "+strTemp+"   "+SymbolInfoString(strSymbol,SYMBOL_BANK);
        ObjectSetString(0,strTradeMode_Name,OBJPROP_TEXT,strTemp);

Но всегда, в т.ч. и по выходным дням, получаю "Trade: ALL"

Вроде же по выходным должно быть "SYMBOL_TRADE_MODE_DISABLED", что значит  "Торговля по символу запрещена"

И еще, почему "SymbolInfoString(strSymbol,SYMBOL_BANK)" ничего не возвращает?, должен быть источник котировок.

 
falkov:

Пытаюсь дать понять советнику, что по выходным дням торговать не нужно :)

Для этого делаю так:

...

Но всегда, в т.ч. и по выходным дням, получаю "Trade: ALL"

Вроде же по выходным должно быть "SYMBOL_TRADE_MODE_DISABLED", что значит  "Торговля по символу запрещена"

И еще, почему "SymbolInfoString(strSymbol,SYMBOL_BANK)" ничего не возвращает?, должен быть источник котировок.

То что вы запрашиваете, это запрос "является ли символ торговым или чисто информационный", ответ на этот запрос не зависит от открытия или закрытия рынка.

Проблема с Market closed перекочевала в МТ5 ещё с давних времён, ни в одной версии МТ никогда не было возможности узнать закрыт ли рынок, кроме как через реквот ручного ордера.

Складывается странная ситуация, когда в ответ на выставленный ордер получаем Market closed, но получить эту информацию программно нет возможности даже через фейковый автозапрос. Я поднимал этот вопрос ещё для МТ4, но воз и ныне там.

Может быть сейчас вопрос привлечёт внимание разработчиков.

 
falkov:

Пытаюсь дать понять советнику, что по выходным дням торговать не нужно :)

Для этого делаю так:

        intTradeMode=(int)SymbolInfoInteger(strSymbol,SYMBOL_TRADE_MODE);
        
        switch(intTradeMode) {
            case SYMBOL_TRADE_MODE_DISABLED:
                strTemp="NO TRADE";
                clrColor=clrRed;
                break;
            case SYMBOL_TRADE_MODE_LONGONLY:
                strTemp="only LONG";
                clrColor=clrRed;
                break;
            case SYMBOL_TRADE_MODE_SHORTONLY:
                strTemp="only SHORT";
                clrColor=clrRed;
                break;
            case SYMBOL_TRADE_MODE_CLOSEONLY:
                strTemp="only CLOSE";
                clrColor=clrRed;
                break;
            case SYMBOL_TRADE_MODE_FULL:
                strTemp="ALL";
                clrColor=clrGreen;
                break;
            default:
                strTemp="N/A !!!";
                clrColor=clrRed;
                break;
        }
        
        ObjectSetInteger(0,strTradeMode_Name,OBJPROP_COLOR,clrColor);
        strTemp="Trade: "+strTemp+"   "+SymbolInfoString(strSymbol,SYMBOL_BANK);
        ObjectSetString(0,strTradeMode_Name,OBJPROP_TEXT,strTemp);

Но всегда, в т.ч. и по выходным дням, получаю "Trade: ALL"

Вроде же по выходным должно быть "SYMBOL_TRADE_MODE_DISABLED", что значит  "Торговля по символу запрещена"

И еще, почему "SymbolInfoString(strSymbol,SYMBOL_BANK)" ничего не возвращает?, должен быть источник котировок.

 


возможно вам подойдут эти функции

bool  SymbolInfoSessionQuote(
   string            name,                // имя символа
   ENUM_DAY_OF_WEEK  day_of_week,         // день недели
   uint              session_index,       // номер сессии
   datetime&         from,                // время начала сессии
   datetime&         to                   // время окончания сессии
   );
bool  SymbolInfoSessionTrade(
   string            name,                // имя символа
   ENUM_DAY_OF_WEEK  day_of_week,         // день недели
   uint              session_index,       // номер сессии
   datetime&         from,                // время начала сессии
   datetime&         to                   // время окончания сессии
   );


 
sergey1294:

возможно вам подойдут эти функции


К ним бы ещё добавить функцию "расписание праздников" и будет полный комплект.

Но всё равно, лучше иметь функцию получения флага "Market closed" чем писать целые библиотеки, для того чтоб получить значение типа bool.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип bool
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип bool - Документация по MQL5
 

Спасибо!

Я сделал так: завел таймер на 20 секунд и сделал счетчик. В ОнТаймер инкрементирую его, а в ОнТик сбрасываю в ноль.

В ОнТаймере смотрю, если этот счетчик больше 3, (т.е. прошла уже минута, а тиков нет, т.к. он не сбрасывается), то цвет лэйбла, где вывожу время последнего тика, делаю красным

    void Draw_LastBarTime() {
        datetime adtmTime[1];
        
        CopyTime(strSymbol,enumTF,0,1,adtmTime);
        ObjectCreate(0,strLastBar_Name,OBJ_LABEL,0,0,0);
        ObjectSetInteger(0,strLastBar_Name,OBJPROP_CORNER,CORNER_LEFT_LOWER);
        ObjectSetInteger(0,strLastBar_Name,OBJPROP_XDISTANCE,intLastBar_X);
        ObjectSetInteger(0,strLastBar_Name,OBJPROP_YDISTANCE,intLastBar_Y);
        
        if(_intTimerCount<3) {ObjectSetInteger(0,strLastBar_Name,OBJPROP_COLOR,_clrForTimes);}
        else {ObjectSetInteger(0,strLastBar_Name,OBJPROP_COLOR,clrMaroon);}

        
        ObjectSetString(0,strLastBar_Name,OBJPROP_FONT,"Times New Roman");
        ObjectSetInteger(0,strLastBar_Name,OBJPROP_FONTSIZE,8);
        ObjectSetString(0,strLastBar_Name,OBJPROP_TEXT,"Last Bar: "+TimeToString(adtmTime[0]));
    }
Наверное, такой вариант для меня даже лучше - я вижу, что тики не идут, значит, или перерыв связи или нет торговли.
 
Вот мой вариант проверки:
//+------------------------------------------------------------------+
//|   Открыт ли рынок для торговли                                   |
//+------------------------------------------------------------------+
bool MarketOpened()
  {
   datetime from,to;
   MqlDateTime mqltime;
   TimeToStruct(TimeTradeServer(),mqltime);
   return(SymbolInfoSessionTrade(_Symbol,(ENUM_DAY_OF_WEEK)mqltime.day_of_week,0,from,to));
  }

 
Мой вариант - торговля по новому бару. Нет баров - нет торговли. А без контроля баров интересно - надо подумать.
 
avoitenko:
Вот мой вариант проверки:

Хитёр чертяка, а в пятницу после закрытия работает? или в воскресенье после открытия?

Время ведь не у всех ДЦ имеет смещение как у MQ.

ЗЫ опятьже проверялась ли функция для работы в тестере?

 
Хитёр чертяка, а в пятницу после закрытия работает? или в воскресенье после открытия?

MarketOpened() - Эта функция у меня в эксперте на чемпионате 2011 применялась, так что вероятность что она работает и в тестере тоже очень большая.


 
-Alexey-:
Мой вариант - торговля по новому бару. Нет баров - нет торговли. А без контроля баров интересно - надо подумать.

Фактически я так и сделал, с тем отличием, что если Вы работаете на H1, то Вам придется ждать в худшем случае час, чтобы понять, что новых баров нету.

Я же проверяю время последней котировки и если их нет в течение минуты (естественно, это время можно изменять с дискретностью секунда), то здесь что-то не так! :)


Согласен с Urain:

Складывается странная ситуация, когда в ответ на выставленный ордер получаем Market closed, но получить эту информацию программно нет возможности

 
avoitenko:
Вот мой вариант проверки:

Интересно, а учитывает ли MarketOpened() разные национальные праздники, а не только субб и воскр?
Причина обращения: