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

 
Vasyl Nosal:

Это упорное желание обманываться и обманывать самого себя :) .

Добавлено: А не пробовали отобразить все символы и показать колонку "Время" в окне "Обзор рынка" и обнаружить символ биткоина по которому торги идут без выходных? Также ещё помогает такая элементарная проверка:

1 

 

2 

 

3 

 

Не универсальное решение, но для меня подходит


bool CanTrade()
{

bool res1=IsTradeAllowed(Symbol(), TimeCurrent());
bool res2=IsTradeAllowed(Symbol(), TimeCurrent()+4000); //с запасом,

if (!res1) return false; //сейчас торговать запрещено
if (res1 && res2) return true; //и сейчас и через час торговать можно
return false; //если зависло разрешение от TimeCurrent, то через час (или с запасом в несколько минут) покажет фалсе.
// Но наверняка есть ситуации когда реально сейчас можно торговать а через час нельзя - тогда неправильный ответ :(
}

 
Igor-san:

Но наверняка есть ситуации когда реально сейчас можно торговать а через час нельзя

Конечно, есть - каждый раз за час до закрытия рынка )))
 
Ihor Herasko:
Конечно, есть - каждый раз за час до закрытия рынка )))

Не соглашусь. Последняя дата замершая на экране пятница 21:59. Если я ставлю сдвиг на 3600 сек - то и второй параметр IsTradeAllowed(Symbol(), TimeCurrent()+3600 возвращает труе. Добавил несколько сек запаса чтобы срабатывало. Ну а если будет пятница 21:50, то все должно работать.

Но честно я это не контролировал, у меня просто проверка подключения к брокеру Reconnector (где-то на форуме нашел), который в выходные постоянно переподключался. Так что для меня это не существенно.

 
/// Ждём разрешения торговать
void TradeAllowed()
{
symb=Symbol();/// Текущий символ или символ на котором нужно произвести проверку

if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
   {Print("Automated trading is forbidden at the trade server side");return;}
if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)) 
   {Print("Trading is forbidden!");return;}
if (!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))  
   {Print("Check if automated trading is allowed in the terminal settings!");return;}
if(!IsTradeAllowed(symb,TimeLocal())
   {Print("Trading on the symbol "+symb+" is forbidden!");return;}

while(IsTradeContextBusy())
   {
   if(IsStopped()) {Print("Forced shutdown ");break;}
   Print("Trading is occupied. Wait.");
   Sleep(1000);
   RefreshRates(); 
   }  
}
 

bool MarketOpen(string Symbl)
{
   if(IsTradeAllowed(Symbl,TimeCurrent()+1)==false)return(false); //рынок закрыт

   return(true);

}

 
Renat Akhtyamov:

bool MarketOpen(string Symbl)
{
   if(IsTradeAllowed(Symbl,TimeCurrent()+1)==false)return(false); //рынок закрыт

   return(true);

}

По-разному бывает, поэтому такая проверка ничего не гарантирует.

тобишь, торговля экспертами запрещена, но рынок то открыт.


Вот сейчас, понедельник, рынок открыт, а экспертам запрет от конторы:


 
Напротив, бывает, что в некоторых других конторах в выходные дни, когда рынок закрыт, эти проверки указывают, что рынок открыт и экспертам дано разрешение торговать.
 
Олег avtomat:
Напротив, бывает, что в некоторых других конторах в выходные дни, когда рынок закрыт, эти проверки указывают, что рынок открыт и экспертам дано разрешение торговать.

вчера маялся

пока работает,

а вот это уже нет:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Renat Akhtyamov, 2018.02.11 05:27

СПАСИБО!

Для МТ4

//------------------------------------------------------------------    IsSessionOpen
bool IsSessionOpen(string smb)
{
     //MqlDateTime dt; datetime tc=TimeTradeServer(dt);
      datetime tc= TimeCurrent();
     // проверяем время торгов по инструменту
     datetime t=(datetime)SymbolInfoInteger(smb, SYMBOL_EXPIRATION_TIME);
     if (tc>t && t>0) return(false);
     t=(datetime)SymbolInfoInteger(smb, SYMBOL_START_TIME);
     if (tc<t && t>0) return(false);
     
     // проверяем сессии инструмента
     datetime ds=tc/(60*60*24); ds*=(60*60*24); // начало сегодня
     datetime sec=tc-ds; // число секунд от начала дня
     bool b=false;
     for (int l=0; l<10; l++) // подразумеваем, что админ сделал не более 10 сессий в сутки
     {
             datetime fs, ts;
             if (!SymbolInfoSessionTrade(smb, TimeDayOfWeek(TimeCurrent()), l, fs, ts)) break; // данные сессии
             if (sec>=fs && sec<=ts) return(true);
     }
     return(false);
}



 

чо то в 5-рке не проходит функция:

(интересно, почему ???)

https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/cterminalinfo/cterminalinfoistradeallowed

Документация по MQL5: Стандартная библиотека / Торговые классы / CTerminalInfo / IsTradeAllowed
Документация по MQL5: Стандартная библиотека / Торговые классы / CTerminalInfo / IsTradeAllowed
  • www.mql5.com
Стандартная библиотека / Торговые классы / CTerminalInfo / IsTradeAllowed - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: