Торговая сессия & Котировочная сессия. Вопросы остаются...

 

А собственно поиск начался с того, что все ниже перечисленные проверки, в воскресенье  (и по золоту в понедельник с 00:00 по 01:00)  разрешили советнику торговать

string symbolF = _Symbol;

ENUM_SYMBOL_TRADE_MODE SyTrMode = ENUM_SYMBOL_TRADE_MODE(SymbolInfoInteger(symbolF, SYMBOL_TRADE_MODE) );

Comment(
   "\n     SymbolInfoInteger(SYMBOL_TRADE_MODE)= ", EnumToString(SyTrMode), "   ", symbolF,
   "\n     TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)= ", TerminalInfoInteger(TERMINAL_TRADE_ALLOWED),
   "\n     MQLInfoInteger(MQL_TRADE_ALLOWED)= ", MQLInfoInteger(MQL_TRADE_ALLOWED),
   "\n     TerminalInfoInteger(TERMINAL_CONNECTED)= ", TerminalInfoInteger(TERMINAL_CONNECTED),
   "\n     AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)= ", AccountInfoInteger(ACCOUNT_TRADE_ALLOWED),
   "\n     AccountInfoInteger(ACCOUNT_TRADE_EXPERT)= ", AccountInfoInteger(ACCOUNT_TRADE_EXPERT)
   );

 

Мне кажется, что для выяснения можно ли советнику сейчас торговать достаточно узнать время Торговой Сессии.

А зачем вообще нужно знать время Котировочной Сессии если советник не может открыть или закрыть ордер в это время?

Вот пример по XAUUSD (золото "Альпы") , котировочная сессия начинается с 00:00, а торговая с 01:00.

 

 

В следующие выходные (и по золоту с 00:00 по 01:00) посмотрю возвраты давний ф-ций mql4, может они прояснят ситуацию без обращения к сессиям..

 

   "\n     IsExpertEnabled()= ", IsExpertEnabled(),
   "\n     IsTradeAllowed()= ", IsTradeAllowed(),
   "\n     IsTradeAllowed(symbolF, TimeLocal() )= ", IsTradeAllowed(symbolF, TimeLocal() ),
   "\n     IsTradeAllowed(symbolF, TimeCurrent() )= ", IsTradeAllowed(symbolF, TimeCurrent() ),
   "\n     IsTradeContextBusy()= ", IsTradeContextBusy(),
   "\n     MarketInfo(symbolF, MODE_TRADEALLOWED)= ", MarketInfo(symbolF, MODE_TRADEALLOWED),
 

А пока сделал вот такую ф-цию выяснения по сессии - можно торговать или нет.

Функция возвращает ДАТУ (чего нет просто в SymbolInfoSessionTrade) и время начала и окончания сессии. 

 Обращается раз в минуту, для экономии ресурсов. В принципе должна подходить и к тестеру стратегий MONDAY он всегда MONDAY.

void OnTick()
  {
//---
   datetime From, To; 
   
   string symbolF = _Symbol;

   bool Trade_Session = dz_SymbolInfoSessionTrade(symbolF, From, To);
   
   Print("Trade_Session= ", Trade_Session, "   From= ", TimeToString(From, TIME_DATE|TIME_SECONDS), "   To= ", TimeToString(To, TIME_DATE|TIME_SECONDS) );
   
   if(From == 0 || To == 0)
   {
      Sleep(500);
      
      Trade_Session = dz_SymbolInfoSessionTrade(symbolF, From, To);
      
      Print("!!  Repeat Trade_Session= ", Trade_Session, "   From= ", TimeToString(From, TIME_DATE|TIME_SECONDS), "   To= ", TimeToString(To, TIME_DATE|TIME_SECONDS) );
   }
   
  }
//+------------------------------------------------------------------+


bool dz_SymbolInfoSessionTrade(string symbolF, datetime &fromF, datetime &toF)
{
   int session_indexF=0;
   
   datetime vr_fromF, vr_toF;
   
   static datetime IST_iTimeM1, mem_fromF, mem_toF;
   
   static bool mem_resF, firstOk;

   
   if(IST_iTimeM1 != iTime(symbolF, PERIOD_M1, 0) )
   {
      IST_iTimeM1 = iTime(symbolF, PERIOD_M1, 0);
   
      firstOk = false;
      
      ENUM_DAY_OF_WEEK day_of_weekF = ENUM_DAY_OF_WEEK(DayOfWeek() );
      
      //day_of_weekF = 5; // >>>>> >>>>>
      
      while(SymbolInfoSessionTrade(symbolF, day_of_weekF, session_indexF, vr_fromF, vr_toF) && !IsStopped() )
      {
         firstOk = true;
         
         datetime timeDifferenceF = vr_toF - vr_fromF;
         
         fromF = StringToTime(TimeToString(TimeCurrent(), TIME_DATE) + " " + TimeToString(vr_fromF, TIME_SECONDS) );
         
         toF = fromF + timeDifferenceF;
         
         mem_fromF = fromF; 
         mem_toF = toF;
         
         Print(EnumToString(day_of_weekF),"   session= ", session_indexF, "   fromF= ", TimeToString(fromF, TIME_DATE|TIME_SECONDS), "   toF= ", TimeToString(toF, TIME_DATE|TIME_SECONDS) );

         if(TimeCurrent() >= fromF && TimeCurrent() < toF) 
         {
            mem_resF = true;
            break;
         }
         
         if(TimeCurrent() < fromF) 
         {
            mem_resF = false;
            break;
         }
         
         session_indexF++;
      } // while(!IsStopped() )
   } //if(IST_iTimeM1
   
   if(firstOk)
   {
      fromF = mem_fromF; 
      toF = mem_toF;
   }else
   {
      fromF = 0; 
      toF = 0;
      
      mem_resF = false;
   }
   
   return(mem_resF);
}
 

Эти ф-ции вне торговой сессии возвращают    false  или  0  для MarkeInfo

IsTradeAllowed(symbolF, TimeCurrent() )

MarketInfo(symbolF, MODE_TRADEALLOWED)

 

Интересно, а какой аналог этих ф-ций есть в MQL5?  Или там только по сессиям можно понять можно торговать или нет. 

 

Есть такой символ как BRENT-SEP16

 

Так в этом символе  ф-ция SymbolInfoSessionTrade

возвращает с первого взгляда перепутанные местами "from" и "to"  пример

 session_indexF= 0   fromF=  03:05:00   toF=  00:55:00

и этот момент я учел в новой версии своей ф-ции.

------------------------------------- 

 И еще один интересный момент, как понятно из времени торговой сессии с 00:00  понедельника и до 00:55 можно торговать, и действительно в это время ручками я открыл и удалил ордер без проблем.

А в это время ф-ции     IsTradeAllowed(symbolF, TimeCurrent() )   и    MarketInfo(symbolF, MODE_TRADEALLOWED

возвращают FALSE !!!  Так, что сессии имеют приоритет.

Пример

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! SymbolInfoInteger(SYMBOL_TRADE_MODE)= SYMBOL_TRADE_MODE_FULL   BRENT-SEP16

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)= 1

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! MQLInfoInteger(MQL_TRADE_ALLOWED)= 1

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! TerminalInfoInteger(TERMINAL_CONNECTED)= 1

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)= 1

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! AccountInfoInteger(ACCOUNT_TRADE_EXPERT)= 1

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! dz_SymbolInfoSessionTrade= true

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! MarketInfo(symbolF, MODE_TRADEALLOWED)= 0.0

0 00:17:09.985 0_session05 BRENT-SEP16,H4: !! IsTradeAllowed(symbolF, TimeCurrent() )= false

0 00:17:09.985 0_session05 BRENT-SEP16,H4: session_indexF= 0   fromF= 2016.07.19 03:05:00   toF= 2016.07.19 00:55:00

 

 Как видно моя ф-ция   dz_SymbolInfoSessionTrade  вернула TRUE.

 
bool dz_SymbolInfoSessionTrade(string symbolF, bool oneF)
{
   int session_indexF=0;
   
   datetime vr_toF=0, vr_fromF=0, fromF=0, toF=0, TimeCurrentDay=0;
   
   bool resF=false, logOn = true;
   
   ENUM_DAY_OF_WEEK day_of_weekF = ENUM_DAY_OF_WEEK(DayOfWeek() );
   
   static int IST_hour = -1;
   
   
   while(SymbolInfoSessionTrade(symbolF, day_of_weekF, session_indexF, vr_fromF, vr_toF) && !IsStopped() )
   {
      TimeCurrentDay = StringToTime(TimeToString(TimeCurrent(), TIME_DATE) );
   
      fromF = TimeCurrentDay + vr_fromF;
      
      toF = TimeCurrentDay + vr_toF;


      //--------
      if(IST_hour != Hour() || oneF)
      {
         Print("session_indexF= ", session_indexF, "   fromF= ", fromF, "   toF= ", toF);         
      }
      
      
      if(fromF < toF)
      {
         if(TimeCurrent() >= fromF && TimeCurrent() < toF) 
         {
            resF = true;
            //Print("fromF < toF");
            break;
         }         
      }else
      {
         if(TimeCurrent() < toF || TimeCurrent() >= fromF)
         {
            resF = true;
            //Print(" ! toF < fromF");
            break;         
         }
      }

      session_indexF++;
   } // while(!IsStopped() )


   //--------
   if( (IST_hour != Hour() || oneF) && (fromF == 0 || toF == 0) )
   {
      Print("!!! session_indexF= ", session_indexF, "   fromF= ", fromF, "   toF= ", toF);         
   }

   
   IST_hour = Hour();
   
   return(resF);
}
 

Как я подозреваю, остался один неучтенный момент - это пятница, время с 00:00 до 00:55,  в это время   dz_SymbolInfoSessionTrade  вернет FALSE,

надо еще подумать.... 

 

Очень полезная тема! Вам тут не одиноко? )

 

Dmytro Zelenskyy:

Есть такой символ как BRENT-SEP16

 

Так в этом символе  ф-ция SymbolInfoSessionTrade

возвращает с первого взгляда перепутанные местами "from" и "to"  пример

 session_indexF= 0   fromF=  03:05:00   toF=  00:55:00

Почему решили, что перепутаны?

Торговля разрешена с 03:05:00 до 23:59:59 и с 00:00:00 до 00:55:00

 
Dmytro Zelenskyy:

Интересно, а какой аналог этих ф-ций есть в MQL5?  Или там только по сессиям можно понять можно торговать или нет. 

Сюда заглядывали?

https://www.mql5.com/ru/docs/runtime/tradepermission 

Документация по MQL5: Программы MQL5 / Разрешение на торговлю
Документация по MQL5: Программы MQL5 / Разрешение на торговлю
  • www.mql5.com
Программы MQL5 / Разрешение на торговлю - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Andrey Khatimlianskii:

Очень полезная тема! Вам тут не одиноко? )

 

Почему решили, что перепутаны?

Торговля разрешена с 03:05:00 до 23:59:59 и с 00:00:00 до 00:55:00

Уже не один.. и поэтому не одиноко )))

 

Да, все именно так, я выше написал только с "первого взгляда",  и эту ситуацию надо обрабатывать по другому, что я и сделал.

Но осталась нерешенной Пятница. В пятницу, с  00:00:00 до 00:55:00  ф-ция  запретит торговать хотя реально будет можно, потому что вернется всего одна сессия с временем

с 03:05 до 23:05.

Здесь надо еще учитывать Четверг который заползает на пятницу..... 

 

А, кстати, интересный вопрос. Как можно задавать сессии для конкретного дня, залезая на другой день? Если бы они были одинаковыми на все 7 дней — то да. А иначе появляется неоднозначность.

Мне, например, по приведенному скриншоту не понятно, можно ли торговать в пятницу с 00:00 до 00:55, т.к. для нее указан совершенно конкретный интервал 03:05-23:05.

Хотелось бы комментариев разработчиков. 

 

Получается, нужна возможность указывать несколько интервалов для каждого дня или сложная функция парсинга торговых сессий с учетом перехода через дни.

Причина обращения: